【发布时间】:2013-10-16 15:28:07
【问题描述】:
我正在尝试在单节点 Hadoop 集群中使用 rmr2 运行一个简单的 MR 程序。这是设置的环境
Ubuntu 12.04(32 位)
R(Ubuntu 自带 2.14.1,所以更新到 3.0.2)
从here 安装了最新的 rmr2 和 rhdfs 以及相应的依赖项
Hadoop 1.2.1
现在我正在尝试运行一个简单的 MR 程序
Sys.setenv(HADOOP_HOME="/home/training/Installations/hadoop-1.2.1")
Sys.setenv(HADOOP_CMD="/home/training/Installations/hadoop-1.2.1/bin/hadoop")
library(rmr2)
library(rhdfs)
ints = to.dfs(1:100)
calc = mapreduce(input = ints, map = function(k, v) cbind(v, 2*v))
from.dfs(calc)
mapreduce 作业失败,并在 hadoop-1.2.1/logs/userlogs/job_201310091055_0001/attempt_201310091055_0001_m_000000_0/stderr 中显示以下错误消息
Error in library(functional) : there is no package called ‘functional’
Execution halted
java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1
at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:362)
at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:576)
但是,sessionInfo() 显示功能包已加载
> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: i686-pc-linux-gnu (32-bit)
>locale:
[1] LC_CTYPE=en_IN LC_NUMERIC=C LC_TIME=en_IN
[4] LC_COLLATE=en_IN LC_MONETARY=en_IN LC_MESSAGES=en_IN
[7] LC_PAPER=en_IN LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=en_IN LC_IDENTIFICATION=C
>attached base packages:
[1] stats graphics grDevices utils datasets methods base
>other attached packages:
[1] rhdfs_1.0.6 rJava_0.9-4 rmr2_2.3.0 reshape2_1.2.2 plyr_1.8
[6] stringr_0.6.2 **functional_0.4** digest_0.6.3 bitops_1.0-6 RJSONIO_1.0-3
[11] Rcpp_0.10.5
更新:我可以在不使用here 中提到的 rmr2 和 rhdfs 库的情况下运行从 STDIO 读取和写入的 R MR 作业。所以,目前我的猜测是问题与 rmr2 和 rhdfs 包有关。
如何解决这个问题?
【问题讨论】:
-
您升级 R 并以
sudo ...(以 root 身份)安装所有软件包了吗?也许您遇到了用户与系统上下文问题。在 hadoop 中运行的 R 脚本所看到的环境可能与从用户的交互式 R 命令行看到的环境不同,这似乎是您正在运行sessionInfo()的位置。你可以在脚本中运行sessionInfo()吗? -
感谢 Stuart,我已经使用
sudo apt-get ...命令安装了 R 并将 R 包升级到私有库。我能够使用vm4learning用户成功运行 MR 程序(Java 和 Streaming)和简单的 R 程序。他们两个的用户都是相同的,所以似乎没有上下文问题。问题是使用 rmr 包作为vm4learning用户运行 R MR 程序。
标签: r hadoop mapreduce hadoop-streaming revolution-r