【发布时间】:2011-09-14 00:05:40
【问题描述】:
我正在开发一个包来在 R 中执行分布式计算(在 github 上的 RHadoop 项目下的 rmr)。我试图使事情对用户尽可能透明,并且只是让计算在其他机器上的另一个解释器中继续进行,就好像它在同一台机器上一样。类似的东西
lapply(my.list, my.function)
对my.function 的每次调用原则上都可以在集群中的不同节点上发生,因此需要一个单独的解释器。我正在使用 save 和 load 这对在一定程度上取得了成功,但我希望有一个在所有可能情况下都有效的解决方案,而不仅仅是在大量用例中。
不管my.function做什么,不管它是在哪里定义的,不管它指的是什么其他对象和包,我想确定的是,如果它在本地工作,它也可以在远程工作,包括加载必要的包和一切。 save 和 load 保存对象列表并分别加载文件。从或到特定环境。我想找到或编写一些东西,将所有必要的对象从必要的环境中保存和加载到必要的环境中,以便在my.list 的每个元素上评估my.function 将在本地和远程具有相同的语义。
以前有没有这样做过,我应该检查任何包,还有其他建议吗?我认为这是 rmr 中最难的技术问题,您可以将您的解决方案贡献给 OSS 项目。
【问题讨论】:
-
我的第一次回答是断言这不是您要求的可行,但我认为有一个可行的答案。
RHIPE呢?令人满意且有效。 -
很高兴 RHIPE 为你工作,但它根本不处理环境,所以它与这个问题无关。使用 rmr,我们试图使 mapreduce 像 lapply-tapply 组合一样工作,并具有正常的变量作用域。我们只是认为这是最类似于 R 的方式,并且以这种方式编写的程序既简单又美观。当然,美是值得商榷的,历史将成为评判者。但问题是关于恢复环境,而不是 RHIPE 是否比 rmr 更好。如果您有任何论据支持我的请求不可行,我会很感兴趣。
-
抱歉,由于某种原因,我误读了您的问题 - 我假设您使用的是
rmr,而不是开发它。无论如何,这将是非常具有挑战性的。正如您所指出的,环境很棘手。就我而言,我通过识别和保存环境的功能来解决它们。更难处理的是与操作系统交互的任何对象(例如内存映射文件、连接),而不是仅存在于 R 中。您还可以检查包的加载顺序,以确保复制掩码。跨度> -
(续)关于不可行 - 在尝试进行可重复的统计数据时,我的头撞到了墙上,特别是在网格上,它并不是不可行的(至少我无法证明它;-)) ,但是跨异构网格复制整个 R 设置(除非使用 VM,否则大多数网格最终会变成)是一项艰巨的工作。我愿意试验任何东西,因为它会帮助我,但我不能说有任何明显的解决方案。我发现最好的方法是在所有主要和辅助代码和脚本中强调可重现性。
-
追问:能否提供一点代码来演示要解决的问题?我还在考虑这个问题。虽然在许多 Hadoop 节点上复制本地实例很困难,但解决保存环境的问题是一个相当简洁的子问题。
标签: r environment