Linux下Hadoop Streaming运行Python MapReduce任务失败的求助
解决Hadoop Streaming执行Python脚本的换行符与路径问题
问题根源
错误提示里的python 包含了Windows风格的换行符(\r),说明你的mapper.py和reducer.py是在Windows环境下编辑的,换行符为CRLF(\r\n),而Hadoop集群的Linux系统只识别LF(\n)换行符,导致shebang行被解析为#!/usr/bin/env python\r,系统找不到名为python\r的命令。另外,当文件不在同一目录时,Hadoop节点可能无法获取到脚本文件。
解决方案
1. 修复脚本换行符
将脚本的CRLF换行符替换为LF:
- 命令行方式:在Linux环境中执行以下命令修改两个脚本:
sed -i 's/\r$//' mapper.py reducer.py - 编辑器方式:用VS Code、Sublime等编辑器打开脚本,右下角切换换行符为
LF,保存后重新上传到集群。
2. 修正shebang行
确保脚本第一行的shebang格式正确:
- 优先使用集群中Python的绝对路径(先执行
which python或which python3查看路径),比如:#!/usr/bin/python3 - 避免使用可能存在环境变量问题的
#!/usr/bin/env python,如果一定要用,确保集群所有节点的环境变量中能找到python命令。
3. 给脚本添加执行权限
在本地或集群上执行命令,赋予脚本可执行权限:
chmod +x mapper.py reducer.py
4. 提交任务时正确分发脚本
执行Hadoop Streaming任务时,必须用-files参数将脚本上传到分布式缓存,确保所有节点都能获取到脚本,示例命令:
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \ -files mapper.py,reducer.py \ -mapper mapper.py \ -reducer reducer.py \ -input /hdfs/path/to/diamonds.txt \ -output /hdfs/path/to/result_output
注意:-input和-output需要使用HDFS路径,而非本地路径。
内容的提问来源于stack exchange,提问作者luan_navarro
相关产品推荐
相关产品推荐

