在Hadoop节点上临时安装R软件包以进行流式传输作业

时间:2012-06-21 17:20:43

标签: r hadoop streaming

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

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

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

这甚至可能吗?

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您应该可以按照-cacheArchive参数的建议进行操作 - 但请注意,这已被弃用,您应该使用-archives代替。

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

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

答案 2 :(得分:0)

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