Ошибка JVM при записи фрейма данных в базу данных Oracle с использованием parLapply - PullRequest
0 голосов
/ 15 января 2019

Я хочу распараллелить процесс записи данных. Я пишу фрейм данных в базу данных Oracle. Эти данные имеют 4 миллиона строк и 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. Любая помощь будет оценена. Спасибо!

1 Ответ

0 голосов
/ 15 января 2019

переменная среды JAVA_HOME

Если проблема действительно в расположении Java, вы можете установить переменную окружения в вашем файле .Renviron. Скорее всего, находится в ~/.Renviron. Добавьте строку в этот файл, и она будет распространена на все сеансы R, которые выполняются вашим пользователем:

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

Кроме того, вы можете просто добавить это местоположение в переменную окружения PATH.

Инициализация JVM через rJava

С другой стороны, сообщение об ошибке может указывать на то, что 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

Это не было специально задано, но вы также можете обойти необходимость зависимости Java с помощью драйверов ODBC, которые для Oracle должны быть доступны здесь :

con <- DBI::dbConnect(
  odbc::odbc(),
  Driver = "[your driver's name]",
  ...
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...