1

我有这种情况:

  • Hadoop 客户端节点(安装了 R 和 rmr2)
  • Hadoop 集群(安装在所有节点中的 R 和 rmr2)
  • 集群中没有用于安装外部库的管理员权限
  • 这个问题类似于临时在 Hadoop 节点上安装 R 包以进行流式作业,但我无法添加评论,因为我是新来的。

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

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

我的问题是:

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

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

  • 可能吗?

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

这是这个使用“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

编辑:

将此问题与在 Hadoop 节点上临时安装 R 包以进行流式作业进行比较

1)这个问题和另一个问题意思一样,但是我觉得这个更完整,因为有一个具体的例子和场景。所以我认为这更清楚。

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

3)我想知道这是否可能并且以一种简单的方式。

谢谢

4

0 回答 0