在 Hadoop 节点上临时安装 R 包以进行流式处理作业



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

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

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

这可能吗?

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

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

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

另一点需要注意的是,在-files上使用-archives将意味着您的 tar.gz 文件将由任务跟踪器解压缩(而不必手动解压缩)。

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

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

相关内容

  • 没有找到相关文章

最新更新