3

我可以访问具有基本 R (2.14.1) 但没有在每个节点中安装其他软件包的 Hadoop 集群。我一直在编写基本的 R 映射器和化简器流脚本来解决我没有其他包的事实。但是,我已经到了需要使用某些包(主要是 rjson)作为我的脚本的一部分的地步。

我在集群上没有管理员权限,并且用户帐户受到相当的限制。让集群管理员在每个节点上安装软件包不是一个选项(目前),并且集群没有外部互联网访问权限。

我已将 rjson_0.2.8.tar.gz 源文件上传到我的网关节点。是否可以通过添加install.packages("rjson_0.2.8.tar.gz", repos = NULL, lib = /tmp)或沿这些行临时安装 R 包,以便在脚本启动时安装包,并通过流作业的 -cacheArchive 参数传递源?我希望将软件包安装在临时位置,以便在作业完成后消失。

这甚至可能吗?

我知道我会得到一些“使用 python”的答案,因为它用于处理 JSON,这是一个选项,但问题是针对任何包。:)

4

3 回答 3

2

我是 rmr(项目 RHadoop)的作者。我们正在尝试一种非常激进的方法来回避安装问题。我们使用您描述的流式传输功能将整个 R 发行版、软件包和所有内容打包在一个 jar 中,但具有一定程度的间接性。R 发行版加载到用户 hdfs 目录,而不是 tmp 目录。流然后将其移动到每个节点。只要作业不存在,作业本身就会将其移动到最终目的地。我们这样做是因为整个发行版并不小,而且我们想利用流式传输的缓存功能,而且 R 的组件不可重定位。因此,每当您更新某些内容或添加包时,您都会重建 jar 并将其移动到 hdfs。其余的都是自动的,仅在需要时发生(hdfs->nodes->final location)。我什至从 Hortonworks 的人那里得到了一些指导来做正确的事。我们在分支 0-install 中有一个概念证明,但它仅适用于 ubuntu/EC2,显然我设法硬编码了一些我不应该拥有的路径,并且我正在做出许多其他假设,所以这只是对于愿意参与的开发人员,但主要成分都已到位。当然,这取决于您使用 rmr 编写工作,这是一个单独的决定,或者您可以查看代码并为您的目的重现该方法。但我宁愿为每个人一劳永逸地解决这个问题。准备 jar 的脚本是这样的:没有,我正在做一些其他的假设,所以这仅适用于愿意参与的开发人员,但主要成分都已经到位。当然,这取决于您使用 rmr 编写工作,这是一个单独的决定,或者您可以查看代码并为您的目的重现该方法。但我宁愿为每个人一劳永逸地解决这个问题。准备 jar 的脚本是这样的:没有,我正在做一些其他的假设,所以这仅适用于愿意参与的开发人员,但主要成分都已经到位。当然,这取决于您使用 rmr 编写工作,这是一个单独的决定,或者您可以查看代码并为您的目的重现该方法。但我宁愿为每个人一劳永逸地解决这个问题。准备 jar 的脚本是这样的:https://github.com/RevolutionAnalytics/RHadoop/blob/0-install/rmr/pkg/tools/0-install/setup-jar其余操作在 rmr:::rhstream

于 2012-06-21T21:22:30.333 回答
1

您应该能够按照您对-cacheArchive参数的建议进行操作 - 但请注意,这已被弃用,您应该-archives改用它。

还有一点需要注意,使用-archivesover-files意味着任务跟踪器将解压缩您的 tar.gz 文件(而不是您必须手动解压缩它)。

无论哪种方式,当您的代码执行时,文件或解压文件都将在当前工作目录中可用,并且从那里您将能够根据 R 中可用的机制注册模块包(我从未使用过 R,所以您'从这里你自己)

于 2012-06-21T17:50:21.297 回答
0

您可以创建一个临时目录(例如,使用R中的 tempfile或python 中的mkdtemp)。确保目录的名称是唯一的,否则当多个映射器同时将包安装到同一位置时, R会报错。此临时目录可用作install.packages. 该目录位于mapred.child.tmp属性定义的位置。默认设置下,对应的mapper完成后会被移除。您还可以将 mapred.child.tmp 设置为特定位置(例如,-D mapred.child.tmp=/tmp/),但 Hadoop 可能不会删除临时目录。

于 2012-08-25T11:13:17.660 回答