7.6 解决RHadoop安装错误:PipeMapRed.waitOutputThreads()

问题

Hadoop安装过程中,PipeMapRed.waitOutputThreads()的错误,如何解决?

引言

一行错误难倒一片同学,在使用RHadoop的rmr2包过程中,经常会遇到的一个错误 PipeMapRed.waitOutputThreads(): subprocess failed with code 1。错误原因是什么,又该如何解决呢?本节将告诉你答案。

可能出错的代码,如下所示。

> small.ints = to.dfs(1:10)
> mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
> from.dfs("/tmp/RtmpWnzxl4/file5deb791fcbd5")

7.6.1 rmr2运行错误日志

本节使用的系统环境:

  • Linux Ubuntu 12.04.2 LTS 64bit server
  • R 2.15.3 64bit
  • Java JDK 1.6.x
  • Hadoop 1.1.2
  • IP: 192.168.1.243

R运行过程中的错误日志:

packageJobJar: [/tmp/Rtmpdf7egm/rmr-local-env3cbb70983, /tmp/Rtmpdf7egm/rmr-global-env3cbb654b85fe, /tmp/Rtmpdf7egm/rmr-streaming-map3cbba213f2e, /home/conan/hadoop/tmp/hadoop-unjar1697638502297829404/] [] /tmp/streamjob4620072667602885650.jar tmpDir=null

13/06/23 10:44:25 INFO mapred.FileInputFormat: Total input paths to process : 1
13/06/23 10:44:25 INFO streaming.StreamJob: getLocalDirs(): [/home/conan/hadoop/tmp/mapred/local]
13/06/23 10:44:25 INFO streaming.StreamJob: Running job: job_201306231032_0001
13/06/23 10:44:25 INFO streaming.StreamJob: To kill this job, run:
13/06/23 10:44:25 INFO streaming.StreamJob: /home/conan/hadoop/hadoop-1.1.2/libexec/../bin/hadoop job  -Dmapred.job.tracker=hdfs://master:9001 -kill job_201306231032_0001
13/06/23 10:44:25 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201306231032_0001
13/06/23 10:44:26 INFO streaming.StreamJob:  map 0%  reduce 0%
13/06/23 10:45:04 INFO streaming.StreamJob:  map 100%  reduce 100%
13/06/23 10:45:04 INFO streaming.StreamJob: To kill this job, run:
13/06/23 10:45:04 INFO streaming.StreamJob: /home/conan/hadoop/hadoop-1.1.2/libexec/../bin/hadoop job  -Dmapred.job.tracker=hdfs://master:9001 -kill job_201306231032_0001
13/06/23 10:45:04 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201306231032_0001
13/06/23 10:45:04 ERROR streaming.StreamJob: Job not successful. Error: # of failed Map Tasks exceeded allowed limit. FailedCount: 1. LastFailedTask: task_201306231032_0001_m_000000
13/06/23 10:45:04 INFO streaming.StreamJob: killJob...
Streaming Command Failed!
Error in mr(map = map, reduce = reduce, combine = combine, vectorized.reduce,  :
  hadoop streaming failed with error code 1

我们光看上面的日志,根本发现不了hadoop的实际错误是什么!

7.6.2 定位错误到hadoop日志

接下来需要定位到实际错误的位置。为了方便查询日志,我们打开jobtracker的控制台( http://192.168.1.210:50030/jobtracker.jsp )。并找到刚才出现错误的日志中有提示的网页位置(http://master:50030/jobdetails.jsp?jobid=job_201306231032_0001),如图7-3所示。

jobtracker控制台

图7-3 jobtracker控制台

查看map的错误,现在已经明确有了错误定义。

Running a job using hadoop streaming and mrjob: PipeMapRed.waitOutputThreads(): subprocess failed with code 1
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) at
org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:135) at
org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57) at
org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36) at
org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436) at
org.apache.hadoop.mapred.MapTask.run(MapTask.java:372) at
org.apache.hadoop.mapred.Child$4.run(Child.java:255) at
java.security.AccessController.doPrivileged(Native Method) at
javax.security.auth.Subject.doAs(Subject.java:396) at
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121) at
org.apache.hadoop.mapred.Child.main(Child.java:249)

下面我们将通过两种方法,排查并解决错误。

7.6.3 从hadoop入手找解决办法 — 失败

看hadoop错误列表:code 1的错误

“OS error code 1: Operation not permitted”"OS error code 2: No such file or directory”

从错误描述来看,这里是一个权限的错误。我来分析一下,RHadoop运行时环境中的用户和用户组的权限。

  • Hadoop的启动用户: 用户conan, 用户组conan
  • R语言的启动用户: 用户conan, 用户组conan

既然都是相同权限的用户,怎么会有权限的问题呢? 我在另外一个Hadoop环境做了测试,使用root用户,就没有发生上面的错误。

好了,这样问题已经很具体了,我们去网上查找一下错误原因。通过google搜索“org.apache.hadoop.security.AccessControlException”。根据网上找到的答案,我们在Hadoop的配置中进行调整,在hdfs-site.xml中增加dfs.permissions.superusergroup的定义。至于superusergroup配置项的默认值用什么我们可以在系统中查一下。

~ hadoop fs -ls /
drwxr-xr-x   - conan supergroup          0 2013-04-24 01:52 /hbase
drwxr-xr-x   - conan supergroup          0 2013-04-25 04:59 /home
drwxr-xr-x   - conan supergroup          0 2013-06-23 10:44 /tmp
drwxr-xr-x   - conan supergroup          0 2013-04-24 19:28 /user

这样就得到了默认的group的名字是supergroup, 我们修改hdfs-site.xml,增加dfs.permissions.superusergroup的定义。

~ vi $HADOOP_HOME/conf/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.data.dir</name>
        <value>/home/conan/hadoop/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.permissions.superusergroup</name>
        <value>supergroup</value>
    </property>
</configuration>

重启Hadoop集群,重启R程序,重新执行rmr2脚本。还是有错误,没有解决错误问题。

重启Hadoop集群,重启R程序,重新执行rmr2脚本。还是有错误,没有解决错误问题。

我们找到RHadoop的Github的issue 122: https://github.com/RevolutionAnalytics/RHadoop/issues/122,发现其他人也遇到了类似的错误,看到这issue已经是closed状态,证明错误已经解决。根据作者的回答我们发现,错误是由于:“R的类库在特定的用户下面,而不是标准合位置,导致类库不能被hadoop找到”。在我的环境中,发现也是同样的配置与错误描述一致。

~ R  # 启动R程序
> .libPaths()  # 查看R包的安装目录
[1] "/home/conan/R/x86_64-pc-linux-gnu-library/2.15"
[2] "/usr/local/lib/R/site-library"
[3] "/usr/lib/R/site-library"
[4] "/usr/lib/R/library"

~ ls /home/conan/R/x86_64-pc-linux-gnu-library/2.15  # 通过命令查看目录中的R包
colorspace  functional  iterators  munsell  RColorBrewer  rhdfs    rmr2
dichromat   ggplot2     itertools  plyr     Rcpp          rJava    scales
digest      gtable      labeling   proto    reshape2      RJSONIO  stringr
~ ls /usr/local/lib/R/site-library  # /usr/local目录是空的

这时发现,我环境中安装的所有类库,都在/home/conan 目录下面,而/usr/local/lib/R/site-library目录下,一个包都没有。于是我们按照RHadoop作者指示,以root权限,把RHadoop包进行重新安装。

~ sudo -i   #切换到root下面
~ R   #查看R的类库路径
> .libPaths()
[1] "/usr/local/lib/R/site-library" "/usr/lib/R/site-library"
[3] "/usr/lib/R/library"
~ R CMD javareconf    #在root下进行安装
~ R   #启动R程序
> install.packages("rJava")  # 安装rmr2的依赖包
> install.packages("reshape2")
> install.packages("Rcpp")
> install.packages("iterators")
> install.packages("itertools")
> install.packages("digest")
> install.packages("RJSONIO")
> install.packages("functional")

~ cd /home/conan/R
~ R CMD INSTALL rmr2_2.1.0.tar.gz   # 安装rmr2包
~ ls /usr/local/lib/R/site-library   # /usr/local目录有了R包
digest  functional  iterators  itertools  plyr  Rcpp  reshape2  rJava  RJSONIO  rmr2  stringr

依赖包都安装在了/usr/local/lib/R/site-library下面,我们退出root用户,重新启动R程序测试。

~ exit   # 退出root用户
~ whoami   # 检查当前用户

conan
~ R  # 重新启动R程序
> library(rmr2)
Loading required package: Rcpp
Loading required package: RJSONIO
Loading required package: digest
Loading required package: functional
Loading required package: stringr
Loading required package: plyr
Loading required package: reshape

> small.ints = to.dfs(1:10)   #再次运行 rmr2程序
> mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
packageJobJar: [/tmp/RtmpM87JEc/rmr-local-env1c7588ca7ed, /tmp/RtmpM87JEc/rmr-global-env1c77fdcab5f, /tmp/RtmpM87JEc/rmr-streaming-map1c76a4ddf6e, /home/conan/hadoop/tmp/hadoop-unjar6992113986427459004/] [] /tmp/streamjob2762947354578034435.jar tmpDir=null
13/06/23 13:27:36 INFO mapred.FileInputFormat: Total input paths to process : 1
13/06/23 13:27:36 INFO streaming.StreamJob: getLocalDirs(): [/home/conan/hadoop/tmp/mapred/local]
13/06/23 13:27:36 INFO streaming.StreamJob: Running job: job_201306231141_0007
13/06/23 13:27:36 INFO streaming.StreamJob: To kill this job, run:
13/06/23 13:27:36 INFO streaming.StreamJob: /home/conan/hadoop/hadoop-1.1.2/libexec/../bin/hadoop job  -Dmapred.job.tracker=hdfs://master:9001 -kill job_201306231141_0007
13/06/23 13:27:36 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201306231141_0007
13/06/23 13:27:37 INFO streaming.StreamJob:  map 0%  reduce 0%
13/06/23 13:27:51 INFO streaming.StreamJob:  map 100%  reduce 0%
13/06/23 13:27:58 INFO streaming.StreamJob:  map 100%  reduce 100%
13/06/23 13:27:58 INFO streaming.StreamJob: Job complete: job_201306231141_0007
13/06/23 13:27:58 INFO streaming.StreamJob: Output: /tmp/RtmpM87JEc/file1c722c5c6ae

执行成功, 错误解决!!

节从发现错误、定位错误、查找原因、解决错误4个步骤解决上面的问题。希望给遇到问题束手无策的同学,不仅提供直接的错误帮助,更有一个思路上的启发,提高自己的动手能力!!

到这里为止,本书的正文部分就结束了,感谢你的阅读。希望这本书能为你开启新的大门。另外,本书的姊妹篇《R的极客理想——高级开发篇》会为你介绍更多的R语言深入学习的内容,还有很多的东西值得探索。我很期待你能使用在本书里学到的工具和技术开发出一些有趣的应用。

results matching ""

    No results matching ""