Hadoop Error Code 127排查:本地MapReduce正常集群运行失败
问题场景
本地运行mapper和reducer代码可得到预期输出,但在虚拟机上首次运行Hadoop Job时返回Error Code 127。查看Hadoop日志,多数日志提示/usr/bin/env: 'python': No such file or directory,系统已安装Python,但问题仍存在。终端运行截图显示任务执行时的错误状态,其中一份日志包含log4j警告信息:
Sep 12, 2023 7:58:26 PM com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory register INFO: Registering org.apache.hadoop.mapreduce.v2.app.webapp.JAXBContextResolver as a provider class
Sep 12, 2023 7:58:26 PM com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory register INFO: Registering org.apache.hadoop.yarn.webapp.GenericExceptionHandler as a provider class
Sep 12, 2023 7:58:26 PM com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory register INFO: Registering org.apache.hadoop.mapreduce.v2.app.webapp.AMWebServices as a root resource class
Sep 12, 2023 7:58:26 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate INFO: Initiating Jersey application, version 'Jersey: 1.19 02/11/2015 03:25 AM'
Sep 12, 2023 7:58:26 PM com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory getComponentProvider INFO: Binding org.apache.hadoop.mapreduce.v2.app.webapp.JAXBContextResolver to GuiceManagedComponentProvider with the scope "Singleton"
Sep 12, 2023 7:58:26 PM com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory getComponentProvider INFO: Binding org.apache.hadoop.yarn.webapp.GenericExceptionHandler to GuiceManagedComponentProvider with the scope "Singleton"
Sep 12, 2023 7:58:26 PM com.sun.jersey.guice.spi.container.GuiceComponentProviderFactory getComponentProvider INFO: Binding org.apache.hadoop.mapreduce.v2.app.webapp.AMWebServices to GuiceManagedComponentProvider with the scope "PerRequest"
log4j:WARN No appenders could be found for logger (org.apache.hadoop.mapreduce.v2.app.MRAppMaster).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
注:最后一份日志为空。
问题原因
核心原因是Hadoop执行MapReduce任务时,无法通过/usr/bin/env python找到Python解释器,常见情况包括:
- 系统仅安装了Python3,未创建
python软链接指向python3,导致/usr/bin/env找不到python命令; - mapper/reducer脚本的shebang行使用
#!/usr/bin/env python,但系统环境中无对应命令; - Hadoop运行时的环境变量未包含Python解释器的路径。
另外,日志中的log4j警告属于日志配置问题,与当前Error Code 127无关,不会影响任务执行,可后续再处理。
解决方案
方案1:创建Python软链接
在虚拟机终端执行以下命令,将python3软链接为python:
sudo ln -s /usr/bin/python3 /usr/bin/python
执行后验证:which python应返回/usr/bin/python。
方案2:修改脚本shebang行
直接修改mapper和reducer脚本的第一行,将:
#!/usr/bin/env python
替换为:
#!/usr/bin/env python3
确保脚本有执行权限:
chmod +x mapper.py reducer.py
方案3:配置Hadoop环境变量
编辑Hadoop的hadoop-env.sh文件(通常位于$HADOOP_HOME/etc/hadoop/目录),添加Python路径到环境变量:
export PATH=$PATH:/usr/bin
(若Python安装在其他路径,替换为实际路径)
内容的提问来源于stack exchange,提问作者Ganu Matta

