使用RHadoop rmr2的R外部库

时间:2015-11-10 12:12:18

标签: r hadoop mapreduce hadoop-streaming rhadoop

我有这种情况:

我有一个脚本test.R用于测试rmr2。在此脚本中,map函数使用R库,该库仅安装在客户机节点中,而不是安装在集群中。

显然,每个地图任务中的作业都会失败,因为它无法加载库。

我的问题是:

  • ¿如何在没有在具有管理员权限的所有节点中安装此库的情况下使用此库?

  • ¿如何附加,发送或分享? 每次我使用新的时,我都不想在每个节点中安装每个库。

  • 有可能吗?

我在hadoop中找不到类似于--jars的参数,或者在python中找不到spark中的--py-libs参数。

这是一个愚蠢的示例wordcount代码,它使用“tm”库(“stopword”函数),它安装在客户端,但不安装在集群的所有节点中。

Sys.setenv(HADOOP_CMD="/opt/cloudera/parcels/CDH-5.4.2-1.cdh5.4.2.p0.2/lib/hadoop/bin/hadoop")
Sys.setenv(HADOOP_CONF_DIR="/etc/hadoop/conf")
Sys.setenv(HADOOP_STREAMING="/opt/cloudera/parcels/CDH-5.4.2-1.cdh5.4.2.p0.2/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.4.2.jar")

library(rmr2)
library(tm)

map <- function(k,lines) {
  x = stopwords("en")
  y = paste(x, collapse=" ")
  words.list <- strsplit(paste(lines,y,sep=" "), '\\s')
  words <- unlist(words.list)
  sessionInfo()
  return( keyval(words, 1) )
}

reduce <- function(word, counts) {
  keyval(word, sum(counts))
}

wordcount <- function (input, output=NULL) {
  mapreduce(input=input, output=output, input.format="text", map=map, reduce=reduce)
}

## read text files from folder wordcount/data
## save result in folder wordcount/out

## Submit job
hdfs.root <- '/user/ec2-user/ '
hdfs.data <- file.path(hdfs.root, 'input')
hdfs.out <- file.path(hdfs.root, 'output_rmr2_external_test')
out <- wordcount(hdfs.data, hdfs.out)

从客户端节点执行:

Rscript test.R

编辑:

将此问题与Temporarily installing R packages on Hadoop nodes for streaming jobs

进行比较

1)这个问题与另一个问题具有相同的含义,但我认为这更为完整,因为有一个具体的例子和场景。所以我认为这更清楚。

2)第一个答案是你的,piccolbo,但它是从2012年开始,我们在2015年,所以我认为它已经过时了。其余的答案很有帮助,但根本没有。如果传递压缩的外部R库,则必须在每个节点上解压缩它并将路径添加到R的libPaths。是不是?但我不知道是否有参数。

3)我想知道这是否可能并且很容易。

谢谢

0 个答案:

没有答案