我有这种情况:
- 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)我想知道这是否可能并且以一种简单的方式。
谢谢