multidplyr与数据库连接

时间:2016-05-11 15:17:32

标签: r foreach parallel-processing dplyr

我尝试使用multidplyr运行do命令,该命令运行使用RJDBC查询Vertica数据库的自定义函数。我运行multidplyr示例或直接查询数据库没有问题,但是当我尝试连接到multidplyr中的数据库时,我收到错误:

  

checkForRemoteErrors中的错误(lapply(cl,recvResult)):3个节点   产生错误;第一个错误:未检测到正在运行的JVM。也许.jinit()   会有所帮助。

我已经尝试了评论here中的建议来手动创建集群,传递vertica数据库连接对象,但我仍然收到错误消息#34;没有运行JVM检测&#34 ;.我猜这是因为我需要告诉每个节点启动一个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))

1 个答案:

答案 0 :(得分:0)

我无法重现你的代码所以我的回答将基于我的经验(我有类似的问题,为每个群集分配(不同)随机数)和 thisthis。希望它有效。

我认为您的主要问题是您的连接是为了将您的数据库与实际会话相关联,因此您无法在每个节点上“复制”它,因为它们需要自己的“方式”到数据库。

另一方面,您仍然需要为每个连接使用相同的名称,以便能够在单个(并行)呼叫中管理它们。所以,我认为你只需要直接在每个节点中创建连接,而不是在实际会话中创建一个连接,而不是将它复制到节点中。

# 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