我试图使用多点运行一个do命令,该命令运行一个自定义函数,该函数使用RJDBC查询Vertica数据库。运行multidplyr示例或直接查询数据库没有问题,但当我试图连接到multidplyr中的数据库时,会得到以下错误:
checkForRemoteErrors中的错误(lapply(cl,recvResult)):3个节点产生错误;第一个错误:未检测到运行的JVM。也许.jinit()会有所帮助。
我尝试了注释这里中的建议,通过传递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))发布于 2017-01-28 11:30:27
我不能重现您的代码,所以我的答案将基于我的经验(我对每个集群分配(不同的)随机数有类似的问题),并且基于这和这。希望它能成功。
我认为您的主要问题是,您的连接是为了将您的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 locallyhttps://stackoverflow.com/questions/37166889
复制相似问题