Hadoop Streaming任务报错java.lang.RuntimeException求助
java.lang.RuntimeException故障排查 我需要在ego network中找出拥有最大圈子的节点及其大小,本地通过管道运行Python的Mapper和Reducer代码完全正常,输出最大圈子大小为308,但提交到Hadoop集群执行时触发java.lang.RuntimeException,任务直接失败。
一、输入文件示例
输入文件为ego network的节点圈子列表,每行格式如下:
节点ID 圈子内节点ID1,节点ID2,...
示例内容:
0 1,2,3,4
1 0,2,5,6
2 0,1,7,8,9
二、Mapper和Reducer代码
Mapper代码(mapper.py)
import sys for line in sys.stdin: line = line.strip() if not line: continue parts = line.split() ego_node = parts[0] circle_nodes = parts[1].split(',') circle_size = len(circle_nodes) print(f"{ego_node}\t{circle_size}")
Reducer代码(reducer.py)
import sys max_size = 0 max_node = None for line in sys.stdin: line = line.strip() if not line: continue node, size_str = line.split('\t') try: size = int(size_str) except ValueError: continue if size > max_size: max_size = size max_node = node print(f"{max_node}\t{max_size}")
三、集群运行命令
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \ -files /home/aosaf/Documents/semester5/MMDS/mapper.py,/home/aosaf/Documents/semester5/MMDS/reducer.py \ -mapper mapper.py \ -reducer reducer.py \ -input /user/aosaf/facebook \ -output /user/aosaf/facebook_max_circle_output
四、报错日志及任务执行详情
java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1
at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:320)
at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:533)
at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:130)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)
at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:465)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:349)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:174)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1730)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:168)
任务尝试1失败,退出状态为1,原因:进程退出,退出码1
故障排查与解决建议
对齐集群与本地的Python环境
本地使用python3,但集群节点可能默认Python版本为2.x,或未配置python3命令。解决方式:- 在Mapper和Reducer脚本开头添加指定解释器的shebang:
#!/usr/bin/env python3 - 或在Hadoop命令中显式指定Python路径:
-mapper "python3 mapper.py" \ -reducer "python3 reducer.py"
- 在Mapper和Reducer脚本开头添加指定解释器的shebang:
修复脚本权限问题
确保脚本在集群上有可执行权限:- 本地执行
chmod +x mapper.py reducer.py后再通过-files参数上传 - 或在命令中临时添加权限配置:
-mapper "chmod +x mapper.py && python3 mapper.py"
- 本地执行
验证集群输入文件的一致性
确认HDFS输入路径/user/aosaf/facebook下的文件格式、编码与本地完全一致,无异常空行或特殊字符。可通过以下命令查看集群输入内容:hdfs dfs -cat /user/aosaf/facebook/* | head -10查看脚本的stderr日志
通过YARN WebUI(如http://<resource-manager-ip>:8088)定位对应任务,查看Container日志中的stderr部分,里面会包含Python脚本的具体错误信息(如语法错误、依赖缺失)。在集群节点上手动测试脚本
登录任意Worker节点,上传脚本和测试数据,手动运行验证:echo "0 1,2,3,4" | python3 mapper.py | python3 reducer.py排查节点本地的环境或脚本执行问题。
内容的提问来源于stack exchange,提问作者hertz

