Java 使用Parlappy将数据帧写入Oracle数据库时发生JVM错误

Java 使用Parlappy将数据帧写入Oracle数据库时发生JVM错误,java,r,parallel-processing,doparallel,rjdbc,Java,R,Parallel Processing,Doparallel,Rjdbc,我想并行化我的数据写入过程。我正在为Oracle数据库编写一个数据帧。此数据有400万行和8列。不并行化需要6.5小时 当我尝试并行时,我得到了错误 Error in checkForRemoteErrors(val) : 7 nodes produced errors; first error: No running JVM detected. Maybe .jinit() would help. 我知道这个错误。当我使用单个集群时,我可以解决这个问题。但我不知道如何告诉其他集群Jav

我想并行化我的数据写入过程。我正在为Oracle数据库编写一个数据帧。此数据有400万行和8列。不并行化需要6.5小时

当我尝试并行时,我得到了错误

Error in checkForRemoteErrors(val) : 
  7 nodes produced errors; first error: No running JVM detected. Maybe .jinit() would help.
我知道这个错误。当我使用单个集群时,我可以解决这个问题。但我不知道如何告诉其他集群Java的位置。这是我的密码

Sys.setenv(JAVA_HOME='C:/Program Files/Java/jre1.8.0_181') 
library(rJava)
library(RJDBC)
library(DBI)
library(compiler)
library(dplyr)
library(data.table)

jdbcDriver =JDBC("oracle.jdbc.OracleDriver",classPath="C:/Program Files/directory/ojdbc6.jar", identifier.quote = "\"") 
jdbcConnection =dbConnect(jdbcDriver, "jdbc:oracle:thin:@//XXXXX", "YYYYY", "ZZZZZ")
通过使用Sys.setenv(JAVA_HOME='C:/Program Files/JAVA/jre1.8.0_181')我为单核解决了同样的问题。但当我与之平行时

library(parallel)
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)
clusterExport(cl, varlist = list("jdbcConnection", "brand3.merge.u"))
clusterEvalQ(cl, .libPaths("C:/Users/onur.boyar/Documents/R/win-library/3.5"))
clusterEvalQ(cl, library(RJDBC))
clusterEvalQ(cl, library(rJava))

parLapply(cl, 1:length(brand3.merge.u$CELL_PH_NUM), function(x) dbSendUpdate(jdbcConnection, "INSERT INTO xxnvdw.an_cust_analytics  VALUES(?,?,?,?,?,?,?,?)", brand3.merge.u[x, 1], brand3.merge.u[x,2], brand3.merge.u[x,3],brand3.merge.u[x,4],brand3.merge.u[x,5],brand3.merge.u[x,6],brand3.merge.u[x,7],brand3.merge.u[x,8]))

#brand3.merge.u is my data frame that I try to write.  
库(并行)

无内核JAVA\u主环境变量

如果问题确实出在Java的位置上,那么可以在
.Renviron
文件中设置环境变量。它可能位于
~/.Renviron
中。向该文件添加一行,该行将传播到通过用户运行的所有R会话:

JAVA_HOME='C:/Program Files/Java/jre1.8.0_181'
或者,您可以只使用环境变量

通过rJava初始化JVM

另一方面,错误消息可能只指向未初始化的JVM,您可以使用
.jinit
解决此问题,这是一个简单的示例:

library(parallel)
cl <- makeCluster(detectCores())
parallel::parLapply(cl, 1:5, function(x) {
  rJava::.jinit()
  rJava::.jnew(class = "java/lang/Integer", x)$toString()
})
库(并行)

cl你好,Jozef,非常感谢你的帮助。我正在使用你的第二种解决方案。我现在有不同的错误。错误是checkForRemoteErrors(val)中的错误:7个节点产生错误;第一个错误:RcallMethod:尝试调用NULL对象的方法。但我有一个问题。.jnew(class=“java/lang/Integer”,x)$toString()具体做什么?我查看了文档,但为什么要使用“java/lang/Integer”?ThanksHi,很抱歉造成混淆,带有
.jnew
的示例只是显示
.jinit
并返回与您的问题无关的内容的一般最小示例。为了回答下一个错误,我建议你用一个有点重复性的例子提出一个新问题。我的最终代码是parlappy(cl,1:length(brand3.merge.u$CELL_PH_NUM),函数(x){rJava:::.jinit()dbSendUpdate(..)}),我按照您的建议在我的parlappy中包括了rJava::.jinit()。这是正确的方法吗?
con <- DBI::dbConnect(
  odbc::odbc(),
  Driver = "[your driver's name]",
  ...
)