2017-08-24 38 views
0
library(doParallel) 
library(RMySQL) 

no_cores <- as.integer(system('getconf _NPROCESSORS_ONLN', intern = TRUE)) - 1 
cluster <- makeCluster(no_cores) 
registerDoParallel(cl) 

clusterEvalQ(
    cluster, 
    mysql <- RMySQL::dbConnect(...) 
    } 
) 

r <- foreach(i = 1:50, .verbose = TRUE) %dopar% { dbGetQuery(mysql, 'show tables;')} 

no variables are automatically exported 

没有错误,没有抱怨。没什么,它只是冻结。我可以启动并使用没有数据库连接的集群。foreach与数据库连接冻结,没有错误,永远

想法?

回答

3

它什么时候挂?当致电clusterEvalQ或foreach循环?

我有几个建议:

  • 使用outfile=""创建群集时得到调试输出;
  • 初始化群集时加载RMySQL;
  • 返回NULLclusterEvalQ避免序列化连接对象;
  • 确保您致电registerDoParallel,以便任务不在本地执行。

下面是一个使用这些建议的测试:

library(doParallel) 
cl <- makePSOCKcluster(3, outfile="") 
registerDoParallel(cl) 

clusterEvalQ(cl, { 
    library(RMySQL) 
    mysql <- dbConnect(MySQL(), user='root', 
        password='notmypasswd', dbname='mysql') 
    NULL 
}) 

r <- 
    foreach(i=1:50, .verbose=TRUE) %dopar% { 
    dbGetQuery(mysql, 'show tables;') 
    } 

这个测试对我的作品。当我运行它,我看到这样的消息:

no variables are automatically exported 
numValues: 50, numResults: 0, stopped: TRUE 
got results for task 1 
numValues: 50, numResults: 1, stopped: TRUE 
returning status FALSE 
got results for task 2 

如果你只看到:

no variables are automatically exported 

,然后将其挂起,那么工人们大概挂试图执行使用数据库连接的查询。这听起来像是MySQL的问题,但我不是MySQL专家。

+0

谢谢Steve,这绝对是最后一部分。我什么也没得到,它只是挂起,所以也许是数据库连接失败。我只是希望有一些输出。我离开它约20分钟,它仍然在那里卡住,没有错误信息或任何东西。我也忽略了在我的例子中添加'registerDoParallel',但它在我的实际中。我会尝试你的建议,并让你知道他们是否有任何工作。感谢您的关注! –

+0

您是否可以扩展一下“避免序列化连接对象”的含义? –

+1

@BrandonBertelsen在我的例子中,如果我在调用'clusterEvalQ'时没有包含'NULL',它会尝试返回由工作人员创建的连接对象列表。由于数据库连接对象包含套接字连接,因此会导致序列化错误。我不认为这会造成任何实际问题,但这令人不安。 –