上周赶数据处理需求,往Hadoop集群提交MapReduce任务后,终端就一直停在“Running job: job_xxxxxx”,等了5分钟都没动静。打开YARN的Web界面一看,任务状态一直是ACCEPTED,下面还挂着一行小字:“waiting for AM container to be allocated, launched and register with RM”。
眼看下班前要出结果,我盯着屏幕急得冒汗——相信做大数据开发的同学,都遇到过这种“任务卡住不动”的糟心场景。好在最后一步步排查出问题,30分钟就解决了,今天把整个过程梳理出来,帮大家少踩坑。
一开始我以为是任务提交命令写错了,重新执行了一遍yarn jar sunny.jar /sunny/access.log /sunny/out
,结果还是一样:终端只打印到“Submitted application application_xxxxxx”,之后就没下文了。
这时候别瞎猜,YARN的任务详情和日志是最好的线索。我打开YARN的Web控制台(默认地址是http://localhost:8088),找到卡住的任务点进去,在“Diagnostics”(诊断信息)里看到了关键提示:
ACCEPTED: waiting for AM container to be allocated, launched and register with RM.
翻译过来就是“等待AM容器分配、启动并向ResourceManager注册”——简单说,就是YARN的“资源管理器”没给任务分配到执行资源,问题肯定出在集群的资源配置或服务状态上。
接着我用jps
命令查看Hadoop相关进程是否正常,结果一眼看出了问题:
sphynx@sphynx-Ubuntu:~$ jps
15168 Jps
15073 RunJar
14609 ResourceManager # 资源管理器已启动
14257 DataNode # 数据节点已启动
14097 NameNode # 名称节点已启动
14458 SecondaryNameNode # secondary节点已启动
少了NodeManager进程! NodeManager是每个节点上负责管理容器、分配资源的核心组件,它没启动,YARN根本没法给任务分配容器(AM就是ApplicationMaster的容器),任务自然只能卡在ACCEPTED状态。
既然NodeManager没起来,下一步就是查它的启动日志——Hadoop的日志默认在$HADOOP_HOME/logs
目录下,找到yarn-sphynx-nodemanager-xxx.log
(sphynx是我的用户名),打开后很快看到了重复的报错:
Recieved SHUTDOWN signal from Resourcemanager, Registration of NodeManager failed, Message from ResourceManager: NodeManager from localhost doesn't satisfy minimum allocations, Sending SHUTDOWN signal to the NodeManager.
这句话直接点出了原因:NodeManager向ResourceManager注册时,因为“不满足最小资源分配要求”,被ResourceManager主动发送了关闭信号。
说白了就是:我当前节点的内存、CPU配置,没达到YARN要求的“最小资源标准”,所以NodeManager一启动就被干掉了。这时候再想一下,前几天刚给服务器装了其他服务,可能是Hadoop的默认资源配置不够用了。
找到问题根源,解决起来就很直接,核心是调整YARN的资源配置,让NodeManager满足最小资源要求。
Hadoop的配置文件默认在$HADOOP_HOME/etc/hadoop
目录下,我这里的路径是/usr/local/hadoop/etc/hadoop/yarn-site.xml
。用vim打开这个文件:
vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
在<configuration>
标签内,添加NodeManager的内存和CPU核心配置(根据自己服务器的硬件调整,我这里服务器是8G内存,所以给4G给NodeManager):
<property>
<!-- NodeManager可使用的最大内存,单位是MB -->
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value> <!-- 我设置为4096MB(4G),根据服务器内存调整 -->
</property>
<property>
<!-- NodeManager可使用的CPU核心数 -->
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>4</value> <!-- 服务器是8核,给4核足够用 -->
</property>
添加完后,按Esc
输入:wq
保存退出。
先停止当前的YARN服务(如果之前ResourceManager是启动的),再重新启动:
# 停止YARN服务(在Hadoop安装目录的sbin文件夹下)
cd /usr/local/hadoop/sbin
./stop-yarn.sh
# 启动YARN服务
./start-yarn.sh
启动完成后,再用jps
命令查看进程:
sphynx@sphynx-Ubuntu:~$ jps
17714 NodeManager # 终于看到NodeManager启动了!
16868 NameNode
17397 ResourceManager
17241 SecondaryNameNode
17034 DataNode
17852 Jps
NodeManager成功启动,这时候再重新提交MapReduce任务:
yarn jar sunny.jar /sunny/access.log /sunny/out
这次终端很快就打印出“Map 0% Reduce 0%”的进度条,YARN控制台里任务状态也从ACCEPTED变成了RUNNING——不到1分钟,任务就执行完成了!
yarn-用户名-nodemanager-xxx.log
,ResourceManager的日志在yarn-用户名-resourcemanager-xxx.log
,关键报错基本都在里面。最后再提醒一句:配置文件修改后,一定要重启对应的服务才能生效!我当时第一次改完没重启,以为配置没起作用,白慌了5分钟——大家别犯和我一样的低级错误~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。