2016-05-11 4 views
0

Я пытаюсь использовать команду multidplyr для запуска команды do, которая запускает настраиваемую функцию, которая запрашивает базу данных Vertica, используя RJDBC. У меня нет проблем запуска multidplyr примеров или запросов к базе данных напрямую, но когда я пытаюсь подключиться к базе данных в multidplyr я получаю ошибку:multidplyr с подключением к базе данных

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 3 nodes produced errors; first error: No running JVM detected. Maybe .jinit() would help.

Я пробовал предложение в комментариях here сделать кластер вручную, передавая объект подключения к базе данных vertica, но я все еще получаю сообщение об ошибке «Не обнаружено JVM без запуска». Я предполагаю, что это потому, что мне нужно сказать каждому узлу, чтобы запустить JVM, но я не сейчас, как это сделать.

Мой кода, извинение, что это не воспроизводимо, как я не могу разделить базу данных:

# set up DB connection 
vertica <- dbConnect(vDriver, ...connection info...) 

# create cluster 
cluster3 <- create_cluster(3) 
parallel::clusterExport(cl = cluster3, c("getData", "vertica")) 

# run function in parallel using multidplyr 
accounts_part <- multidplyr::partition(accounts, accountId, cluster = cluster3) 

accounts_data <- accounts_part %>% 
    group_by(accountId) %>% 
    do(getData(ac = .$accountId, vertica = vertica)) 

ответ

0

Я не могу воспроизвести свой код, чтобы мой answere будет основан на моем опыте (я имел аналогичные проблемы с правопреемника (разные) случайные числа для каждого кластера) и на и this и this. Надеюсь, что это сработает.

Я думаю, что ваша главная проблема заключается в том, что ваше соединение связано с привязкой вашего db к фактическому сеансу, и поэтому вы не можете «скопировать» его на каждый узел, потому что им нужен свой «путь» к db.

С другой стороны, для каждого соединения все равно необходимо иметь одно и то же имя, чтобы иметь возможность управлять ими одним (параллельным) вызовом. Поэтому, я думаю, вам нужно только создать соединения непосредственно в каждом узле, а не создавать одно соединение в фактическом сеансе, а не копировать его в узлы.

# create cluster 
cluster3 <- create_cluster(3) 

# export data, function, ... 
cluster_assign_value(cluster, 'getData', getData) 

# setup DB connection in each cluster (evaluated in each cluster) 
cluster_eval(cluster, vertica <- dbConnect(vDriver, ...connection info...)) 
# not 
# cluster_assign_value(cluster, 
#  'vertica', dbConnect(vDriver, ...connection info...) 
#) 
# which is evaluate locally and so it is the same as your code 

# run function in parallel using multidplyr 
accounts_part <- multidplyr::partition(accounts, accountId, 
    cluster = cluster3 
) 

accounts_data <- accounts_part %>% 
    # group_by(accountId) %>% # partition() have already grouped them 
    do(getData(ac = .$accountId, vertica = vertica)) # %>% 
    # collect() # if you have no more computations to do and want get back 
       # the results locally 
Смежные вопросы