天道酬勤,学无止境

从 OpenCPU API 调用 RJDBC 库时 rJava 失败(rJava fails while invoking RJDBC library from OpenCPU API)

问题

目标:将 RJDBC 与 OpenCPU AJAX Post 调用一起使用。

用例:我需要连接 Apache phoenix 数据库并获取一些数据。 我应该对这些数据进行分析。 因此,为了与 Phoenix 连接,我使用的是 rjdbc(phoenix 不支持任何其他连接选项)。

环境: public.opencpu.org

这是我正在尝试的:

html

<textarea>
library(RJDBC)
.. do some data fetching and then r statistics
</textarea>
<br />
<button id="submitbutton" >Execute</button>
<br />
<br />
<div id="output">
</div>

javascript

<script type="text/javascript">
  //When Document is Ready
    $(function () {
        var baseurl = "https://public.opencpu.org";
        //because identity is in base
        ocpu.seturl(baseurl+"/ocpu/library/base/R");
        //actual handler
        $("#submitbutton").on("click", function(){
            //arguments
            var mysnippet = new ocpu.Snippet($("#input").val());
            //perform the request
            var req = ocpu.call("identity", {
                "x" : mysnippet
            }, function(session){
                session.getStdout(function(outtxt){
                        $("#output-txt").text(outtxt);   
                });
            });   
            //if R returns an error, alert the error message
            req.fail(function(){
                alert("Server error: " + req.responseText);
                $("#output").hide();
            });      
            req.always(function(){
                $("button").removeAttr("disabled");  
            });
        });    
    });

</script>

设想

当我单击执行按钮时,从文本区域获取用户输入的值(这里是库(RJDBC)和一些数据库操作)并发送一个 ajax 帖子并以以下错误回复

谷歌浏览器控制台日志:

POST https://public.opencpu.org/ocpu/library/base/R/identity 400 (Bad Request) 
OpenCPU error HTTP 400
package 'rJava' could not be loaded

希望这能提供更好的清晰度。

需要确认 rJava 是否适用于 OpenCPU,如果可以,是否有任何可能的解决方法来解决这个问题?

回答1

我的解决方案的核心如下所示。 该代码取自具有一些日志记录的 R6 类。 为了记录正在发生的事情,我在private$log命令中留下了,但如果运行此代码的一个版本,您会希望将其省略。 类似地,那里有一些函数调用,你实际上不需要完成工作,我将主机信息打包在一个列表中,而不是传递密码等的单个变量等。简而言之,我在这里提供的代码是不可最小复制。

但是,我在此要点中提供的代码应该具有一定的可复制性(一旦您提供了数据库连接、 classPathdriverClass )。 该要点已经进行了大约 0 次清理,因此那里有大量代码严格来说对于完成工作来说是多余的。 这些代码都不漂亮、优雅等等——通常我对此感到羞耻,但本着分享的精神,我还是把它放了下来。

解释代码段:

        jvmNode <- makeCluster(1, methods=FALSE, port = sample(11000:11999,1), rscript_args="--vanilla")
          connected <- isTRUE(try(clusterEvalQ(jvmNode, 2)==2, silent=TRUE))
        private$log$finest("forkable node started")
        clusterEvalQ(jvmNode,{library(DBI);library(rJava);library(RJDBC)})

        clusterEvalQ(jvmNode, systemRAMFree <- function() {
  #in GB, platform dependent 
  as.numeric(system('FREE_KB=$(($(echo `sed -n \'2p;3p;4p\' <  /proc/meminfo | sed "s/ \\+/ /g" | cut -d\' \' -f 2 ` | sed "s/ /+/g")));echo $FREE_KB', intern=TRUE))/1024/1024
})       
        clusterEvalQ(jvmNode, options(java.parameters = paste0("-Xmx",systemRAMFree(),"g")))

        hostInformation <- private$hostInformation
        classPath <- "~/redshift/redshiftJDBC41.jar"
        driverClass <- private$driverClass
        java.parameters <- getOption("java.parameters")
        toExportList <- list(statement,driverClass, classPath, hostInformation, java.parameters)
        names(toExportList) <- c("statement","driverClass","classPath", "hostInformation", "java.parameters")
        toExport <- as.environment(toExportList)
        clusterExport(jvmNode, ls(toExport), envir=toExport)
        clusterEvalQ(jvmNode, options(java.parameters = java.parameters))

        clusterEvalQ(jvmNode, rJava::.jinit())
        private$log$finest("JVM Started")
        clusterEvalQ(jvmNode, drv <- RJDBC::JDBC(driverClass, classPath))
        private$log$finest("Driver obtained")

        clusterEvalQ(jvmNode, conn <- dbConnect(drv, 
                                       url = hostInformation$host, 
                                       user = hostInformation$user, 
                                       password = hostInformation$password))
        private$log$debug(logPrefix("query:", statement))
        result <- try(clusterEvalQ(jvmNode, dbGetQuery(conn, statement))[[1]])
        clusterEvalQ(jvmNode, dbDisconnect(conn))
        stopCluster(jvmNode)
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • rJava fails while invoking RJDBC library from OpenCPU API
    Goal : To use RJDBC with OpenCPU AJAX Post call. Use case : I need to connect with Apache phoenix database and get some data. And on that data I am supposed to do analytics. So to connect with Phoenix i am using rjdbc(phoenix doesn't support any other option to connect). Environment : public.opencpu.org Here is what I am trying: html <textarea> library(RJDBC) .. do some data fetching and then r statistics </textarea> <br /> <button id="submitbutton" >Execute</button> <br /> <br /> <div id="output"> </div> javascript <script type="text/javascript"> //When Document is Ready $(function () { var
  • rJava 安装失败(MacOS、Red Hat)(rJava fails to install (MacOS, Red Hat))
    问题 我遇到了许多其他人似乎曾经遇到过的相同的 rJava 问题。 R CMD INSTALL测试JNI程序是否可以编译时出现错误。 输出建议运行R CMD javareconf -ed或sudo R CMD javareconf后者的输出是: computer: home$ sudo R CMD javareconf Java interpreter : /usr/bin/java Java version : 1.6.0_31 Java home path : /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home Java compiler : /usr/bin/javac Java headers gen.: /usr/bin/javah Java archive tool: /usr/bin/jar Java library path: JNI linker flags : -framework JavaVM JNI cpp flags : -I$(JAVA_HOME)/include Updating Java configuration in /Library/Frameworks/R.framework/Resources Done. 之后尝试安装 rJava 时, computer
  • 在 Mac 上安装 rJava 时遇到问题; JNI 数据类型的问题(Trouble installing rJava on Mac ; trouble with JNI data types)
    问题 解决!! 请参阅下面的解决方案,以防此问题将来对其他人有所帮助。 错误 正如标题所描述的那样,它对我来说失败了。 当我尝试从 R 内部安装install.packages('rJava')时,我收到的错误是(有一些前面的良好检查): checking whether JNI programs can be compiled... yes checking JNI data types... configure: error: One or more JNI types differ from the corresponding native type. You may need to use non-standard compiler flags or a different compiler in order to fix this. ERROR: configuration failed for package ‘rJava’ * removing ‘/usr/local/lib/R/3.2/site-library/rJava’ 修复尝试 我已经检查并尝试了以下解决方案,但没有一个对我有用: 须藤 R CMD javareconf 更详细的 sudo R CMD javareconf 导出 JAVA_HOME,但是在这种情况下,我没有执行 LD_LIBRARY_PATH
  • R 和 Hive 之间的连接(Connectivity between R and Hive)
    问题 我正在尝试在 RStudio(在我的机器上)和 Hive(在不同的服务器上设置)之间建立连接。 这是我的 R 代码: install.packages("RJDBC",dep=TRUE) require(RJDBC) drv <- JDBC(driverClass = "org.apache.hive.jdbc.HiveDriver", classPath = list.files("C:/Users/37/Downloads/hive-jdbc-0.10.0.jar", pattern="jar$",full.names=T), identifier.quote="'") 这是我在执行上述命令时遇到的错误: .jfindClass(as.character(driverClass)1) 中的错误:找不到类 conn <- dbConnect(drv, "jdbc:hive2://65.11.23.453:10000/default", "admin", "admin") 我从这里下载了 jar 文件并将它们放在CLASSPATH 中。 请告知我是否做错了什么以及我如何才能使其正常工作。 谢谢。 回答1 如果您有 cloudera,请检查版本并下载 jars。 示例 CDH 5.9.1 hadoop-common-2.6.0-cdh5.9.1.jar hive-jdbc-1
  • 使用 OS Sierra 在 R(3.4.1) 中加载 rJava(rJava loading in R(3.4.1) with OS Sierra)
    问题 我在最新版本的 R(3.4.1)、Mac (10.12.5) 和 Java VM (1.8.0_131, x86_64:) 中遇到了 rJava 的问题 问题: 我尝试按照本指南进行操作 scottdhoover.wordpress.com/2013/03/05/a-basic-rjava-example/ 为了能够在 R 中运行 rJava。 来自 r 的一些代码: library(rJava) .jinit("") .jclassPath() [1] "/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/java" s <- .jnew("java/lang/String", "Hello World!") .jcall(s, "I", "length") [1] 12 所以实际上是有效的..但是当我尝试使用我的文件时: .jaddClassPath("/Users/Camilo/Desktop/20170711_Java2R") .jclassPath() [1] "/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/java" "/Users/Camilo/Desktop /20170711
  • 列出R软件包依赖项而不安装软件包(Listing R Package Dependencies Without Installing Packages)
    问题 是否有一种简单的方法来获取给定软件包的R软件包依赖性(所有递归依赖性)列表,而无需安装软件包及其依赖性? 类似于portupgrade或apt中的假安装。 回答1 您可以使用available.packages函数的结果。 例如,查看ggplot2依赖什么: pack <- available.packages() pack["ggplot2","Depends"] 这使 : [1] "R (>= 2.14), stats, methods" 请注意,根据您要实现的目标,您可能还需要检查Imports字段。 回答2 另一个简洁明了的解决方案是库packrat的内部函数recursivePackageDependencies 。 但是,该软件包必须安装在计算机上的某些库中。 优点是它也可以与自制的非CRAN软件包一起使用。 例子: packrat:::recursivePackageDependencies("ggplot2",lib.loc = .libPaths()[1]) 给予: [1] "R6" "RColorBrewer" "Rcpp" "colorspace" "dichromat" "digest" "gtable" [8] "labeling" "lazyeval" "magrittr" "munsell" "plyr" "reshape2" "rlang"
  • 在 R 中加载 xlsx 库时出错 [重复](Error loading xlsx library in R [duplicate])
    问题 这个问题在这里已经有了答案: 在带有 R 的 Win7 64 位上使用 rJava 包(12 个回答) 6年前关闭。 有人可以帮我解决我在使用 xlsx 时遇到的问题吗 我在 R 中成功安装了 xlsx 包。但是,当我加载 xlsx 库时,我不断收到以下错误。 我卸载了 Java,重新启动 PC 并重新安装了最新的 Java 版本,但这并没有解决问题。 提前致谢 我正在运行 R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet" 操作系统:Windows 7 Professional, SP 1 Java version 1.8.0_25 (latest) “包 'xlsx' 成功解包并检查 MD5 总和 下载的二进制包在 C:\Users\Mathan\AppData\Local\Temp\Rtmp6BDr2b\downloaded_pa​​ckages library("xlsx") 正在加载所需的包:rJava 错误:.onLoad 在 loadNamespace() 中为 'rJava' 失败,详细信息:调用:fun(libname, pkgname) 错误:软件/JavaSoft 注册表中没有 CurrentVersion 条目! 尝试重新安装 Java 并确保 R 和 Java 具有匹配的体系结构。 错误:无法加载包
  • 安装软件包时,.onLoad在“ rJava”的loadNamespace()中失败(.onLoad failed in loadNamespace() for 'rJava' when installing a package)
    问题 我有一个软件包“ javaOnLoadFailed”(只是用于测试我的问题的最小软件包,因此名称很怪异),该软件包导入了rJava。 即使require(rJava)本身运行正常,当我尝试check()或install()软件包时,也会出现“ rJava”错误。 install()给出以下错误: > install() Installing javaOnloadFailed "C:/Program Files/R/R-3.2.0/bin/x64/R" --no-site-file --no-environ --no-save \ --no-restore CMD INSTALL \ "C:/Projects/stackoverflow/javaOnloadFailed/javaOnLoadFailed" \ --library="C:/Users/adb2018/Documents/R/win-library/3.2" --with-keep.source \ --install-tests * installing *source* package 'javaOnloadFailed' ... ** R ** preparing package for lazy loading ** help *** installing help indices ** building
  • Trouble installing rJava on Mac ; trouble with JNI data types
    RESOLVED!! See my solution below, in case this question helps others in the future. Error As the title described, it it failing for me. The error I'm receiving, when I attempt to install.packages('rJava') from inside R is (with some preceding good checks): checking whether JNI programs can be compiled... yes checking JNI data types... configure: error: One or more JNI types differ from the corresponding native type. You may need to use non-standard compiler flags or a different compiler in order to fix this. ERROR: configuration failed for package ‘rJava’ * removing ‘/usr/local/lib/R/3.2/site
  • rJava loading in R(3.4.1) with OS Sierra
    I have been around a problem with rJava in the newest version of R(3.4.1), Mac (10.12.5) and Java VM (1.8.0_131, x86_64:) Problem: I try it to follow this guide scottdhoover.wordpress.com/2013/03/05/a-basic-rjava-example/ To be able to run rJava in R. Some code from r: library(rJava) .jinit("") .jclassPath() [1] "/Library/Frameworks/R.framework/Versions/3.4/Resources/library/rJava/java" s <- .jnew("java/lang/String", "Hello World!") .jcall(s, "I", "length") [1] 12 So is actually working.. but when I try with my files: .jaddClassPath("/Users/Camilo/Desktop/20170711_Java2R") .jclassPath() [1] "
  • R 包 rJava 仅在我使用 sudo 启动 R 时加载(R package rJava only loads if I launch R with sudo)
    问题 我在 Ubuntu 14.04.1 上运行 R 3.0.2。 我已经安装了 rJava 包,但是如果我使用 sudo 启动它,我只能让它在 R/RStudio 中工作。 如果我单击应用程序启动器,或者只是在命令行中输入 R,则在加载 rJava 库时会出现以下错误: > library(rJava) Error : .onLoad failed in loadNamespace() for 'rJava', details: call: dyn.load(file, DLLpath = DLLpath, ...) error: unable to load shared object '/usr/lib/R/site-library/rJava/libs/rJava.so': libjvm.so: cannot open shared object file: No such file or director Error: package or namespace load failed for ‘rJava’ 但是,如果我在终端中键入“sudo rstudio”或“sudo R”,则 rJava 加载没有问题。 有谁知道我做错了什么? 可能相关的问题:我通过输入安装了 rJava sudo apt-get install r-cran-rjava 在命令提示符下;
  • R:rJava软件包安装失败(R: rJava package install failing)
    问题 使用install.packages("rJava")命令安装rJava时,出现以下错误: checking Java support in R... present: interpreter : '/usr/bin/java' archiver : '/usr/bin/jar' compiler : '/usr/bin/javac' header prep.: '/usr/bin/javah' cpp flags : '-I/usr/lib/jvm/java-6-sun-1.6.0.20/jre/../include -I/usr/lib/jvm/java-6-sun-1.6.0.20/jre/../include/linux' java libs : '-L/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/amd64/server -L/usr/lib/jvm/java-6-sun-1.6.0.20/jre/lib/amd64 -L/usr/lib/jvm/java-6-sun-1.6.0.20/jre/../lib/amd64 -L -L/usr/java/packages/lib/amd64 -L/usr/lib64 -L/lib64 -L/lib -L/usr/lib -ljvm' checking whether JNI
  • R: JDBC() not finding Java drivers path when connecting to Teradata
    I'm trying to connect to Teradata through RStudio, but for some reason JDBC function has problems recognizing the path where Java drivers sit. See the code below: library(RODBC) library(RJDBC) library(rJava) # both Java drivers definitely exist file.exists('/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/tdgssconfig.jar') [1] TRUE file.exists('/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/terajdbc4.jar') [1] TRUE But when I paste those paths in JDBC call... # allow more elaborated error messages to appear .jclassLoader()$setDebug(1L) drv = JDBC("com.teradata.jdbc
  • 在带有R的Win7 64位上使用rJava包(Using the rJava package on Win7 64 bit with R)
    问题 我正在尝试在具有Win 7 64位的计算机上安装rJava 。 当我跑步时 install.packages("rJava") 一切似乎都很好: Installing package(s) into ‘C:/Users/djq/Documents/R/win-library/2.13’ (as ‘lib’ is unspecified) trying URL 'http://software.rc.fas.harvard.edu/mirrors/R/bin/windows/contrib/2.13/rJava_0.9-1.zip' Content type 'application/zip' length 654936 bytes (639 Kb) opened URL downloaded 639 Kb package 'rJava' successfully unpacked and MD5 sums checked The downloaded packages are in C:\TEMP\RtmpW2eAUw\downloaded_packages 但是当我尝试加载库library(rJava) ,出现以下错误: Error : .onLoad failed in loadNamespace() for 'rJava', details: call: inDL(x
  • libjvm.so:无法打开共享对象文件:没有这样的文件或目录(libjvm.so: cannot open shared object file: No such file or directory)
    问题 尝试使用此代码在我的14.10 ubuntu上的R上安装rJava软件包 if (!require(rJava)) install.packages('rJava') 重新安装jdk之后,遇到了与Java相关的一些错误,包括jni问题,并尝试再次运行相同的代码,但出现了该错误 Error : .onLoad failed in loadNamespace() for 'rJava', details: call: dyn.load(file, DLLpath = DLLpath, ...) error: unable to load shared object '/usr/local/lib/R/site-library/rJava/libs/rJava.so': libjvm.so: cannot open shared object file: No such file or directory Error: loading failed Execution halted ERROR: loading failed * removing ‘/usr/local/lib/R/site-library/rJava’ Warning in install.packages : installation of package ‘rJava’ had non-zero exit
  • 加载rJava时出错(Error while loading rJava)
    问题 我想加载rJava时出现错误。 已安装JDK。 (我在CentOS VM(cloudera演示vm cdh3u4)上运行R) > library(rJava) Error : .onLoad failed in loadNamespace() for 'rJava', details: call: dyn.load(file, DLLpath = DLLpath, ...) error: unable to load shared object '/home/cloudera/R/x86_64-redhat-linux-gnu-library/2.15/rJava/libs/rJava.so': libjvm.so: cannot open shared object file: No such file or directory Error: package/namespace load failed for ‘rJava’ LD_LIBRARY_PATH设置有问题吗? 如果是,我该如何解决? 我需要运行rJava以便稍后安装rhdfs。 一些更多信息(如果需要): [cloudera@localhost ~]$ java -version java version "1.6.0_31" Java(TM) SE Runtime Environment (build 1.6
  • rJava 加载错误-“预期字符向量”(rJava loading error- “character vector expected”)
    问题 我使用的是 64 位 Windows 7 和 64 位 R 3.2.0。 我已经下载了 rJava 包,但它给出了如下错误。 错误:“rJava”的 loadNamespace() 中的 .onLoad 失败,详细信息: 调用:dirname(this$RuntimeLib) 错误:需要字符向量参数另外:警告消息:包“rJava”是在 R 版本 3.2.2 下构建的 错误:“rJava”的包或命名空间加载失败 我在 stackoverflow 上搜索了答案,并执行了以下操作: 1) 将jvm.dll文件添加到我的 PATH 变量中,即在以下目录中: C:\Program Files\Java\jdk1.8.0_25\jre\bin\ 2)我正在使用 64 位 R 3.2.0 并检查 JVM 版本是否为 64 位,在命令行中输入以下内容: java -d64 -version 它给出了以下输出: C:\Users\xyz> java -d64 -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b18) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode) 所以至少JVM与R匹配。
  • R错误:.onLoad在'rJava'的loadNamespace()中失败(R - Error : .onLoad failed in loadNamespace() for 'rJava')
    问题 加载rJava包时,出现以下错误: Error : .onLoad failed in loadNamespace() for 'rJava', details: call: inDL(x, as.logical(local), as.logical(now), ...) error: unable to load shared object 'C:/Users/ankitagarwal5/Documents/R/win-library/3.2/rJava/libs/x64/rJava.dll': LoadLibrary failure: %1 is not a valid Win32 application. In addition: Warning message: package 'rJava' was built under R version 3.2.3 Error: package or namespace load failed for 'rJava' 我引用了StackOverflow上的各种帖子,并尝试进行相应的更改,但是没有任何效果。 这些是我解决该问题所遵循的各种步骤: if (Sys.getenv("JAVA_HOME")!="") Sys.setenv(JAVA_HOME="") library(rJava) 这没用。 然后我尝试了这个:
  • R错误:java.lang.OutOfMemoryError:Java堆空间(R Error: java.lang.OutOfMemoryError: Java heap space)
    问题 我正在尝试将R连接到Teradata,以将数据直接拉到R中进行分析。 但是,我得到了一个错误, Error in .jcall(rp, "I", "fetch", stride, block) : java.lang.OutOfMemoryError: Java heap space 我尝试通过以下方法设置我的R选项以增加JVM的最大堆大小: options(java.parameters = "-Xmx8g") 我也尝试过使用rJava函数.jinit初始化java参数为: .jinit(parameters="-Xmx8g") 。 但是还是失败了。 计算出的数据大小应约为3G(实际上小于3G)。 回答1 您需要确保在加载rJava或任何其他软件包之前分配了更多的内存。 首先擦除环境(通过rm(list = ls()) ),如有必要,请重新启动R / Rstudio,然后在脚本的开头修改选项。 options(java.parameters = "-Xmx8000m") 参见例如https://support.snowflake.net/s/article/solution-using-r-the-following-error-is-returned-javalangoutofmemoryerror-gc-overhead-limit-exceeded 回答2
  • 如何使用R从Cassandra读取数据?(How to read data from Cassandra with R?)
    问题 我正在使用R 2.14.1和Cassandra 1.2.11,我有一个单独的程序,该程序已将数据写入单个Cassandra表中。 我无法从R中读取它们。 Cassandra模式的定义如下: create table chosen_samples (id bigint , temperature double, primary key(id)) 我首先尝试过RCassandra软件包(http://www.rforge.net/RCassandra/) > # install.packages("RCassandra") > library(RCassandra) > rc <- RC.connect(host ="192.168.33.10", port = 9160L) > RC.use(rc, "poc1_samples") > cs <- RC.read.table(rc, c.family="chosen_samples") 连接似乎成功,但是将表解析为数据帧失败: > cs Error in data.frame(..dfd. = c("@\"ffffff", "@(<cc><cc><cc><cc><cc><cd>", : duplicate row.names: 我还尝试过使用JDBC连接器,如下所述:http://www.datastax.com/dev