From b2b75d069acaee9ab667833eba18986a1dd41a2a Mon Sep 17 00:00:00 2001 From: Huandao0812 Date: Tue, 23 May 2017 16:53:16 -0700 Subject: [PATCH 1/5] remove R dependencies --- core/pom.xml | 8 +- ddf-test/pom.xml | 8 +- examples/pom.xml | 8 +- hdfs/pom.xml | 8 +- project/RootBuild.scala | 8 +- s3/pom.xml | 8 +- .../lib/net/rforge/REngine-2.1.1.compiled.jar | Bin 39014 -> 0 bytes .../lib/net/rforge/Rserve-1.8.2.compiled.jar | Bin 37784 -> 0 bytes spark/pom.xml | 18 +- spark/rlibs/Rserve/DESCRIPTION | 24 - spark/rlibs/Rserve/INDEX | 2 - spark/rlibs/Rserve/LICENSE | 316 ------- spark/rlibs/Rserve/Meta/Rd.rds | Bin 402 -> 0 bytes spark/rlibs/Rserve/Meta/hsearch.rds | Bin 428 -> 0 bytes spark/rlibs/Rserve/Meta/links.rds | Bin 160 -> 0 bytes spark/rlibs/Rserve/Meta/nsInfo.rds | Bin 313 -> 0 bytes spark/rlibs/Rserve/Meta/package.rds | Bin 966 -> 0 bytes spark/rlibs/Rserve/NAMESPACE | 2 - spark/rlibs/Rserve/NEWS | 870 ------------------ spark/rlibs/Rserve/R/Rserve | 27 - spark/rlibs/Rserve/R/Rserve.rdb | Bin 3275 -> 0 bytes spark/rlibs/Rserve/R/Rserve.rdx | Bin 320 -> 0 bytes spark/rlibs/Rserve/help/AnIndex | 6 - spark/rlibs/Rserve/help/Rserve.rdb | Bin 9406 -> 0 bytes spark/rlibs/Rserve/help/Rserve.rdx | Bin 196 -> 0 bytes spark/rlibs/Rserve/help/aliases.rds | Bin 135 -> 0 bytes spark/rlibs/Rserve/help/paths.rds | Bin 128 -> 0 bytes spark/rlibs/Rserve/html/00Index.html | 36 - spark/rlibs/Rserve/html/R.css | 57 -- spark/rlibs/Rserve/libs/Rserve | Bin 117456 -> 0 bytes spark/rlibs/Rserve/libs/Rserve.dbg | Bin 138884 -> 0 bytes .../libs/Rserve.so.dSYM/Contents/Info.plist | 20 - .../ddf/spark/content/KryoRegistrator.scala | 4 - .../io/ddf/spark/content/RDDRow2REXP.scala | 102 -- .../ddf/spark/content/REXP2ArrayObject.scala | 97 -- .../spark/content/RepresentationHandler.scala | 4 - .../ddf/spark/etl/TransformationHandler.scala | 823 +++++++---------- .../spark/etl/TransformationHandlerTest.java | 12 +- .../content/RepresentationHandlerSuite.scala | 16 - 39 files changed, 363 insertions(+), 2121 deletions(-) delete mode 100644 spark/lib/net/rforge/REngine-2.1.1.compiled.jar delete mode 100644 spark/lib/net/rforge/Rserve-1.8.2.compiled.jar delete mode 100644 spark/rlibs/Rserve/DESCRIPTION delete mode 100644 spark/rlibs/Rserve/INDEX delete mode 100644 spark/rlibs/Rserve/LICENSE delete mode 100644 spark/rlibs/Rserve/Meta/Rd.rds delete mode 100644 spark/rlibs/Rserve/Meta/hsearch.rds delete mode 100644 spark/rlibs/Rserve/Meta/links.rds delete mode 100644 spark/rlibs/Rserve/Meta/nsInfo.rds delete mode 100644 spark/rlibs/Rserve/Meta/package.rds delete mode 100644 spark/rlibs/Rserve/NAMESPACE delete mode 100644 spark/rlibs/Rserve/NEWS delete mode 100644 spark/rlibs/Rserve/R/Rserve delete mode 100644 spark/rlibs/Rserve/R/Rserve.rdb delete mode 100644 spark/rlibs/Rserve/R/Rserve.rdx delete mode 100644 spark/rlibs/Rserve/help/AnIndex delete mode 100644 spark/rlibs/Rserve/help/Rserve.rdb delete mode 100644 spark/rlibs/Rserve/help/Rserve.rdx delete mode 100644 spark/rlibs/Rserve/help/aliases.rds delete mode 100644 spark/rlibs/Rserve/help/paths.rds delete mode 100644 spark/rlibs/Rserve/html/00Index.html delete mode 100644 spark/rlibs/Rserve/html/R.css delete mode 100755 spark/rlibs/Rserve/libs/Rserve delete mode 100755 spark/rlibs/Rserve/libs/Rserve.dbg delete mode 100644 spark/rlibs/Rserve/libs/Rserve.so.dSYM/Contents/Info.plist delete mode 100644 spark/src/main/scala/io/ddf/spark/content/RDDRow2REXP.scala delete mode 100644 spark/src/main/scala/io/ddf/spark/content/REXP2ArrayObject.scala diff --git a/core/pom.xml b/core/pom.xml index b1e24aea..146f45f3 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -350,12 +350,6 @@ - - typesafereleases - typesafe-releases - http://repo.typesafe.com/typesafe/releases/ - default - AdataoMvnreposSnapshots Adatao Mvnrepos Snapshots @@ -387,4 +381,4 @@ default - \ No newline at end of file + diff --git a/ddf-test/pom.xml b/ddf-test/pom.xml index b92499ae..e7563d20 100644 --- a/ddf-test/pom.xml +++ b/ddf-test/pom.xml @@ -314,12 +314,6 @@ - - typesafereleases - typesafe-releases - http://repo.typesafe.com/typesafe/releases/ - default - AdataoMvnreposSnapshots Adatao Mvnrepos Snapshots @@ -351,4 +345,4 @@ default - \ No newline at end of file + diff --git a/examples/pom.xml b/examples/pom.xml index 6d7db45b..d54ae995 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -315,12 +315,6 @@ - - typesafereleases - typesafe-releases - http://repo.typesafe.com/typesafe/releases/ - default - AdataoMvnreposSnapshots Adatao Mvnrepos Snapshots @@ -352,4 +346,4 @@ default - \ No newline at end of file + diff --git a/hdfs/pom.xml b/hdfs/pom.xml index 4fabac64..ca6dcae7 100644 --- a/hdfs/pom.xml +++ b/hdfs/pom.xml @@ -342,12 +342,6 @@ - - typesafereleases - typesafe-releases - http://repo.typesafe.com/typesafe/releases/ - default - AdataoMvnreposSnapshots Adatao Mvnrepos Snapshots @@ -379,4 +373,4 @@ default - \ No newline at end of file + diff --git a/project/RootBuild.scala b/project/RootBuild.scala index 2d45b05b..2a0b662e 100644 --- a/project/RootBuild.scala +++ b/project/RootBuild.scala @@ -79,12 +79,6 @@ object RootBuild extends Build { val excludeEverthing = ExclusionRule(organization = "*", name = "*") val excludeEverythingHackForMakePom = ExclusionRule(organization = "_MAKE_POM_EXCLUDE_ALL_", name = "_MAKE_POM_EXCLUDE_ALL_") - // We define this explicitly rather than via unmanagedJars, so that make-pom will generate it in pom.xml as well - // org % package % version - val rforge = Seq( - "net.rforge" % "REngine" % "2.1.1.compiled", - "net.rforge" % "Rserve" % "1.8.2.compiled" - ) val scalaArtifacts = Seq("jline", "scala-compiler", "scala-library", "scala-reflect") val scalaDependencies = scalaArtifacts.map( artifactId => "org.scala-lang" % artifactId % theScalaVersion) @@ -165,7 +159,7 @@ object RootBuild extends Build { List("sh", "-c", "touch spark/" + targetDir + "/*timestamp") }, testOptions in Test += Tests.Argument("-oI"), - libraryDependencies ++= rforge, + libraryDependencies ++= spark_dependencies, if (isLocal) { initialCommands in console := diff --git a/s3/pom.xml b/s3/pom.xml index 8043de21..df0c1c07 100644 --- a/s3/pom.xml +++ b/s3/pom.xml @@ -339,12 +339,6 @@ - - typesafereleases - typesafe-releases - http://repo.typesafe.com/typesafe/releases/ - default - AdataoMvnreposSnapshots Adatao Mvnrepos Snapshots @@ -376,4 +370,4 @@ default - \ No newline at end of file + diff --git a/spark/lib/net/rforge/REngine-2.1.1.compiled.jar b/spark/lib/net/rforge/REngine-2.1.1.compiled.jar deleted file mode 100644 index 2bfb8048abb0d142be948135a9a86ba0aacf7ed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39014 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 z%0D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 1.7 - - net.rforge - REngine - 2.1.1.compiled - - - net.rforge - Rserve - 1.8.2.compiled - com.databricks spark-csv_2.10 @@ -471,12 +461,6 @@ - - typesafereleases - typesafe-releases - http://repo.typesafe.com/typesafe/releases/ - default - AdataoMvnreposSnapshots Adatao Mvnrepos Snapshots @@ -508,4 +492,4 @@ default - \ No newline at end of file + diff --git a/spark/rlibs/Rserve/DESCRIPTION b/spark/rlibs/Rserve/DESCRIPTION deleted file mode 100644 index 88b90332..00000000 --- a/spark/rlibs/Rserve/DESCRIPTION +++ /dev/null @@ -1,24 +0,0 @@ -Package: Rserve -Version: 1.7-3 -Title: Binary R server -Author: Simon Urbanek -Maintainer: Simon Urbanek -Depends: R (>= 1.5.0) -Suggests: RSclient -SystemRequirements: libR, GNU make -Description: Rserve acts as a socket server (TCP/IP or local sockets) - which allows binary requests to be sent to R. Every - connection has a separate workspace and working - directory. Client-side implementations are available - for popular languages such as C/C++ and Java, allowing - any application to use facilities of R without the need of - linking to R code. Rserve supports remote connection, - user authentication and file transfer. A simple R client - is included in this package as well. -License: GPL-2 | file LICENSE -URL: http://www.rforge.net/Rserve/ -NeedsCompilation: yes -Repository: CRAN -Date/Publication: 2013-08-21 23:35:21 -Built: R 3.0.2; x86_64-apple-darwin10.8.0; 2014-01-09 23:11:06 UTC; unix -Archs: Rserve.so.dSYM diff --git a/spark/rlibs/Rserve/INDEX b/spark/rlibs/Rserve/INDEX deleted file mode 100644 index 1a2adbcc..00000000 --- a/spark/rlibs/Rserve/INDEX +++ /dev/null @@ -1,2 +0,0 @@ -Rserve Server providing R functionality to - applications via TCP/IP diff --git a/spark/rlibs/Rserve/LICENSE b/spark/rlibs/Rserve/LICENSE deleted file mode 100644 index 21fa0a1a..00000000 --- a/spark/rlibs/Rserve/LICENSE +++ /dev/null @@ -1,316 +0,0 @@ - [Summary: GPL-2 with OpenSSL linking exception] - - Rserve - Copyright (C) 2002-2013 Simon Urbanek - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - - In addition, as a special exception, the copyright holders give - permission to link the code of portions of this program with the - OpenSSL project's "OpenSSL" library (or with modified versions of - it that use the same license as the "OpenSSL" library - see - http://www.openssl.org/), and distribute linked combinations - including the two. - - You must obey the GNU General Public License in all respects - for all of the code used other than OpenSSL. If you modify - file(s) with this exception, you may extend this exception to your - version of the file(s), but you are not obligated to do so. If you - do not wish to do so, delete this exception statement from your - version. If you delete this exception statement from all source - files in the program, then also delete it here. - - -Full text of GPL-2 follows: - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS diff --git a/spark/rlibs/Rserve/Meta/Rd.rds b/spark/rlibs/Rserve/Meta/Rd.rds deleted file mode 100644 index ea54f5e2b293e72ce3275b0e37ce27092815f520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4*tiwFP!000001C3KrPr@(|t}t{Ei6;Dkdp2?Y216h*MuQs=xT~?GzNDuG3RZ)iOzQulH3Y zk}XE};Dx5VaO!dF`OeR4y?vxdA{W+(LBGyp`%C67P*5tlWH}RaNTH|%F-!`~nOTF8 zfXk9If*qz|$uLZZle>orNCjLH%%KwO1GFS>)M$V4O=hq%uped9_m0Epj2W-T=-E01dAcrx+?g^{JH;bm`(o!MjO;yUSkut`cqj#-Wjzh?BVDhg w%5{TGSIJcp2=(3n`Lx?+v-xVWCLC+ssIix0gOfrzz6gE)0AZsiv4H~s09)k32LJ#7 diff --git a/spark/rlibs/Rserve/Meta/hsearch.rds b/spark/rlibs/Rserve/Meta/hsearch.rds deleted file mode 100644 index bb116d77695351f53ae160d60f6a8b9baec9cda8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmV;d0aN}TiwFP!000001Eo_eMVvk_yvd$2?5gBIB?C#Qi5!kqCwO)t$T#pw667>v}0K#W528` zM-@1(z{$c3)@`9X-OvPcwWDXGg-!7aku2xtfM7wa0#gY_UmM&Eh`^i>{^>x z7Wm|2fjw#E$EiZ@q?_|&>f3D4?YPxO?WG;^>9qbPYX7Kp`%7!~*SeN(FUDrI8e|KE WSY4qrqlL`8dU|?WkUVNU$-mFmM8C89hCHAPOo@Eh?Y?z`_Jn!U$E$nwOZHS`1_$`fYKU^?4zqBYBrj`dRoS&Z*oSK({q7*3Rn_66)n4St0 O`Ue1>RMS3(0RRB_JUsOP diff --git a/spark/rlibs/Rserve/Meta/nsInfo.rds b/spark/rlibs/Rserve/Meta/nsInfo.rds deleted file mode 100644 index 195386d62f4a0f348dc63cad2fa5262665a9e060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmV-90ml9xiwFP!0000018q^kZi6rk4bZJ>S+`33M=$$?X-BFFF1t;kxLu@>R7pVV z&u>def>em0+5giwky?P+G7h5qE)O*FRG{)kp+V`3#i4B)bz1bRN4l%Vee zrVf0Wz?%2s2P;wKgKZ!uH8u)N#fzy=Sb{-=LRJ!G%aAup*o}IG4As;q+*g z&gGvdma+W(QCAO8@m>)ICB80)&$y0bNJW*3OS64W4t=k);q?t6a@LV3<)UTausF(c* LZyX}y83O`o_NgFhEg2IF6 z8nQF&TR_XS&6y%KQi^L}zkS7?vMZy(=}Lrv8^wbr9%@T1?h#^F0Ah+07i`4(lTkB2Ol0&dlq2)cmRxfxjV zt@0Bkf2UCzNHx3sa>&;qJimMc&EQqgcwy&i;V|NiiqzWQayAZ6;C=rVVzRIt%C$8k zAW^D;;6G>?Eof?4!1GaOQ11>vD&R6A+%D@EaIg>NZ#iet90=!fsbRdXcFTPy(t9W6UNDyQwyCUi9{wDCrE~fSw?15gU(F;8anmP@o^sTX9S+C zDQ)5su>z7LoJDyA!za@erX*sVr3@X(DIWfkrE{4f-8lt8=>%u31I~n@kqd#`Co}-7 zz0Q(EDwIpnSR(z6Fees^kra>&or=^YU^1ODP9ar9=qXhJT!GGYFadIHESzazBI4Nu z^I@3!94AoT1@bq{mz49sR>}A82R*+9f398kx}BT;@W!q^o2O}VUav2g%Rr%+Ga3k* z*4HfRc2i|VwH;PF;Z@&`k6Mjp+i#rtttPbE=j~VLt)^YN3ZWe|g4P9mJUhKRed!yS zsXrkKetP>Rdo3*hdUiMn@&rmx9EYgy(Iy?%rTc z*qOglrBOx)8L^bRwZ~Vev~(SO@C#vBR!ltf^xid1sF*mKwP7}!nR2)Gcf*xVX&hn` zV6B>(bSqz7QynRmq?^EdJr+@+UFgbf*t5eYeJmf{k#T}WyoERjX(BZe~@9;zTWABRl8OS-H8oQQ7qutfsBCe@IMUG zRYJE^tL%h8H^qta<(p3kYsQb(+L~<2E}Qa~Xjb6kPNQn-+~pt>S5ZZ=ZCd|-COHFd z$AP!CR@%G^q&6SIBDPcr{_o^Ifqzic+q?^y+C!(`3_D?WFzSBj7rW8WSS upgrade is now supported - - o mkdist -i installs the built package, use -c for check - - o Windows compatibility has been restored thanks to - David Champagne from Revolution Analytics - - -1.7-2 2013-08-12 - o when uid/gid is changed, create a new tempdir() and set its - permissions as well as the wokring directory's owner to match. - - o bugfix: if the first command is not any of the eval family - the Rserve may respond with an additional, spurious error - response - - o deamonized server would record incorrect pid when pid.file - is used (i#5). The pid is now removed on clean sutdown. - - o added support for keep.alive configuration option - it is - global to all servers and if enabled the client sockets are - instructed to keep the connection alive by periodic messages. - - -1.7-1 2013-07-02 - o remove a spurious character that prevented compilation on Suns - - o add OPENSSL_INCLUDES precious variable that can be used to - point to non-standard location of OpenSSL headers - - o check the usability of OpenSSL headers before enabling TLS - support - - o added the choice of GPLv2 or GPLv2 with OpenSSL linking exception - - -1.7-0 - - *** ---- HEADLINE NEWS ---- - *** new protocols: HTTP, HTTPS, WebSockets and TLS/QAP - *** added protocol switching (from QAP to TLS/QAP) via CMD_switch - *** The R client was moved to RSclient package - *** New in-session server support with run.Rserve() - *** Out-of-band messages via self.oobSend() - *** user-based uid/gid switch, MD5/SHA1 stored passwords - *** preliminary IPv6 support; RSA secure authentication - *** .Rserve.done global env hook for optiopnal cleanup - *** auth.function setting to allow custom authentication - *** Object-capability mode for hardened, secure services - *** ---- END - see below for details ---- - - o This is the first release in the new 1.x Rserve series. Many - of the Rserve internals have been re-written or cleaned - up. The original protocol remains the same (so all clients - that worked with Rserve 0.6 will continue to work), but the - suite of available protocols has been extended (see below). - - o added support for multiple protocols in Rserve: - - ** QAP ** - this is the original Rserve protocol used in Rserve 0.x - series. It works over TCP/IP and unix sockets. It is - enabled by default and can be disabled using - "qap disable" configuration directive. - - ** HTTP ** - this is very similar to the built-in R http server except that - on unix it forks on connection so it allows parallel separate, - persistent connections. It requires a worker function - .http.request to be defined in the session which will handle - incoming requests. This allows the use of facilities like - FastRWeb without an external webserver. This protocol is - disabled by default and can be enabled by setting "http.port" - configuration directive to the desired port to listen to. - (Also see TLS support below for https server). - - The http.raw.body configuration option (default is false which - results in the same behavior as Rhttpd) can be used to force - passing body in raw form to the handler (useful for the - FastRWeb handler which does its own parsing). - - ** WebSockets ** - this protocol is used by HTML5 web browsers for direct access - to R with a persistent connection. This allows implementation - of websites that have a dedicated R session (and could be used - as an R console). There are two subprotocols supported by - Rserve: - - -- WebSocket(*, "QAP") -- - this is a tunnel for the original QAP protocol through - WebSockets. It requires a browser capable of binary - WebSockets protocol (version 01 or higher). It allows very - efficient data transfer, typically by loading ArrayBuffers - directly into GPU or CPU. - It is disabled by default and can be enabled using - "websockets.qap enable" configuration directive. - (If no subprotocol is specified, QAP is assumed) - - -- WebSocket(*, "text") -- - this is a very simplistic protocol using plain text frames - to send input to R and output from R directly as text. It - acts essentially as an R console. This protocol works with - any WebSockets implementation including version hybi-00 and - hixie-75/76 - It is disabled by default and can be enabled using - "websockets.text enable" configuration directive. - - NOTE: The textual WebSockets protocol does NOT provide any - authentication mechanism, so use with extreme care as you - are essentially giving any user with a web browser access to - R and thus to the shell. - - In addition to enabling each or both subprotocols, the port on - which the WebSockets server should listen must be specified in - the configuration using "websockets.port" directive, for - example "websockets.port 8080". Alternatively, the HTTP server - can be enabled to allow connection upgrade to WebSockets on - the same port with "http.upgrade.websockets enable" - - NOTE: remember that the default in Rserve is to disallow - remote connections, so you may need to use "remote enable" in - order to use WebSockets or HTTP in practice, since the point - is to serve remote machines. Typically, if both QAP and either - HTTP or WebSockets are used, it is recommended to use QAP on a - local unix socket for better access control. - - o Rserve now supports SSL/TLS connections on QAP, HTTP and WS - protocols. The TLS key/CA entries are common for all - protocols. The relevant new configuration directives are: - - tls.key - tls.cert - tls.ca - - SSL/TLS can be used in several ways: with separate port for - TLS connections or by switching protocol form a regular QAP - connection using CMD_switch with "TLS" as argument. The latter - can be enabled using - - switch.qap.tls enable - - Enabled switching is advertized by Rserve with the presence - of a "TLS" entry in the ID string. Keys and other TLS entries - must be initialized in order for TLS to be enabled. - - Dedicated TLS servers can be enabled by specifying the port - for the corresponding protocol: - - qap.tls.port - for Rserve/QAP - http.tls.port - for HTTPS - websockets.tls.port - for WebSockets - - (there are synonyms "https.port" for "http.tls.port" and - "tls.port" for "qap.tls.port", however, the *.tls.port - versions are preferred for clarity) - - The use of TLS protocols is encouraged where sensitive data - is transmitted or when requiring secure authentication. For - QAP protocol, using TCL/QAP with SHA1 passwords (also new, see - below) is the currently recommended way where authorization is - required. The only drawback is increased CPU utilization - during transfers casued by the encryption and the fact that - TLS-enabled clients must be used. See also RSA secure - authentication (CMD_keyReq + CMD_secLogin) for a different - method if only the authentication step is to be encrypted. - - When enabling TLS tls.key and tls.cert are mandatory, tls.ca - is optional to establish CA chain of trust (whether this is - needed depends on the client and the certificate). To generate - a key and self-signed certificate, you can use something like - - openssl genrsa -out server.key 2048 - openssl req -new -key server.key -out server.csr - openssl x509 -req -days 365 -in server.csr \ - -signkey server.key -out server.crt - - NOTE: TLS services are started **in addition** to any other - servers, i.e., if you want to enable TLS/QAP only, you have to - set tls.qap.port but also add "qap disable" to disable the - plain Rserve access. - - o QAP servers (classic Rserve QAP, QAP/TLS and WebSocket/QAP) - support object-capability (OC) mode in which all Rserve - commands are disabled except for CMD_OCcall. All messages - including the initial handshake are always QAP and the initial - message defines capabilities (here opaque references to - closures) that can be called. This mode can be enabled using - - qap.oc enable ## for Rserve QAP and QAP/TLS - websockets.qap.oc enable ## for WebSockets/QAP - - In this mode the configuration *must* define a function - oc.init (typically using eval or source configuration - directives) which has to supply OC references that can be used - in calls. If the evaluation of oc.init() fails, the connection - is closed immediately. The use of invalid OC references or any - other commands other than CMD_OCcall results in immediate - connection termination. This allows creation of hardened, - secure services that can disallow arbitrary code execution. - - NOTE: this mode is inherenty incompatible with all classic - Rserve clients. The first four bytes of the initial packet are - "RsOC" instead of "Rsrv" - - o Rserve can now be started from within an existing R session - using run.Rserve() command. This allows the user to prepare a - session "by hand", run Rserve from within that session and go - back to the session (by shutting down the server or sending an - interrupt). This allows the use of Rserve even without the - presence of libR. - - o Rserve now supports out-of-band (OOB) messages. Those can be - sent using the self.oobSend() [one-way] and self.oobMessage() - [roundtrip] functions from within code that is evaluated in - Rserve child instances. OOB messages are not used by Rserve - itself but offer asynchronous notification to clients that - support it (one typical use are WS-QAP1 tunnels to web - browsers that allow status updates as R code is evaluated). - - o Rserve accepts additional command line arguments: - --RS-source (same as "source " in cfg file) - --RS-enable-remote (same as "remote enable" in cfg file) - --RS-enable-control (same as "control enable" in cfg file) - - o The Rserve package no longer includes the R client. It has - been moved to a separate package "RSclient" so that it can be - used on machines separate from the server. - - o There was a bug in QAP storage estimation affecting pairlists, - possibly resulting in buffer overflows. This should be fixed - and an error message will be printed when such overflows are - detected in the future (which hopefully won't happen). - - o Bugfix: command line parsing would skip over some arguments - - o Passwords file can contain MD5 or SHA1 hash of a password - instead of the plaintext password for non-crypt - authentication. In that case the hash must be lowercase hex - representation with preceding $ sign, so for example user - "foo" with password "bar" would have an entry - foo $62cdb7020ff920e5aa642c3d4066950dd1f01f4d - You can use - echo -n 'password' | openssl sha1 - to obtain the SHA1 hash of a password (openssl md5 for MD5 - hash - MD5 is probably more common but less secure than - SHA1). This feature makes sure that passwords are not stored - in plain text and thus are safe from local attacks. - - o Rserve now has the ability to change uid/gid according to the - user that has been authenticated. The following settings - concern this feature (unix-only): - - auto.uid {enable|disable} [disable] - auto.gid {enable}disable} [disable] - default.uid [none] - default.gid [none] - - The auto.uid/gid directives enable setuid/setgid based on - user's uid/gid. In case no uid/gid is specified with the - username, the default.uid/gid settings will be used. If there - is no uid/gid in the username and no defaults are specified, - the user's authentication will fail. User's uid/gid can be - specified in the passwords file by appending /uid,gid to the - username. If gid is not specified, uid will be used for both - uid and gid. So for example user "foo" (from the above MD5 - example) with uid=501 would have an entry on the passwords - file: - - foo/501 $37b51d194a7513e45b56f6524f2d51f2 - - For this to work, Rserve must be started as root. However, - with auto.uid enabled it is safe to do so since Rserve will - prevent any R access until authenticated. You should, however, - use a client capable of secure RSA authentication or use secure - connection such as QAP/TLS as to not send password in - cleartext over the wire. - - o Rserve can now be run in a mode where each connection has a - different uid and/or gid such that separate client instances - are isolated. This allows more restricted setup in cases where - instances may not be trusted and need to be sandboxed. The - following configuration directives are associated with this - functionality: - - random.uid {enable|disable} [disable] - random.gui {enable|disable} [disable] - random.uid.range {..} [32768..65540] - - If random.uid is enabled and random.gid disable then only the - uid of the process is changed. If both are enabled then the - gid is set to match the value of the uid. random.gid cannot be - enabled without random.uid. - - To support sandboxing, the permissions on the working - directory can be specified using - - workdir.mode - - o If any kind of client-process uid switching is enabled in the - configuration, the permissions on the working directory will - match the uid of the process. Also the working directories are - now named by the process ID to facilitate cleanup. - - o Rserve now supports secure authentication even outside of - SSL/TLS. There are two new commands that can be used by the - client: - - CMD_keyReq - requests an authentication key from the server - that will be used to perform a secure - login. The kind of the requested key is - specified as a parameter. Currently, only - "rsa-authkey" is supported which returns server - authentication key (authkey) and a RSA public - key which must be used to encode the authkey - and the authentication information (see below). - The RSA key can be compared on the client side - to ensure the authenticity of the server. - - CMD_secLogin - secure login. It consists of an encrypted data - stream that will authenticate the user. In the - case of the "rsa-authkey" method, the stream - consists of the authkey and the login + - password, all of which must be encrypted using - server's RSA key. - - The RSA key on the server (Rserve) side is specified using - - rsa.key - - configuration file directive. The file is expected to be in - PEM format. You can generate such file, e.g., with: - - openssl genrsa -out server.key 4096 - - where 4096 is the key size in bits. A public key can be - extracted from the private key using - - openssl rsa -pubout -in server.key -out server_pub.key - - The clients can pre-share the public key by other means to - compare it to the key received from the server as to verify - its authenticity. This will prevent them from sending the - authentication information to rogue servers. - - NOTE: if the rsa.key directive is missing, Rserve will - generate a key on the fly when asked for RSA authentication - - although this allows encrypted transmission and thus is safe - from sniffing, it is not safe from man-in-the-middle attacks - where a rogue server intercepts the request and sends its own - public key. Therefore the use of the rsa.key directive is - highly recommended. - - The RSA authentication enables the client to a) check the - authenticity of the server (by comparing the RSA public key) - and b) send authentication information encrypted. This method - is highly recommended in cases where a full TLS/SSL encryption - of the entire connection would be too expensive (i.e. in cases - where the data is large and the security of the transported - data is not crucial). - - o Rserve has a preliminary IPv6 support. Rserve must be - installed with --enable-ipv6 configure flag to enable it in - the Rserve build. In order to start all servers on IPv6 add - - ipv6 enable - - to the configuration file. The option is global, i.e. once - enabled it applies to all servers that support it. Note that - not all features work with IPv6 yet - detaching sessions - (they will use IPv4 for re-attach) and remote client filtering - only work with IPv4 at this point. - - o Rserve now binds only to the loopback interface in - "remote disable" mode. This is safer and prevents remote DoS - attacks. Previously, Rserve would bind on all interfaces and - check the peer IP address. If desired, you can replicate the - old behavior by adding - - remote enable - allow 127.0.0.1 - - to the configuration (if you don't know the difference then - you don't need this -- if you actually need this, then you - probably want to add more "allow" entries for the machine's - other interfaces as well). - - o If a function .Rserve.done() is defined in the global - environment, it will be run after a clean connection - shutdown. This allows custom code to be run when a client - connection is closed. - - o If a function .Rserve.served() is defined in the global - environment of the server, it will be run after a client - connection has been served. For forked servers this is just - after the fork(), for co-operative servers this is after the - client conenction has been closed. It is guaranteed that no - other client is served before the call so it can be used to - manage resources that are unsafe to share with forked - processes (e.g. sockets etc.). - - o The server and client process can be tagged with extra - information in argv[0] so it is possible to distinguish the - server and children. This behavior can be enabled using - - tag.argv enable - - Note, however, that this not always possible and it will have - impact on programs that use argv[0] such as killall. - - o Added configuration option pid.file and command-line option - --RS-pidfile which instructs Rserve to write its process id - (pid) into that file at startup. - - o Added configuration directives http.user, https.user and - websockets.user which take a username and perform - setuid/setgid/initgroups immediately after forking. - This minimizes the amount of code that is run with - elevated privileges in cases where user switching is desired. - - o Added configuration directive - - daemon disable - - which can be used to prevent Rserve from daemonizing. It has - effect only in builds of Rserve that support daemonization. - Note that -DNODAEMON build flag disables daemonization - entirely and can be used in any Rserve version. - - o All commands based on eval now also accept DT_SEXP in addition - to DT_STRING. In such case the parse step is skipped and the - expression is evaluated directly. The intended use of this - functionality is to evaluate language constructs and thus - allow calls with both reference and inlined arguments. - - o QAP decoding is slightly more efficient and avoids protection - cascades. QAP_decode() has now only one argument and it is - guaranteed to not increase the protection stack when returning - (which implies that it is the responsibility of the caller to - protect the result if needed). - - o Both QAP encoding and decoding now use native copy operations - on little-endian machines which can increase the speed - considerably when the compiler cannot do this optimization - on its own (most commoly used compilers don't). - - o Assigning logical NAs now uses the proper NA_LOGICAL value - that is also recognized by R. (PR#276) - - o Forked child processes will now close all server sockets so - that any server can be restarted without closing existing - children. - - o Signal handling has been streamlined: the server process - captures HUP, TERM and INT which will lead to clean - shutdown. Child processes restore signal handlers back to R so - that regular R signal handling rules apply. Note that - interrupt during eval will result in RESP_ERR with code 127 - even if try() is used. - - ---- In order to support new ideas a major re-organization of Rserve --- ---- has been started - almost 10 years after the first release. --- ---- It is time to look ahead again with a new major version. The --- ---- protocol will remain compatible so 1.x series can be used to --- ---- replace the previous 0.x series --- - - -0.6-8 2012-02-20 - o added RSserverEval() and RSserverSource() control commands - in the R client as well as ctrl parameter to RSshutdown(). - - o added new facility that allows R scripts running in Rserve to - issue control commands if allowed. This feature must be - enabled in the Rserve configuration file using - - r-control enable - - This will make self.ctrlEval() and self.ctrlSource() functions - available to code that is running within the Rserve - instance. It is also possible to use this feature without - explicitly loading the Rserve package via - .Call("Rserve_ctrlEval", paste(text, collapse='\n')) - .Call("Rserve_ctrlSource", as.character(file)) - although this may change in the future. - -0.6-7 2012-01-17 - o fix processing of login information - **IMPORTANT**: this fixes a serious security hole in the - remote login mechanism! If you rely on authentication, - please make sure you update your Rserve immediately! - (Thanks to Daniel Faber for reporting) - - o add a namespace to make R 2.14+ happy - - o work around broken readBin() in R 2.14.0 that errors - on unsigned integers (affects R client only) - -0.6-6 2011-12-10 - o fix a bug that can cause heap corruption due to incorrect - addressing in padding of symbols. Unless extremely long symbol - names are used it is unlikely to have a real effect in - practice, but in theory it could be used to zero targetted - parts of the heap. Thanks to Ralph Heinkel for reporting. - - o fix Rserve() call on Windows with quote=FALSE and more than - one argument. - - o clarify that sisocks.h is under LGPL 2.1 as well as the other - headers used by clients. - - o add support for plain S4 objects (S4SEXP) in assignments - (Note: derived S4 objects - those using other native SEXP type - as a base - cannot be supported properly, becasue there is no - way to distinguish them from S3 objects!) - - o Unsupported types in CMD_assign will no longer crash R. - The resulting object is always NULL and an error is printed on - the R side. - - -0.6-5 2011-06-21 - o use new install.libs.R custom installation script in R 2.13.1 - to install binaries - - o install clients by default on Windows as well - - o multi-arch binaries are no longer installed with the arch suffix - in the package root. The canonical place is libs$(R_ARCH) instead. - For now Rserve.exe/Rserve_d.exe are still installed in the root - but they will be also removed in the future as they are not - multi-arch safe. - - -0.6-4 2011-05-19 - o make all buffers capable of using 64-bit sizes. This means - that clients can use more that 4Gb of data on 64-bit platforms - when communicating with Rserve, provided the buffer limits are - either disabled or configured to be high enough. Note that this - does not change the limitations in R with respect to vector - lengths so you still can only use up to 2^31-1 elements. - - o bug fix: contrary to the documentation scalar logicals were sent - in the old XT_BOOL format instead of XT_ARRAY_BOOL - - o work around several issues introduced in R 2.13.0 for Windows - - Rserve() now also allows arguments to be passed to system() for - more fine-grained control of the environment, mostly to work - around bugs and incompatible changes to system() on Windows - in R 2.13.0 (commonly used options are invisible=FALSE to get - back to a more reasonable pre-2.13.0 behavior and wait=TRUE if - using R 2.13.0 that has broken wait=FALSE support). - - o In Rserve() startup wrapper, args are now quoted automatically - if quote=TRUE is set. For backward compatilility args are not - quoted by default if they consist of just one string. - - -0.6-3 2011-01-17 - o bug fix: the child process could get stuck in the server loop - after some abnormal return from the child connection code - Thanks to David Richardson for reporting. - - o set R_ARCH automatically on Windows if a multi-arch R is - detected (such as CRAN binaries since R 2.12.0) - - o add R_ARCH support in Rserve() on Windows to locate the - proper binary - - o bug fix: C++ client did not handle new-style lists (introduced - in Rserve 0.5) properly. Thanks to Carl Martin Grewe for - reporting. - - -0.6-2 2010-09-02 - o add support for NAs in character vectors by using a special - "\xff" string. Any string beginning with '\xff' is - prepended by additional '\xff' to remove ambiuguity and clients - should remove leading '\xff' accordingly. - (Note that UTF-8 encoded strings never contain '\xff' so - in most uses it never occurs). - - The Java client has been updated accordingly and represents - NA strings with null. - - o add a new config file option "interactive" that allows to run - Rserve in interactive or non-interactive mode across platforms. - Previously Windows ran in non-interactive mode and unix in - interactive mode. Non-interactive mode is useful if you want - to prevent R from soliciting user input, but it requires error - option to be set if you don't want to quit R on all errors - (i.e., something like options(error=function() NULL) will do) - - Note: on unix the interactivity flag can only be set *after* R - initialization (due to limitation in R) so you still may have - to pass flags like --no-save in order to appease R. - - o more Windows fixes - Rserve uses R's own initialization in - recent R versions. This also fixes issues with Win64 and more - recent toolchains. - Note that both Widnows and unix now behave consistently with - respect to interactive mode - the default is now interactive - for both platforms but can be changed in the config file. - - -0.6-1 2010-05-24 - o add a safety margin to the send buffer to avoid crashes when - size estimates are off (e.g., due to re-coding) - - o added a very primitive PHP client - - o Win64 fixes by Brian Ripley - - o added new configuration options: - su {now|server|client} - switches user either immediately - as the config file is loaded ("now", default and always the - behavior of Rserve before 0.6-1), when the server is ready - ("server") or when a client is spawned ("client"). The - latter is useful to restrict clients from sending signals - to the server process. - - uid, gid config options are interpreted accordingly to - the su value. - - cachepwd - {no|yes|indefinitely} - allows Rserve to cache - the password file. "no" = read it at each authorization - (default and behavior before 0.6-1), "yes" = read it when - a client is spawned before su, "indefinitely" = read it - just after the config file (most efficient but changes - are only active after re-start). "yes" has only effect - in unix and can be used to restrict permissions on the - password file such that client code has no access to it - (do does "indefinitely" but can be used anywhere). - - -0.6-0 2009-10-27 - o added support for control commands CMD_ctrlEval, - CMD_ctrlSource and CMD_ctrlShutdown. Those commands provide - control over the server process. The side-efect of eval and - source are then available to all future connections. - - Control commands are only available if they are enabled, e.g., - with the config file entry "control enable". In addition if - authorization is required or the passwords file is set only - designated users will have control access (see next point). - - Note that enabling control commands will make Rserve use at - least one file descriptor per active child process, so you may - want to adjust the maximum number of file descriptor in your - system if you expect hundreds of concurrent clients. - - o The passwords file format has been enhanced to give - finer-granularity control over the user authorization. - - Only users with "@" prefix can issue control commands. The - prefix is not part of the user name for authentication - purposes. - - In addition, if the password file contains an entry - starting with "*" it will be interpreted as blank - authorization, i.e. any username/pwd will authenticate. This - may be useful in conjunction with control prefix, e.g., the - following file would give blank authorization to all users but - only the user "joe" will be able to use control commands: - - @joe foobar - * - - o Windows build cleanup (thanks to Brian Ripley) - - o fixed decoding of XT_RAW (it advanced too far), this affected - the use of XT_RAW as non-last element only (thanks to Saptarshi - Guha for reporting) - - o don't advertize ARuc if not supported (this bug only affected - systems without crypt support with plaintext enabled and - required authorization) - - o add assign support for logical vectors - - -0.5-3 2009-01-25 - o fix SET_VECTOR_ELT/SET_STRING_ELT mismatches - - o set object flag when decoding objects that have - a "class" attribute (fixes issues with S3 objects that - were passed from the client to the server). - - o set S4 bit for pure S4 objects (S4SEXP). No other S4 - objects are supported because there is no way to tell - that an assembled object is really an S4 object - - o added string encoding support (where R supports it) - The string encoding can be set in the configuration file - (directive "encoding"), on the command line with --RS-encoding - or within a session by the client command CMD_setEncoding. - - This means that strings are converted to the given encoding - before being sent to the client and also all strings from the - client are assumed to come from the given encoding. - (Previously the strings were always passed as-is with no - conversion). The currently supported encodings are "native" - (same as the server session locale), "utf8" and "latin1". The - server default is currently "native" for compatibility with - previous versions (but may change to "utf8" in the future, so - explicit use of encoding in the config file is advised). - - If a server is used mainly by Java clients, it is advisable to - set the server encoding to "utf8" since that it the only - encoding supported by Java clients. - - For efficieny it is still advisable to run Rserve in the same - locale as the majority of clients to minimize the necessary - conversions. With diverse clients UTF-8 is the most versatile - encoding for the server to run in while it can still serve - latin1 clients as well. - - -0.5-2 2008-10-17 - o fix a bug in CMD_readFile and CMD_setBufferSize that - resulted in invalid buffer sizes (one of the ways to - trigger the bug was to attempt to read a small number of - bytes with readFile). Thanks to H. Rehauer for reporting. - - o ignore attributes if they are not in a LISTSXP - there seem - to be other uses of the ATTRIB entry in conjunction with - character hashes in recent R versions. (BR #76) - - o adapt C++ client to changes in 0.5 (at least to the point - where the demo1 code works) - - o add support for XT_VECTOR_EXP in assignments - - o improve protection for vectors - - o report "remote" setting in --RS-settings - - o updates in the REngine Java client, added documentation - - -0.5-1 2008-07-22 - o fix build issue with R 2.7.x on Windows - - o mergefat now works properly and uses cp if there is no lipo - (this fixes multi-arch issues on Mac OS X and makes sure that - Rserve/Rserve.dbg are installed even on non-Mac systems) - - -0.5-0 2008-07-21 - o added CMD_serEval and CMD_serAssign which are highly efficient - when talking to R clients as they don't need any intermediate - buffer. The corresponding R client functions RSeval and - RSassign have been re-written to use this new API. - - o deprecate scalar types in the protocol - - o add more efficient storage for dotted-pair lists - and symbol names - - o add support for complex numbers - - o new Java client: REngine - it is more flexible than JRclient and it can be used with - other Java/R engines such as JRI. Also it has a much more - clean API and better exeption handling. - - allow NaNs to be passed in raw form to R, i.e. double - NAs can be created using - Double.longBitsToDouble(0x7ff00000000007a2L) - (nice methods for this should follow) - - o C++ client was moved to src/client/cxx - -JRclient: - o change the representation of lists to generic - named vectors (class RList) - - o change the ways attributes are accessed - - -0.4-7 2007-01-14 - o relax DLL versions checking on Windows - - o added more sophisticated implementation of RSassign - in R client to support larger data. Nevertheless, due to - limitations in R, objects must be serializable to - less than 8MB to be assignable via RSassign. - - o added more robust error handling in the R client - - o fixed compilation on systems with custom include dir - (such as Debian) - - o JRclient is now part of the Rserve package. - See clients.txt for details. - It is not compiled by default (but installed when - --with-client is specified), because we cannot assume the - existence of a Java compiler. - - -0.4-6 2006-11-30 - o fixed bug in RSeval when handling large objects - - o minor fix in RSassign - - o add an endianness hack for Windows in case config.h is not - included properly - - -0.4-5 2006-11-29 - o added --with-server option (by default enabled). When disabled, - the server itself is not built. When enabled, R must provide R - shared library, i.e. it must have been compiled with - --enable-R-shlib. - - o added --with-client option (by default disabled). When - enabled, the C/C++ client is built and installed in the - package. It will be copied in the "client" directory of the - package and contains all files necessary for building a - client application. - - This option has no effect on the R client which is always - built and installed. - - o Windows version of Rserve now builds and installs both debug - (Rserve_d.exe) and regular (Rserve.exe) version of Rserve. In - addition, the Rserve function can now be used to launch Rserve - even on Windows. - - o endianness detection now prefers information from the compiler - macros thus allowing cross-compilation. Use -D_BIG_ENDIAN_ or - -D_LITTLE_ENDIAN_ to override it if necessary. - - o allows universal build on Mac OS X - - o adapt to R_ParseVector interface change in R-devel - - -0.4-4 2006-11-15 - o first release on CRAN - - o added support for RAW type (both in and out) - - o added rudimentary client support (thanks to David Reiss for - his contributions) and documentation - - -Previous major releases: - -0.4 2005-08-31 - * added support for sessions - -0.3 2003-10-07 - * new format for boolean arrays - last version: 0.3-18 (2005-08-28) - -0.2 2003-08-21 - * support for large objects - -0.1 2002-07-06 - * first release diff --git a/spark/rlibs/Rserve/R/Rserve b/spark/rlibs/Rserve/R/Rserve deleted file mode 100644 index 3b65e3cb..00000000 --- a/spark/rlibs/Rserve/R/Rserve +++ /dev/null @@ -1,27 +0,0 @@ -# File share/R/nspackloader.R -# Part of the R package, http://www.R-project.org -# -# Copyright (C) 1995-2012 The R Core Team -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# A copy of the GNU General Public License is available at -# http://www.r-project.org/Licenses/ - -local({ - info <- loadingNamespaceInfo() - pkg <- info$pkgname - ns <- .getNamespace(as.name(pkg)) - if (is.null(ns)) - stop("cannot find namespace environment for ", pkg, domain = NA); - dbbase <- file.path(info$libname, pkg, "R", pkg) - lazyLoad(dbbase, ns, filter = function(n) n != ".__NAMESPACE__.") -}) diff --git a/spark/rlibs/Rserve/R/Rserve.rdb b/spark/rlibs/Rserve/R/Rserve.rdb deleted file mode 100644 index 9a5da39525b547fd927333854fad799371a1f9a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3275 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 EQ(l9H3;+NC diff --git a/spark/rlibs/Rserve/help/Rserve.rdx b/spark/rlibs/Rserve/help/Rserve.rdx deleted file mode 100644 index f61382f6879a2c9ab3a6692136cfb2945ebc9c53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 zcmV;#06YI5iwFP!000001B>8dU|?WkUtNH8O4241i{1EU;}IUT|0zsA78 zA%);e@-r}SuV-Lj0kRnw8CV!Nfi!DgVs2_NkRbpz3@R8@oLW={8o18$bZ$4j7+rE0C{<;ER6%^5r3JVEm6}En8|{nU$3x3eO0IXAH5GfeY*d yFve;UXIWxVW@1tf&}T4Dq^6}7rRF6gM3VD!3yM;Ui&IlTh5`UeQE(Gw0RRB)M@WqT diff --git a/spark/rlibs/Rserve/help/aliases.rds b/spark/rlibs/Rserve/help/aliases.rds deleted file mode 100644 index 2cbad003202c785e3102492ce24aabc85990a8ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmb2|=3oE==I#ec2?+^F32aGfX#&9v9vcid7!)vNUR&_!$|56;_SGv){P}ezaET^r z`knPu?mBzm5KD^jp`NqeXMA8BgFTA;Rba(+-? e<~+HUZi90ZYaVw67hh^%V`S)INc8#vv={(Yc`xMv diff --git a/spark/rlibs/Rserve/html/00Index.html b/spark/rlibs/Rserve/html/00Index.html deleted file mode 100644 index 914696c1..00000000 --- a/spark/rlibs/Rserve/html/00Index.html +++ /dev/null @@ -1,36 +0,0 @@ - -R: Binary R server - - - -

Binary R server - -

-
-
-[Up] -[Top] -

Documentation for package ‘Rserve’ version 1.7-3

- - - -

Help Pages

- - - - - - - - - - - - - - - -
RserveServer providing R functionality to applications via TCP/IP or local unix sockets
run.RserveStart Rserve within the current R process.
self.ctrlEvalFunctions usable for R code run inside Rserve
self.ctrlSourceFunctions usable for R code run inside Rserve
self.oobMessageFunctions usable for R code run inside Rserve
self.oobSendFunctions usable for R code run inside Rserve
- diff --git a/spark/rlibs/Rserve/html/R.css b/spark/rlibs/Rserve/html/R.css deleted file mode 100644 index 6f058f3d..00000000 --- a/spark/rlibs/Rserve/html/R.css +++ /dev/null @@ -1,57 +0,0 @@ -BODY{ background: white; - color: black } - -A:link{ background: white; - color: blue } -A:visited{ background: white; - color: rgb(50%, 0%, 50%) } - -H1{ background: white; - color: rgb(55%, 55%, 55%); - font-family: monospace; - font-size: x-large; - text-align: center } - -H2{ background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: large; - text-align: center } - -H3{ background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-size: large } - -H4{ background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic; - font-size: large } - -H5{ background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace } - -H6{ background: white; - color: rgb(40%, 40%, 40%); - font-family: monospace; - font-style: italic } - -IMG.toplogo{ vertical-align: middle } - -IMG.arrow{ width: 30px; - height: 30px; - border: 0 } - -span.acronym{font-size: small} -span.env{font-family: monospace} -span.file{font-family: monospace} -span.option{font-family: monospace} -span.pkg{font-weight: bold} -span.samp{font-family: monospace} - -div.vignettes a:hover { - background: rgb(85%, 85%, 85%); -} - diff --git a/spark/rlibs/Rserve/libs/Rserve b/spark/rlibs/Rserve/libs/Rserve deleted file mode 100755 index 0cdd3176357eb241b9f24a10cd214a994a6a481a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117456 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 Ct&*Pr diff --git a/spark/rlibs/Rserve/libs/Rserve.dbg b/spark/rlibs/Rserve/libs/Rserve.dbg deleted file mode 100755 index d59f3825d811fb04d4cc06ae7c5a034d77a27da6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138884 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 SnY&*yx>! - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.Rserve.so - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/spark/src/main/scala/io/ddf/spark/content/KryoRegistrator.scala b/spark/src/main/scala/io/ddf/spark/content/KryoRegistrator.scala index 4ad17390..d740b583 100644 --- a/spark/src/main/scala/io/ddf/spark/content/KryoRegistrator.scala +++ b/spark/src/main/scala/io/ddf/spark/content/KryoRegistrator.scala @@ -7,8 +7,6 @@ import io.ddf.types.Matrix import io.ddf.types.Vector import io.ddf.spark.ml.ROCComputer import org.jblas.DoubleMatrix -import org.rosuda.REngine.REXP -import org.rosuda.REngine.RList import io.ddf.ml.RocMetric @@ -19,8 +17,6 @@ class KryoRegistrator extends SparkKryoRegistrator { kryo.register(classOf[DoubleMatrix]) kryo.register(classOf[ROCComputer]) kryo.register(classOf[RocMetric]) - kryo.register(classOf[REXP]) - kryo.register(classOf[RList], new FieldSerializer(kryo, classOf[RList])) //super.registerClasses(kryo) } } diff --git a/spark/src/main/scala/io/ddf/spark/content/RDDRow2REXP.scala b/spark/src/main/scala/io/ddf/spark/content/RDDRow2REXP.scala deleted file mode 100644 index 3f5305a9..00000000 --- a/spark/src/main/scala/io/ddf/spark/content/RDDRow2REXP.scala +++ /dev/null @@ -1,102 +0,0 @@ -package io.ddf.spark.content - -import io.ddf.DDF -import io.ddf.content.{Representation, ConvertFunction} -import org.apache.spark.rdd.RDD -import io.ddf.spark.{SparkDDFManager, SparkDDF} -import org.apache.spark.sql.Row -import io.ddf.content.Schema.{ColumnType, Column} -import org.apache.spark.sql.types.StructField -import scala.collection.JavaConversions._ -import scala.collection.mutable.ArrayBuffer -import org.rosuda.REngine._ - -/** - * // TODO review. What is this for? - */ -class RDDROW2REXP(@transient ddf: DDF) extends ConvertFunction(ddf) { - - override def apply(representation: Representation): Representation = { - val columnList = ddf.getSchemaHandler.getColumns - - representation.getValue match { - case rdd: RDD[Row] => { - val rddREXP = rdd.mapPartitions { - iterator => { - val arrayBufferColumns: List[ArrayBuffer[_]] = columnList.map { - col => col.getType match { - case ColumnType.INT => new ArrayBuffer[Int] - case ColumnType.DOUBLE | ColumnType.BIGINT => new ArrayBuffer[Double] - case ColumnType.STRING => new ArrayBuffer[String] - } - }.toList - - while (iterator.hasNext) { - val row = iterator.next() - var i = 0 - while (i < row.size) { - columnList(i).getType match { - case ColumnType.INT => { - val buffer = arrayBufferColumns(i).asInstanceOf[ArrayBuffer[Int]] - if (row.isNullAt(i)) { - buffer += REXPInteger.NA - } else { - buffer += row.getInt(i) - } - } - - case ColumnType.BIGINT => { - val buffer = arrayBufferColumns(i).asInstanceOf[ArrayBuffer[Double]] - if (row.isNullAt(i)) { - buffer += REXPDouble.NA - } else { - buffer += row.getLong(i).toDouble - } - } - - case ColumnType.DOUBLE | ColumnType.BIGINT => { - val buffer = arrayBufferColumns(i).asInstanceOf[ArrayBuffer[Double]] - if (row.isNullAt(i)) { - buffer += REXPDouble.NA - } else { - buffer += row.getDouble(i) - } - } - - case ColumnType.STRING => { - val buffer = arrayBufferColumns(i).asInstanceOf[ArrayBuffer[String]] - if (row.isNullAt(i)) { - buffer += null - } else { - buffer += row.getString(i) - } - } - } - i += 1 - } - } - val rVectors = columnList zip arrayBufferColumns map { - case (col, buffer) => col.getType match { - case ColumnType.INT => { - new REXPInteger(buffer.asInstanceOf[ArrayBuffer[Int]].toArray).asInstanceOf[REXP] - } - case ColumnType.DOUBLE | ColumnType.BIGINT => { - new REXPDouble(buffer.asInstanceOf[ArrayBuffer[Double]].toArray).asInstanceOf[REXP] - } - case ColumnType.STRING => { - new REXPString(buffer.asInstanceOf[ArrayBuffer[String]].toArray).asInstanceOf[REXP] - } - } - } - val dfList = new RList(rVectors, columnList.map { - col => col.getName - }) - Iterator(REXP.createDataFrame(dfList)) - } - } - - new Representation(rddREXP, RepresentationHandler.RDD_REXP.getTypeSpecsString) - } - } - } -} diff --git a/spark/src/main/scala/io/ddf/spark/content/REXP2ArrayObject.scala b/spark/src/main/scala/io/ddf/spark/content/REXP2ArrayObject.scala deleted file mode 100644 index 3fef7f07..00000000 --- a/spark/src/main/scala/io/ddf/spark/content/REXP2ArrayObject.scala +++ /dev/null @@ -1,97 +0,0 @@ -package io.ddf.spark.content - -import io.ddf.DDF -import io.ddf.content.{Representation, ConvertFunction, Schema} -import org.apache.spark.rdd.RDD -import org.rosuda.REngine.{REXPString, REXPInteger, REXPDouble, REXP} -import scala.collection.JavaConverters._ -import scala.collection.JavaConversions.asScalaIterator -import scala.collection.JavaConversions.seqAsJavaList - -/** - */ -class REXP2ArrayObject(@transient ddf: DDF) extends ConvertFunction(ddf) { - - override def apply(representation: Representation): Representation = { - val rddArrObj = representation.getValue match { - case rdd: RDD[REXP] => { - val rddArr = REXP2ArrayObject.RDataFrameToArrayObject(rdd, ddf.getSchema.getColumns.asScala.map(_.getType).toList) - rddArr - } - } - new Representation(rddArrObj, RepresentationHandler.RDD_ARR_OBJECT.getTypeSpecsString) - } -} - -object REXP2ArrayObject { - /** - * Convert a RDD of R data.frames into a RDD of Object[] - */ - def RDataFrameToArrayObject(rdd: RDD[REXP], colTypes: List[Schema.ColumnType]): RDD[Array[Object]] = { - - val rddarrobj = rdd.flatMap { - partdf ⇒ - val dflist = partdf.asList() - val partitionSize = (0 until dflist.size()).map(j ⇒ dflist.at(j).length()).reduce { - (x, y) ⇒ math.max(x, y) - } - - // mLog.info("partdf.len = " + partdf.length()) - // mLog.info("partitionSize = " + partitionSize) - - // big allocation! - val jdata = Array.ofDim[Object](partitionSize, dflist.size()) - - // convert R column-oriented AtomicVector to row-oriented Object[] - // TODO: would be nice to be able to create BigR DataFrame from columnar vectors - (0 until dflist.size()).foreach { - j ⇒ - val rcolvec = dflist.at(j) - dflist.at(j) match { - case v: REXPDouble ⇒ { - val data = rcolvec.asDoubles() // no allocation - var i = 0 // row idx - while (i < partitionSize) { - if (REXPDouble.isNA(data(i))) - jdata(i)(j) = null - else { - if (colTypes(j) == Schema.ColumnType.BIGINT) { - jdata(i)(j) = data(i).toLong.asInstanceOf[Object] - } else { - jdata(i)(j) = data(i).asInstanceOf[Object] - } - - } - - i += 1 - } - } - case v: REXPInteger ⇒ { - val data = rcolvec.asIntegers() // no allocation - var i = 0 // row idx - while (i < partitionSize) { - if (REXPInteger.isNA(data(i))) - jdata(i)(j) = null - else - jdata(i)(j) = data(i).asInstanceOf[Object] - i += 1 - } - } - case v: REXPString ⇒ { - val data = rcolvec.asStrings() // no allocation - var i = 0 // row idx - while (i < partitionSize) { - jdata(i)(j) = data(i) - i += 1 - } - } - // TODO: case REXPLogical - } - } - - jdata - } - - rddarrobj - } -} diff --git a/spark/src/main/scala/io/ddf/spark/content/RepresentationHandler.scala b/spark/src/main/scala/io/ddf/spark/content/RepresentationHandler.scala index 425154e1..169cdf6c 100644 --- a/spark/src/main/scala/io/ddf/spark/content/RepresentationHandler.scala +++ b/spark/src/main/scala/io/ddf/spark/content/RepresentationHandler.scala @@ -15,7 +15,6 @@ import org.apache.spark.rdd.RDD import org.apache.spark.sql.DataFrame import org.apache.spark.sql.Row import org.python.core.PyObject -import org.rosuda.REngine._ import scala.collection.JavaConversions._ import scala.reflect.Manifest @@ -33,12 +32,10 @@ class RepresentationHandler(mDDF: DDF) extends RH(mDDF) { this.addConvertFunction(RDD_ARR_DOUBLE, RDD_LABELED_POINT, new ArrayDouble2LabeledPoint(this.mDDF)) this.addConvertFunction(RDD_ARR_OBJECT, RDD_ARR_DOUBLE, new ArrayObject2ArrayDouble(this.mDDF)) this.addConvertFunction(RDD_ROW, RDD_ARR_STRING, new RDDRow2ArrayString(this.mDDF)) - this.addConvertFunction(RDD_REXP, RDD_ARR_OBJECT, new REXP2ArrayObject(this.mDDF)) this.addConvertFunction(RDD_ROW, RDD_ARR_OBJECT, new RDDRow2ArrayObject(this.mDDF)) this.addConvertFunction(RDD_ROW, RDD_ARR_DOUBLE, new RDDRow2ArrayDouble(this.mDDF)) this.addConvertFunction(RDD_ARR_DOUBLE, RDD_VECTOR, new ArrayDouble2Vector(this.mDDF)) this.addConvertFunction(RDD_ARR_OBJECT, DATAFRAME, new ArrayObject2DataFrame(this.mDDF)) - this.addConvertFunction(RDD_ROW, RDD_REXP, new RDDROW2REXP(this.mDDF)) this.addConvertFunction(RDD_PYOBJ, RDD_ARR_OBJECT, new PyObj2ArrayObject(this.mDDF)) this.addConvertFunction(RDD_ROW, RDD_PYOBJ, new RDDRow2PyObj(this.mDDF)) this.addConvertFunction(DATAFRAME, RDD_MATRIX_VECTOR, new DataFrame2MatrixVector(this.mDDF)) @@ -140,7 +137,6 @@ object RepresentationHandler { val RDD_ARR_STRING = new Representation(classOf[RDD[_]], classOf[Array[String]]) val RDD_LABELED_POINT = new Representation(classOf[RDD[_]], classOf[LabeledPoint]) val RDD_MATRIX_VECTOR = new Representation(classOf[RDD[_]], classOf[TupleMatrixVector]) - val RDD_REXP = new Representation(classOf[RDD[_]], classOf[REXP]) val RDD_PYOBJ = new Representation(classOf[RDD[_]], classOf[PyObject]) val DATAFRAME = new Representation(classOf[DataFrame]) val RDD_ROW = new Representation(classOf[RDD[_]], classOf[Row]) diff --git a/spark/src/main/scala/io/ddf/spark/etl/TransformationHandler.scala b/spark/src/main/scala/io/ddf/spark/etl/TransformationHandler.scala index 33b1454a..cd4cf7dd 100644 --- a/spark/src/main/scala/io/ddf/spark/etl/TransformationHandler.scala +++ b/spark/src/main/scala/io/ddf/spark/etl/TransformationHandler.scala @@ -14,15 +14,7 @@ import scala.collection.JavaConverters._ import scala.collection.JavaConversions.asScalaIterator import scala.collection.JavaConversions.seqAsJavaList import org.apache.spark.rdd.RDD -import org.rosuda.REngine.REXP -import org.rosuda.REngine.REXPDouble -import org.rosuda.REngine.REXPInteger -import org.rosuda.REngine.REXPList -import org.rosuda.REngine.REXPLogical -import org.rosuda.REngine.REXPString -import org.rosuda.REngine.RList -import org.rosuda.REngine.Rserve.RConnection -import org.rosuda.REngine.Rserve.StartRserve + import _root_.io.ddf.DDF import _root_.io.ddf.content.Schema import _root_.io.ddf.content.Schema.Column @@ -87,68 +79,8 @@ class TransformationHandler(mDDF: DDF) extends CoreTransformationHandler(mDDF) { } override def transformMapReduceNative(mapFuncDef: String, reduceFuncDef: String, mapsideCombine: Boolean = true): DDF = { - - // Prepare data as REXP objects - val dfrdd = mDDF.getRepresentationHandler.get(classOf[RDD[_]], classOf[REXP]).asInstanceOf[RDD[REXP]] - - // 1. map! - val rMapped = dfrdd.map { - partdf ⇒ - try { - TransformationHandler.preShuffleMapper(partdf, mapFuncDef, reduceFuncDef, mapsideCombine) - } catch { - case e: Exception ⇒ { - - e match { - case aExc: DDFException ⇒ throw aExc - case rserveExc: org.rosuda.REngine.Rserve.RserveException ⇒ { - throw new DDFException(rserveExc.getMessage, null) - } - case _ ⇒ throw new DDFException(e.getMessage, null) - } - } - } - } - - // 2. extract map key and shuffle! - val groupped = TransformationHandler.doShuffle(rMapped) - - // 3. reduce! - val rReduced = groupped.mapPartitions { - partdf ⇒ - try { - TransformationHandler.postShufflePartitionMapper(partdf, reduceFuncDef) - } catch { - case e: Exception ⇒ { - e match { - case aExc: DDFException ⇒ throw aExc - case rserveExc: org.rosuda.REngine.Rserve.RserveException ⇒ { - throw new DDFException(rserveExc.getMessage, null) - - } - case _ ⇒ throw new DDFException(e.getMessage, null) - } - } - } - }.filter { - partdf ⇒ - // mapPartitions after groupByKey may cause some empty partitions, - // which will result in empty data.frame - val dflist = partdf.asList() - dflist.size() > 0 && dflist.at(0).length() > 0 - } - - // convert R-processed DF partitions back to BigR DataFrame - val columnArr = TransformationHandler.RDataFrameToColumnListMR(rReduced) - - - val newSchema = new Schema(mDDF.getSchemaHandler.newTableName(), columnArr.toList); - - val manager = this.getManager - val ddf = manager.newDDF(manager, rReduced, Array(classOf[RDD[_]], - classOf[REXP]), manager.getNamespace, null, - newSchema) - ddf + throw new DDFException("Method is not implemented") + null } override def transformNativeRserve(transformExpression: String): DDF = { @@ -160,63 +92,8 @@ class TransformationHandler(mDDF: DDF) extends CoreTransformationHandler(mDDF) { } override def transformNativeRserve(transformExpressions: Array[String], inPlace: java.lang.Boolean): DDF = { - val dfrdd = mDDF.getRepresentationHandler.get(classOf[RDD[_]], classOf[REXP]).asInstanceOf[RDD[REXP]] - - // process each DF partition in R - val rMapped = dfrdd.map { - partdf ⇒ - try { - // check if Rserve is running, if not: start it - if (!StartRserve.checkLocalRserve()) throw new RuntimeException("Unable to start Rserve") - // one connection for each compute job - val rconn = new RConnection() - - // send the df.partition to R process environment - val dfvarname = "df.partition" - rconn.assign(dfvarname, partdf) - - val expr = String.format("%s <- transform(%s, %s)", dfvarname, dfvarname, transformExpressions.mkString(",")) - - // mLog.info(">>>>>>>>>>>>.expr=" + expr.toString()) - - // compute! - TransformationHandler.tryEval(rconn, expr, errMsgHeader = "failed to eval transform expression") - - // transfer data to JVM - val partdfres = rconn.eval(dfvarname) - - // uncomment this to print whole content of the df.partition for debug - // rconn.voidEval(String.format("print(%s)", dfvarname)) - rconn.close() - - partdfres - } catch { - case e: DDFException ⇒ { - throw new DDFException("Unable to perform NativeRserve transformation", e) - - } - } - } - - // new columns from the expressions - // Notice that the users can enter expression without the new column name - // Thus the extracted column name is not correct in these cases - val newCols = transformExpressions.map(_.split("=")(0)) - - // convert R-processed data partitions back to RDD[Array[Object]] - val columnArr = TransformationHandler.RDataFrameToColumnList(rMapped, mDDF.getSchema.getColumns, newCols) - - - val newSchema = new Schema(mDDF.getSchemaHandler.newTableName(), columnArr.toList); - - val manager = this.getManager - val ddf = manager.newDDF(manager, rMapped, Array(classOf[RDD[_]], - classOf[REXP]), manager.getNamespace, null, - newSchema) - mLog.info(">>>>> adding ddf to manager: " + ddf.getName) - ddf.getMetaDataHandler.copyFactor(this.getDDF) - - if (inPlace) this.getDDF.updateInplace(ddf) else ddf + throw new DDFException("Method is not implemented") + null } override def transformNativeRserve(transformExpressions: Array[String]): DDF = { @@ -398,57 +275,57 @@ object TransformationHandler { /** * eval the R expr and return all captured output */ - def evalCaptureOutput(rconn: RConnection, expr: String): String = { - rconn.eval("paste(capture.output(print(" + expr + ")), collapse='\\n')").asString() - } - - def RDataFrameToColumnListMR(rdd: RDD[REXP]): Array[Column] = { - val firstdf = rdd.first() - val names = firstdf.getAttribute("names").asStrings() - val columns = new Array[Column](firstdf.length) - - for (j ← 0 until firstdf.length()) { - val ddfType = firstdf.asList().at(j) match { - case v: REXPDouble ⇒ "DOUBLE" - case v: REXPInteger ⇒ "INT" - case v: REXPString ⇒ "STRING" - case _ ⇒ throw new DDFException("Only support atomic vectors of type int|double|string!") - } - columns(j) = new Column(names(j), ddfType) - } - columns - } - - def RDataFrameToColumnList(rdd: RDD[REXP], orgColumns: List[Column], newColumns: Array[String]): Array[Column] = { - val firstdf = rdd.first() - val names = firstdf.getAttribute("names").asStrings() - val columns = new Array[Column](firstdf.length) - - val orgColumnNames = orgColumns.asScala.map(_.getName).toSet - - val orgColumnTypes = orgColumns.asScala.map(c => (c.getName, c.getType)).toMap - - for (j ← 0 until firstdf.length()) { - val ddfType = firstdf.asList().at(j) match { - case v: REXPDouble ⇒ - if (!orgColumnNames.contains(names(j)) || newColumns.toSet.contains(names(j))) { - "DOUBLE" - } - else { - // BigInt columns are converted to Double ones in R data.frame - // So if they are not mutated by expressions, we need to set their types - // correctly on the resulted DDF - orgColumnTypes(names(j)).toString - } - case v: REXPInteger ⇒ "INT" - case v: REXPString ⇒ "STRING" - case _ ⇒ throw new DDFException("Only support atomic vectors of type int|double|string!") - } - columns(j) = new Column(names(j), ddfType) - } - columns - - } +// def evalCaptureOutput(rconn: RConnection, expr: String): String = { +// rconn.eval("paste(capture.output(print(" + expr + ")), collapse='\\n')").asString() +// } +// +// def RDataFrameToColumnListMR(rdd: RDD[REXP]): Array[Column] = { +// val firstdf = rdd.first() +// val names = firstdf.getAttribute("names").asStrings() +// val columns = new Array[Column](firstdf.length) +// +// for (j ← 0 until firstdf.length()) { +// val ddfType = firstdf.asList().at(j) match { +// case v: REXPDouble ⇒ "DOUBLE" +// case v: REXPInteger ⇒ "INT" +// case v: REXPString ⇒ "STRING" +// case _ ⇒ throw new DDFException("Only support atomic vectors of type int|double|string!") +// } +// columns(j) = new Column(names(j), ddfType) +// } +// columns +// } +// +// def RDataFrameToColumnList(rdd: RDD[REXP], orgColumns: List[Column], newColumns: Array[String]): Array[Column] = { +// val firstdf = rdd.first() +// val names = firstdf.getAttribute("names").asStrings() +// val columns = new Array[Column](firstdf.length) +// +// val orgColumnNames = orgColumns.asScala.map(_.getName).toSet +// +// val orgColumnTypes = orgColumns.asScala.map(c => (c.getName, c.getType)).toMap +// +// for (j ← 0 until firstdf.length()) { +// val ddfType = firstdf.asList().at(j) match { +// case v: REXPDouble ⇒ +// if (!orgColumnNames.contains(names(j)) || newColumns.toSet.contains(names(j))) { +// "DOUBLE" +// } +// else { +// // BigInt columns are converted to Double ones in R data.frame +// // So if they are not mutated by expressions, we need to set their types +// // correctly on the resulted DDF +// orgColumnTypes(names(j)).toString +// } +// case v: REXPInteger ⇒ "INT" +// case v: REXPString ⇒ "STRING" +// case _ ⇒ throw new DDFException("Only support atomic vectors of type int|double|string!") +// } +// columns(j) = new Column(names(j), ddfType) +// } +// columns +// +// } /** * Lots of type casting @@ -499,309 +376,309 @@ object TransformationHandler { /** * Perform map and mapsideCombine phase */ - def preShuffleMapper(partdf: REXP, mapFuncDef: String, reduceFuncDef: String, mapsideCombine: Boolean): REXP = { - // check if Rserve is running, if not: start it - if (!StartRserve.checkLocalRserve()) throw new RuntimeException("Unable to start Rserve") - // one connection for each compute job - val rconn = new RConnection() - - // send the df.partition to R process environment - rconn.assign("df.partition", partdf) - rconn.assign("mapside.combine", new REXPLogical(mapsideCombine)) - - TransformationHandler.tryEval(rconn, "map.func <- " + mapFuncDef, - errMsgHeader = "fail to eval map.func definition") - TransformationHandler.tryEval(rconn, "combine.func <- " + reduceFuncDef, - errMsgHeader = "fail to eval combine.func definition") - - // pre-amble to define internal functions - // copied from: https://github.com/adatao/RClient/blob/master/io.pa/R/mapreduce.R - // tests: https://github.com/adatao/RClient/blob/mapreduce/io.pa/inst/tests/test-mapreduce.r#L106 - // should consider some packaging to synchroncize code - rconn.voidEval( - """ - |#' Emit keys and values for map/reduce. - |keyval <- function(key, val) { - | if (! is.atomic(key)) - | stop(paste("keyval: key argument must be an atomic vector: ", paste(key, collapse=" "))) - | if (! is.null(dim(key))) - | stop(paste("keyval: key argument must be one-dimensional: dim(key) = ", - | paste(dim(key), collapse=" "))) - | nkey <- length(key) - | nval <- if (! is.null(nrow(val))) nrow(val) else length(val) - | if (nkey != nval) - | stop(sprintf("keyval: key and val arguments must match in length/nrow: %s != %s", nkey, nval)) - | kv <- list(key=key, val=val); - | attr(kv, "adatao-2d-kv-pair") <- T; - | kv - |} - | - |#' Emit a single key and value pair for map/reduce. - |keyval.row <- function(key, val) { - | if (! is.null(dim(key))) - | stop(paste("keyval: key argument must be a scala value, not n-dimensional: dim(key) = ", - | paste(dim(key), collapse=" "))) - | if (length(key) != 1) - | stop(paste("keyval.row: key argument must be a scalar value: ", paste(key, collapse=" "))) - | if (! is.null(dim(val))) - | stop(paste("keyval: val argument must be one-: dim(val) = ", - | paste(dim(val), collapse=" "))) - | kv <- list(key=key, val=val); - | attr(kv, "adatao-1d-kv-pair") <- T; - | kv - |} - | - |#' does the kv pair have a adatao-defined attr? - |is.adatao.kv <- function(kv) { (! is.null(attr(kv, "adatao-1d-kv-pair"))) | (! is.null(attr(kv, "adatao-2d-kv-pair"))) } - | - |#' should this be splitted? - |is.adatao.1d.kv <- function(kv) { ! is.null(attr(kv, "adatao-1d-kv-pair")) } - | - |do.pre.shuffle <- function(partition, map.func, combine.func, mapside.combine = T, debug = F) { - | print("==== map phase begins ...") - | kv <- map.func(partition) - | if (debug) { print("kv = "); str(kv) } - | - | if (is.adatao.1d.kv(kv)) { - | # list of a single keyval object, with the serialized - | return(list(keyval.row(kv$key, serialize(kv$val, NULL)))) - | } else if (!is.adatao.kv(kv)) { - | print(paste("skipping non-adatao kv = ", kv)) - | } - | - | val.bykey <- split(kv$val, f=kv$key) - | if (debug) { print("val.bykey ="); str(val.bykey) } - | keys <- names(val.bykey) - | - | result <- if (mapside.combine) { - | combine.result <- vector('list', length(keys)) - | for (i in 1:length(val.bykey)) { - | kv <- combine.func(keys[[i]], val.bykey[[i]]) - | if (debug) { print("combined kv = "); str(kv) } - | combine.result[[i]] <- keyval.row(kv$key, serialize(kv$val, NULL)) - | } - | # if (debug) print(combine.result) - | combine.result - | } else { - | kvlist.byrow <- vector('list', length(kv$key)) - | z <- 1 - | for (i in 1:length(keys)) { - | k <- keys[[i]] - | vv <- val.bykey[[i]] - | if (is.atomic(vv)) { - | for (j in 1:length(vv)) { - | kvlist.byrow[[z]] <- keyval.row(k, serialize(vv[[j]], NULL)) - | z <- z + 1 - | } - | } else { - | for (j in 1:nrow(vv)) { - | kvlist.byrow[[z]] <- keyval.row(k, serialize(vv[j, ], NULL)) - | z <- z + 1 - | } - | } - | } - | # if (debug) print(kvlist.byrow) - | kvlist.byrow - | } - | print("==== map phase completed") - | # if (debug) { print("kvlist.byrow = "); str(kvlist.byrow) } - | result - |} - """.stripMargin) - - // map! - TransformationHandler.tryEval(rconn, "pre.shuffle.result <- do.pre.shuffle(df.partition, map.func, combine.func, mapside.combine, debug=T)", - errMsgHeader = "fail to apply map.func to data partition") - - // transfer pre-shuffle result into JVM - val result = rconn.eval("pre.shuffle.result") - - // we will another RConnection because we will now shuffle data - rconn.close() - - result - } +// def preShuffleMapper(partdf: REXP, mapFuncDef: String, reduceFuncDef: String, mapsideCombine: Boolean): REXP = { +// // check if Rserve is running, if not: start it +// if (!StartRserve.checkLocalRserve()) throw new RuntimeException("Unable to start Rserve") +// // one connection for each compute job +// val rconn = new RConnection() +// +// // send the df.partition to R process environment +// rconn.assign("df.partition", partdf) +// rconn.assign("mapside.combine", new REXPLogical(mapsideCombine)) +// +// TransformationHandler.tryEval(rconn, "map.func <- " + mapFuncDef, +// errMsgHeader = "fail to eval map.func definition") +// TransformationHandler.tryEval(rconn, "combine.func <- " + reduceFuncDef, +// errMsgHeader = "fail to eval combine.func definition") +// +// // pre-amble to define internal functions +// // copied from: https://github.com/adatao/RClient/blob/master/io.pa/R/mapreduce.R +// // tests: https://github.com/adatao/RClient/blob/mapreduce/io.pa/inst/tests/test-mapreduce.r#L106 +// // should consider some packaging to synchroncize code +// rconn.voidEval( +// """ +// |#' Emit keys and values for map/reduce. +// |keyval <- function(key, val) { +// | if (! is.atomic(key)) +// | stop(paste("keyval: key argument must be an atomic vector: ", paste(key, collapse=" "))) +// | if (! is.null(dim(key))) +// | stop(paste("keyval: key argument must be one-dimensional: dim(key) = ", +// | paste(dim(key), collapse=" "))) +// | nkey <- length(key) +// | nval <- if (! is.null(nrow(val))) nrow(val) else length(val) +// | if (nkey != nval) +// | stop(sprintf("keyval: key and val arguments must match in length/nrow: %s != %s", nkey, nval)) +// | kv <- list(key=key, val=val); +// | attr(kv, "adatao-2d-kv-pair") <- T; +// | kv +// |} +// | +// |#' Emit a single key and value pair for map/reduce. +// |keyval.row <- function(key, val) { +// | if (! is.null(dim(key))) +// | stop(paste("keyval: key argument must be a scala value, not n-dimensional: dim(key) = ", +// | paste(dim(key), collapse=" "))) +// | if (length(key) != 1) +// | stop(paste("keyval.row: key argument must be a scalar value: ", paste(key, collapse=" "))) +// | if (! is.null(dim(val))) +// | stop(paste("keyval: val argument must be one-: dim(val) = ", +// | paste(dim(val), collapse=" "))) +// | kv <- list(key=key, val=val); +// | attr(kv, "adatao-1d-kv-pair") <- T; +// | kv +// |} +// | +// |#' does the kv pair have a adatao-defined attr? +// |is.adatao.kv <- function(kv) { (! is.null(attr(kv, "adatao-1d-kv-pair"))) | (! is.null(attr(kv, "adatao-2d-kv-pair"))) } +// | +// |#' should this be splitted? +// |is.adatao.1d.kv <- function(kv) { ! is.null(attr(kv, "adatao-1d-kv-pair")) } +// | +// |do.pre.shuffle <- function(partition, map.func, combine.func, mapside.combine = T, debug = F) { +// | print("==== map phase begins ...") +// | kv <- map.func(partition) +// | if (debug) { print("kv = "); str(kv) } +// | +// | if (is.adatao.1d.kv(kv)) { +// | # list of a single keyval object, with the serialized +// | return(list(keyval.row(kv$key, serialize(kv$val, NULL)))) +// | } else if (!is.adatao.kv(kv)) { +// | print(paste("skipping non-adatao kv = ", kv)) +// | } +// | +// | val.bykey <- split(kv$val, f=kv$key) +// | if (debug) { print("val.bykey ="); str(val.bykey) } +// | keys <- names(val.bykey) +// | +// | result <- if (mapside.combine) { +// | combine.result <- vector('list', length(keys)) +// | for (i in 1:length(val.bykey)) { +// | kv <- combine.func(keys[[i]], val.bykey[[i]]) +// | if (debug) { print("combined kv = "); str(kv) } +// | combine.result[[i]] <- keyval.row(kv$key, serialize(kv$val, NULL)) +// | } +// | # if (debug) print(combine.result) +// | combine.result +// | } else { +// | kvlist.byrow <- vector('list', length(kv$key)) +// | z <- 1 +// | for (i in 1:length(keys)) { +// | k <- keys[[i]] +// | vv <- val.bykey[[i]] +// | if (is.atomic(vv)) { +// | for (j in 1:length(vv)) { +// | kvlist.byrow[[z]] <- keyval.row(k, serialize(vv[[j]], NULL)) +// | z <- z + 1 +// | } +// | } else { +// | for (j in 1:nrow(vv)) { +// | kvlist.byrow[[z]] <- keyval.row(k, serialize(vv[j, ], NULL)) +// | z <- z + 1 +// | } +// | } +// | } +// | # if (debug) print(kvlist.byrow) +// | kvlist.byrow +// | } +// | print("==== map phase completed") +// | # if (debug) { print("kvlist.byrow = "); str(kvlist.byrow) } +// | result +// |} +// """.stripMargin) +// +// // map! +// TransformationHandler.tryEval(rconn, "pre.shuffle.result <- do.pre.shuffle(df.partition, map.func, combine.func, mapside.combine, debug=T)", +// errMsgHeader = "fail to apply map.func to data partition") +// +// // transfer pre-shuffle result into JVM +// val result = rconn.eval("pre.shuffle.result") +// +// // we will another RConnection because we will now shuffle data +// rconn.close() +// +// result +// } /** * Eval the expr in rconn, if succeeds return null (like rconn.voidEval), * if fails raise AdataoException with captured R error message. * See: http://rforge.net/Rserve/faq.html#errors */ - def tryEval(rconn: RConnection, expr: String, errMsgHeader: String) { - rconn.assign(".tmp.", expr) - val r = rconn.eval("r <- try(eval(parse(text=.tmp.)), silent=TRUE); if (inherits(r, 'try-error')) r else NULL") - if (r.inherits("try-error")) throw new DDFException(errMsgHeader + ": " + r.asString()) - } - - /** - * By now, whether mapsideCombine is true or false, - * we both have each partition as a list of list(key=..., val=...) - */ - // def doShuffle(rMapped: RDD[REXP]): RDD[(String, Iterable[REXP])] = { - def doShuffle(rMapped: RDD[REXP]): RDD[(String, Iterable[REXP])] = { - val groupped = rMapped.flatMap { - rexp ⇒ - rexp.asList().iterator.map { - kv ⇒ - val kvl = kv.asInstanceOf[REXP].asList - - val (k, v) = (kvl.at("key").asString(), kvl.at("val")) - (k, v) - } - }.groupByKey() - //TODO - groupped - } +// def tryEval(rconn: RConnection, expr: String, errMsgHeader: String) { +// rconn.assign(".tmp.", expr) +// val r = rconn.eval("r <- try(eval(parse(text=.tmp.)), silent=TRUE); if (inherits(r, 'try-error')) r else NULL") +// if (r.inherits("try-error")) throw new DDFException(errMsgHeader + ": " + r.asString()) +// } +// +// /** +// * By now, whether mapsideCombine is true or false, +// * we both have each partition as a list of list(key=..., val=...) +// */ +// // def doShuffle(rMapped: RDD[REXP]): RDD[(String, Iterable[REXP])] = { +// def doShuffle(rMapped: RDD[REXP]): RDD[(String, Iterable[REXP])] = { +// val groupped = rMapped.flatMap { +// rexp ⇒ +// rexp.asList().iterator.map { +// kv ⇒ +// val kvl = kv.asInstanceOf[REXP].asList +// +// val (k, v) = (kvl.at("key").asString(), kvl.at("val")) +// (k, v) +// } +// }.groupByKey() +// //TODO +// groupped +// } /** * serialize data to R, perform reduce, * then assemble each resulting partition as a data.frame of REXP in Java */ - def postShufflePartitionMapper(input: Iterator[(String, Iterable[REXP])], reduceFuncDef: String): Iterator[REXP] = { - // check if Rserve is running, if not: start it - if (!StartRserve.checkLocalRserve()) throw new RuntimeException("Unable to start Rserve") - val rconn = new RConnection() - - // pre-amble - // copied from: https://github.com/adatao/RClient/blob/master/io.pa/R/mapreduce.R - // tests: https://github.com/adatao/RClient/blob/mapreduce/io.pa/inst/tests/test-mapreduce.r#L238 - // should consider some packaging to synchronize code - rconn.voidEval( - """ - |#' Emit keys and values for map/reduce. - |keyval <- function(key, val) { - | if (! is.atomic(key)) - | stop(paste("keyval: key argument must be an atomic vector: ", paste(key, collapse=" "))) - | if (! is.null(dim(key))) - | stop(paste("keyval: key argument must be one-dimensional: dim(key) = ", - | paste(dim(key), collapse=" "))) - | nkey <- length(key) - | nval <- if (! is.null(nrow(val))) nrow(val) else length(val) - | if (nkey != nval) - | stop(sprintf("keyval: key and val arguments must match in length/nrow: %s != %s", nkey, nval)) - | kv <- list(key=key, val=val); - | attr(kv, "adatao-2d-kv-pair") <- T; - | kv - |} - | - |#' Emit a single key and value pair for map/reduce. - |keyval.row <- function(key, val) { - | if (! is.null(dim(key))) - | stop(paste("keyval: key argument must be a scala value, not n-dimensional: dim(key) = ", - | paste(dim(key), collapse=" "))) - | if (length(key) != 1) - | stop(paste("keyval.row: key argument must be a scalar value: ", paste(key, collapse=" "))) - | if (! is.null(dim(val))) - | stop(paste("keyval: val argument must be one-: dim(val) = ", - | paste(dim(val), collapse=" "))) - | kv <- list(key=key, val=val); - | attr(kv, "adatao-1d-kv-pair") <- T; - | kv - |} - | - |#' does the kv pair have a adatao-defined attr? - |is.adatao.kv <- function(kv) { (! is.null(attr(kv, "adatao-1d-kv-pair"))) | (! is.null(attr(kv, "adatao-2d-kv-pair"))) } - | - |#' should this be splitted? - |is.adatao.1d.kv <- function(kv) { ! is.null(attr(kv, "adatao-1d-kv-pair")) } - | - |# flatten the reduced kv pair. - |flatten.kvv <- function(rkv) { - | if (length(rkv$val) > 1) { - | row <- vector('list', length(rkv$val) + 1) - | row[1] <- rkv$key - | row[2:(length(rkv$val)+1)] <- rkv$val - | names(row) <- c("key", names(rkv$val)) - | row - | } else { - | rkv - | } - |} - | - |#' bind together list of values from the same keys as rows of a data.frame - |rbind.vv <- function(vvlist) { - | df <- do.call(rbind.data.frame, vvlist) - | if (length(vvlist) > 0) { - | head <- vvlist[[1]] - | if ( is.null(names(head)) ) { - | if (length(head) == 1) { - | names(df) <- c("val") - | } else { - | names(df) <- Map(function(x){ paste("val", x, sep="") }, 1:length(head)) - | } - | } - | } - | df - |} - | - |handle.reduced.kv <- function(rkv) { - | if (is.adatao.1d.kv(rkv)) { - | row <- flatten.kvv(rkv) - | row - | } else if (is.adatao.kv(rkv)) { - | df <- rkv$val - | df$key <- rkv$key - | df - | } else { - | print("skipping not-supported reduce.func output = "); str(rkv) - | NULL - | } - |} - """.stripMargin) - - TransformationHandler.tryEval(rconn, "reduce.func <- " + reduceFuncDef, - errMsgHeader = "fail to eval reduce.func definition") - - rconn.voidEval("reductions <- list()") - rconn.voidEval("options(stringsAsFactors = F)") - - // we do this in a loop because each of the seqv could potentially be very large - input.zipWithIndex.foreach { - case ((k: String, seqv: Seq[_]), i: Int) ⇒ - - // send data to R to compute reductions - rconn.assign("idx", new REXPInteger(i)) - rconn.assign("reduce.key", k) - rconn.assign("reduce.serialized.vvlist", new REXPList(new RList(seqv))) - - // print to Rserve log - rconn.voidEval("print(paste('====== processing key = ', reduce.key))") - - TransformationHandler.tryEval(rconn, "reduce.vvlist <- lapply(reduce.serialized.vvlist, unserialize)", - errMsgHeader = "fail to unserialize shuffled values for key = " + k) - - TransformationHandler.tryEval(rconn, "reduce.vv <- rbind.vv(reduce.vvlist)", - errMsgHeader = "fail to merge (using rbind.vv) shuffled values for key = " + k) - - // reduce! - TransformationHandler.tryEval(rconn, "reduced.kv <- reduce.func(reduce.key, reduce.vv)", - errMsgHeader = "fail to apply reduce func to data partition") - - // flatten the nested val list if needed - TransformationHandler.tryEval(rconn, "reduced <- handle.reduced.kv(reduced.kv)", - errMsgHeader = "malformed reduce.func output, please run mapreduce.local to test your reduce.func") - - // assign reduced item to reductions list - rconn.voidEval("if (!is.null(reduced)) { reductions[[idx+1]] <- reduced } ") - } - - // bind the reduced rows together, it contains rows of the resulting BigDataFrame - TransformationHandler.tryEval(rconn, "reduced.partition <- do.call(rbind.data.frame, reductions)", - errMsgHeader = "fail to use rbind.data.frame on reductions list, reduce.func cannot be combined as a BigDataFrame") - - // remove weird row names - rconn.voidEval("rownames(reduced.partition) <- NULL") - - // transfer reduced data back to JVM - val result = rconn.eval("reduced.partition") - - // print to Rserve log - rconn.voidEval("print('==== reduce phase completed')") - - // done R computation for this partition - rconn.close() - - // wrap it on a Iterator to satisfy mapPartitions - Iterator.single(result) - } +// def postShufflePartitionMapper(input: Iterator[(String, Iterable[REXP])], reduceFuncDef: String): Iterator[REXP] = { +// // check if Rserve is running, if not: start it +// if (!StartRserve.checkLocalRserve()) throw new RuntimeException("Unable to start Rserve") +// val rconn = new RConnection() +// +// // pre-amble +// // copied from: https://github.com/adatao/RClient/blob/master/io.pa/R/mapreduce.R +// // tests: https://github.com/adatao/RClient/blob/mapreduce/io.pa/inst/tests/test-mapreduce.r#L238 +// // should consider some packaging to synchronize code +// rconn.voidEval( +// """ +// |#' Emit keys and values for map/reduce. +// |keyval <- function(key, val) { +// | if (! is.atomic(key)) +// | stop(paste("keyval: key argument must be an atomic vector: ", paste(key, collapse=" "))) +// | if (! is.null(dim(key))) +// | stop(paste("keyval: key argument must be one-dimensional: dim(key) = ", +// | paste(dim(key), collapse=" "))) +// | nkey <- length(key) +// | nval <- if (! is.null(nrow(val))) nrow(val) else length(val) +// | if (nkey != nval) +// | stop(sprintf("keyval: key and val arguments must match in length/nrow: %s != %s", nkey, nval)) +// | kv <- list(key=key, val=val); +// | attr(kv, "adatao-2d-kv-pair") <- T; +// | kv +// |} +// | +// |#' Emit a single key and value pair for map/reduce. +// |keyval.row <- function(key, val) { +// | if (! is.null(dim(key))) +// | stop(paste("keyval: key argument must be a scala value, not n-dimensional: dim(key) = ", +// | paste(dim(key), collapse=" "))) +// | if (length(key) != 1) +// | stop(paste("keyval.row: key argument must be a scalar value: ", paste(key, collapse=" "))) +// | if (! is.null(dim(val))) +// | stop(paste("keyval: val argument must be one-: dim(val) = ", +// | paste(dim(val), collapse=" "))) +// | kv <- list(key=key, val=val); +// | attr(kv, "adatao-1d-kv-pair") <- T; +// | kv +// |} +// | +// |#' does the kv pair have a adatao-defined attr? +// |is.adatao.kv <- function(kv) { (! is.null(attr(kv, "adatao-1d-kv-pair"))) | (! is.null(attr(kv, "adatao-2d-kv-pair"))) } +// | +// |#' should this be splitted? +// |is.adatao.1d.kv <- function(kv) { ! is.null(attr(kv, "adatao-1d-kv-pair")) } +// | +// |# flatten the reduced kv pair. +// |flatten.kvv <- function(rkv) { +// | if (length(rkv$val) > 1) { +// | row <- vector('list', length(rkv$val) + 1) +// | row[1] <- rkv$key +// | row[2:(length(rkv$val)+1)] <- rkv$val +// | names(row) <- c("key", names(rkv$val)) +// | row +// | } else { +// | rkv +// | } +// |} +// | +// |#' bind together list of values from the same keys as rows of a data.frame +// |rbind.vv <- function(vvlist) { +// | df <- do.call(rbind.data.frame, vvlist) +// | if (length(vvlist) > 0) { +// | head <- vvlist[[1]] +// | if ( is.null(names(head)) ) { +// | if (length(head) == 1) { +// | names(df) <- c("val") +// | } else { +// | names(df) <- Map(function(x){ paste("val", x, sep="") }, 1:length(head)) +// | } +// | } +// | } +// | df +// |} +// | +// |handle.reduced.kv <- function(rkv) { +// | if (is.adatao.1d.kv(rkv)) { +// | row <- flatten.kvv(rkv) +// | row +// | } else if (is.adatao.kv(rkv)) { +// | df <- rkv$val +// | df$key <- rkv$key +// | df +// | } else { +// | print("skipping not-supported reduce.func output = "); str(rkv) +// | NULL +// | } +// |} +// """.stripMargin) +// +// TransformationHandler.tryEval(rconn, "reduce.func <- " + reduceFuncDef, +// errMsgHeader = "fail to eval reduce.func definition") +// +// rconn.voidEval("reductions <- list()") +// rconn.voidEval("options(stringsAsFactors = F)") +// +// // we do this in a loop because each of the seqv could potentially be very large +// input.zipWithIndex.foreach { +// case ((k: String, seqv: Seq[_]), i: Int) ⇒ +// +// // send data to R to compute reductions +// rconn.assign("idx", new REXPInteger(i)) +// rconn.assign("reduce.key", k) +// rconn.assign("reduce.serialized.vvlist", new REXPList(new RList(seqv))) +// +// // print to Rserve log +// rconn.voidEval("print(paste('====== processing key = ', reduce.key))") +// +// TransformationHandler.tryEval(rconn, "reduce.vvlist <- lapply(reduce.serialized.vvlist, unserialize)", +// errMsgHeader = "fail to unserialize shuffled values for key = " + k) +// +// TransformationHandler.tryEval(rconn, "reduce.vv <- rbind.vv(reduce.vvlist)", +// errMsgHeader = "fail to merge (using rbind.vv) shuffled values for key = " + k) +// +// // reduce! +// TransformationHandler.tryEval(rconn, "reduced.kv <- reduce.func(reduce.key, reduce.vv)", +// errMsgHeader = "fail to apply reduce func to data partition") +// +// // flatten the nested val list if needed +// TransformationHandler.tryEval(rconn, "reduced <- handle.reduced.kv(reduced.kv)", +// errMsgHeader = "malformed reduce.func output, please run mapreduce.local to test your reduce.func") +// +// // assign reduced item to reductions list +// rconn.voidEval("if (!is.null(reduced)) { reductions[[idx+1]] <- reduced } ") +// } +// +// // bind the reduced rows together, it contains rows of the resulting BigDataFrame +// TransformationHandler.tryEval(rconn, "reduced.partition <- do.call(rbind.data.frame, reductions)", +// errMsgHeader = "fail to use rbind.data.frame on reductions list, reduce.func cannot be combined as a BigDataFrame") +// +// // remove weird row names +// rconn.voidEval("rownames(reduced.partition) <- NULL") +// +// // transfer reduced data back to JVM +// val result = rconn.eval("reduced.partition") +// +// // print to Rserve log +// rconn.voidEval("print('==== reduce phase completed')") +// +// // done R computation for this partition +// rconn.close() +// +// // wrap it on a Iterator to satisfy mapPartitions +// Iterator.single(result) +// } } diff --git a/spark/src/test/java/io/ddf/spark/etl/TransformationHandlerTest.java b/spark/src/test/java/io/ddf/spark/etl/TransformationHandlerTest.java index 38ae0837..1b4b8dc7 100644 --- a/spark/src/test/java/io/ddf/spark/etl/TransformationHandlerTest.java +++ b/spark/src/test/java/io/ddf/spark/etl/TransformationHandlerTest.java @@ -39,7 +39,7 @@ public void setUp() throws Exception { s3DDFManager = (S3DDFManager) DDFManager.get(DDFManager.EngineType.S3, s3dsd); } - @Test + @Ignore public void testTransformNativeRserve() throws DDFException { DDF newddf = ddf.Transform.transformNativeRserve("newcol = deptime / arrtime"); LOG.info("name " + ddf.getName()); @@ -52,7 +52,7 @@ public void testTransformNativeRserve() throws DDFException { Assert.assertEquals(10, res.size()); } - @Test + @Ignore public void testTransformNativeRserveSingleExpressionInPlaceTrue() throws DDFException { Boolean inPlace = Boolean.TRUE; DDF newDdf = ddf.copy(); @@ -67,7 +67,7 @@ public void testTransformNativeRserveSingleExpressionInPlaceTrue() throws DDFExc Assert.assertEquals(10, res.size()); } - @Test + @Ignore public void testTransformNativeRserveSingleExpressionInPlaceFalse() throws DDFException { Boolean inPlace = Boolean.FALSE; DDF newDdf3 = ddf.copy(); @@ -79,7 +79,7 @@ public void testTransformNativeRserveSingleExpressionInPlaceFalse() throws DDFEx Assert.assertFalse("With inPlace being false, two DDF should have different UUID", newDdf3.getUUID().equals(newDdf4.getUUID())); } - @Test + @Ignore public void testTransformNativeRserveMultipleExpressionInPlaceTrue() throws DDFException { Boolean inPlace = Boolean.TRUE; String[] expressions = {"newcol = deptime / arrtime","newcol2=log(arrdelay)"}; @@ -165,7 +165,7 @@ public void testTransformPythonInPlace() throws DDFException { } } - @Test + @Ignore public void testTransformNativeRserveMultipleExpressions() throws DDFException { String[] expressions = {"newcol = deptime / arrtime","newcol2=log(arrdelay)"}; DDF newddf = ddf.Transform.transformNativeRserve(expressions); @@ -174,7 +174,7 @@ public void testTransformNativeRserveMultipleExpressions() throws DDFException { Assert.assertEquals("newcol2", newddf.getColumnName(9)); } - @Test + @Ignore public void testTransformNativeRserveBigIntSupport() throws DDFException { DDF ddf = manager.sql2ddf("select year, month, dayofweek, uniquecarrier, deptime, arrtime, " + "distance, arrdelay, depdelay from airline_bigint", "SparkSQL"); diff --git a/spark/src/test/scala/io/ddf/spark/content/RepresentationHandlerSuite.scala b/spark/src/test/scala/io/ddf/spark/content/RepresentationHandlerSuite.scala index cc23c5f1..76f1440c 100644 --- a/spark/src/test/scala/io/ddf/spark/content/RepresentationHandlerSuite.scala +++ b/spark/src/test/scala/io/ddf/spark/content/RepresentationHandlerSuite.scala @@ -13,7 +13,6 @@ import scala.collection.JavaConversions._ import io.ddf.spark.{ATestSuite, SparkDDF} import org.apache.spark.sql.{Row, DataFrame} import org.apache.spark.mllib.linalg.{SparseVector, DenseVector, Vectors, Vector} -import org.rosuda.REngine.REXP import io.ddf.etl.IHandleMissingData.Axis /** @@ -129,21 +128,6 @@ class RepresentationHandlerSuite extends ATestSuite { assert(rdd == null) } - test("Can do sql queries after Transform Rserve") { - createTableMtcars() - val ddf = manager.sql2ddf("select * from mtcars", "SparkSQL") - val newDDF = ddf.Transform.transformNativeRserve("z1 = mpg / cyl, " + - "z2 = disp * 0.4251437075, " + - "z3 = rpois(nrow(df.partition), 1000)") - val rddREXP = newDDF.getRepresentationHandler.get(classOf[RDD[_]], classOf[REXP]).asInstanceOf[RDD[REXP]] - assert(newDDF != null) - val st = newDDF.VIEWS.head(32) - val ddf1 = newDDF.sql2ddf("select * from @this") - - assert(ddf1.getNumRows == 32) - assert(ddf1 != null) - } - test("Can get RDD(Array[String])") { createTableText8Sample val ddf = manager.sql2ddf("select * from text8sample","SparkSQL") From 0f4f985df599c44867ea5f2801bdb6f1a7e100ec Mon Sep 17 00:00:00 2001 From: Huandao0812 Date: Thu, 25 May 2017 14:47:24 -0700 Subject: [PATCH 2/5] ignore some test --- .../test/java/io/ddf/spark/etl/TransformationHandlerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spark/src/test/java/io/ddf/spark/etl/TransformationHandlerTest.java b/spark/src/test/java/io/ddf/spark/etl/TransformationHandlerTest.java index 1b4b8dc7..eec5c14b 100644 --- a/spark/src/test/java/io/ddf/spark/etl/TransformationHandlerTest.java +++ b/spark/src/test/java/io/ddf/spark/etl/TransformationHandlerTest.java @@ -95,7 +95,7 @@ public void testTransformNativeRserveMultipleExpressionInPlaceTrue() throws DDFE Assert.assertEquals("transformed DDF newDdf2 should have newcol2 added", "newcol2", newDdf2.getColumnName(9)); } - @Test + @Ignore public void testTransformNativeRserveMultipleExpressionInPlaceFalse() throws DDFException { Boolean inPlace = Boolean.FALSE; String[] expressions = {"newcol = deptime / arrtime","newcol2=log(arrdelay)"}; From 1a495f46b5e1b53955af058719cadd1e0da26a8a Mon Sep 17 00:00:00 2001 From: Huandao0812 Date: Thu, 25 May 2017 14:52:05 -0700 Subject: [PATCH 3/5] add plugin --- project/RootBuild.scala | 2 +- project/plugins.sbt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/project/RootBuild.scala b/project/RootBuild.scala index 2a0b662e..7081d77b 100644 --- a/project/RootBuild.scala +++ b/project/RootBuild.scala @@ -197,7 +197,7 @@ object RootBuild extends Build { ) ++ assemblySettings ++ extraAssemblySettings // Common / Shared project settings - def commonSettings = Defaults.defaultSettings ++ Seq( + def commonSettings = Defaults.defaultSettings ++ net.virtualvoid.sbt.graph.Plugin.graphSettings ++ Seq( organization := projectOrganization, version := rootVersion, scalaVersion := theScalaVersion, diff --git a/project/plugins.sbt b/project/plugins.sbt index 16c15d8a..84889df3 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -16,6 +16,8 @@ addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4") addSbtPlugin("org.scalastyle" %% "scalastyle-sbt-plugin" % "0.7.0") +addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.2") + resolvers += "sonatype-releases" at "https://oss.sonatype.org/content/repositories/releases/" //addSbtPlugin("io.spray" %% "sbt-twirl" % "0.6.1") From b2bbb177a65a4ad25988bf04220e7e5d2971cdb9 Mon Sep 17 00:00:00 2001 From: Huandao0812 Date: Thu, 25 May 2017 15:32:12 -0700 Subject: [PATCH 4/5] fix RootBuild --- project/RootBuild.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/RootBuild.scala b/project/RootBuild.scala index d7fea486..8eaadbdd 100644 --- a/project/RootBuild.scala +++ b/project/RootBuild.scala @@ -197,7 +197,7 @@ object RootBuild extends Build { ) ++ assemblySettings ++ extraAssemblySettings // Common / Shared project settings - def commonSettings = Defaults.defaultSettings ++ net.virtualvoid.sbt.graph.Plugin.graphSettings ++ Seq( + def commonSettings = Defaults.defaultSettings ++ Seq( organization := projectOrganization, version := rootVersion, scalaVersion := theScalaVersion, From 8222899d3c38cd1450dc24cb3c7df1c7431fbca5 Mon Sep 17 00:00:00 2001 From: Huandao0812 Date: Tue, 30 May 2017 09:36:15 -0700 Subject: [PATCH 5/5] remove mysql dependency --- core/pom.xml | 5 ----- ddf-test/pom.xml | 5 ----- examples/pom.xml | 5 ----- hdfs/pom.xml | 5 ----- project/RootBuild.scala | 2 +- s3/pom.xml | 5 ----- spark/pom.xml | 5 ----- 7 files changed, 1 insertion(+), 31 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 3b264a5d..8fbb8197 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -288,11 +288,6 @@ 3.1 test - - mysql - mysql-connector-java - 5.1.25 - org.python jython-standalone diff --git a/ddf-test/pom.xml b/ddf-test/pom.xml index 4bdc9740..2ae1f0c7 100644 --- a/ddf-test/pom.xml +++ b/ddf-test/pom.xml @@ -287,11 +287,6 @@ 3.1 test - - mysql - mysql-connector-java - 5.1.25 - org.python jython-standalone diff --git a/examples/pom.xml b/examples/pom.xml index a11b4ba0..906ca7ba 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -293,11 +293,6 @@ 3.1 test - - mysql - mysql-connector-java - 5.1.25 - org.python jython-standalone diff --git a/hdfs/pom.xml b/hdfs/pom.xml index b8c07310..6de61104 100644 --- a/hdfs/pom.xml +++ b/hdfs/pom.xml @@ -288,11 +288,6 @@ 3.1 test - - mysql - mysql-connector-java - 5.1.25 - org.python jython-standalone diff --git a/project/RootBuild.scala b/project/RootBuild.scala index 8eaadbdd..3e2e807b 100644 --- a/project/RootBuild.scala +++ b/project/RootBuild.scala @@ -245,7 +245,7 @@ object RootBuild extends Build { "net.sf" % "jsqlparser" % "0.9.8.8", "commons-io" % "commons-io" % "1.3.2", "org.easymock" % "easymock" % "3.1" % "test", - "mysql" % "mysql-connector-java" % "5.1.25", + //"mysql" % "mysql-connector-java" % "5.1.25", "org.python" % "jython-standalone" % "2.7.0", "joda-time" % "joda-time" % "2.8.1", "org.joda" % "joda-convert" % "1.7" diff --git a/s3/pom.xml b/s3/pom.xml index f60fe60e..d3d4d519 100644 --- a/s3/pom.xml +++ b/s3/pom.xml @@ -288,11 +288,6 @@ 3.1 test - - mysql - mysql-connector-java - 5.1.25 - org.python jython-standalone diff --git a/spark/pom.xml b/spark/pom.xml index 36131f07..2fb9daaa 100644 --- a/spark/pom.xml +++ b/spark/pom.xml @@ -310,11 +310,6 @@ 3.1 test - - mysql - mysql-connector-java - 5.1.25 - org.python jython-standalone