2012-06-21 26 views
3

我有权访问具有基本R(2.14.1)但每个节点中未安装附加软件包的Hadoop集群。我一直在编写基本的R mapper和reducer流脚本来解决这个事实,即我没有额外的软件包。但是,我已经到了需要使用某些软件包的地步,主要是rjson,作为我的脚本的一部分。在Hadoop节点上临时安装R包以进行流式传输作业

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

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

这甚至可能吗?

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

回答

1

您应该能够按照您的建议使用-cacheArchive参数 - 但请注意,这已被弃用,您应该使用-archives来代替。

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

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

2

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

+0

这听起来像一个有趣的方法。我想了解更多。我的环境是RHEL。我实际上尝试从网关源安装一个软件包,但由于用户限制,我得到了“无法编译”错误。我尝试的另一种方法是在另一台RHEL计算机上tar.gz软件包的安装目录,并将其作为归档文件提交,但是我还没有能够让它工作。 – wahalulu

0

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