gpt4 book ai didi

java - 使用 parLapply 将数据帧写入 Oracle 数据库时出现 JVM 错误

转载 作者:行者123 更新时间:2023-12-02 10:22:55 25 4
gpt4 key购买 nike

我想并行化我的数据写入过程。我正在将数据框写入 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 位置。

我想使用 parLapply,因为它比 foreach 更快。任何帮助,将不胜感激。谢谢!

最佳答案

JAVA_HOME环境变量

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

JAVA_HOME='C:/Program Files/Java/jre1.8.0_181'

或者,您也可以 add that location to your PATH环境变量。

通过 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()
})

解决 Java 使用问题

这不是特别要求的,但您也可以使用 ODBC 驱动程序解决 Java 依赖关系的需要,对于 Oracle 来说应该是 accessible here :

con <- DBI::dbConnect(
odbc::odbc(),
Driver = "[your driver's name]",
...
)

关于java - 使用 parLapply 将数据帧写入 Oracle 数据库时出现 JVM 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54193679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com