将一个项目在服务器上启动提交给hadoop集群的任务上出错了,改如何调试?
总结下:如何去找错的思路。整体围绕: 数据、模型、代码三个方面。此处提下查看代码出错问题。
在服务器启动脚本,如sh train.sh后,通常会在log目录下,有运行脚本对应的log信息文件,如train_20200827.log,用vim 打开log,信息中大概60行上下会有对应application的监控hadoop的监控面板,类似
The url to track the job: http://yz70210.hadoop.data.sina.com.cn:9008/proxy/application_1594195336447_10990716/ 。将http的链接复制到浏览器中,便可以看到对应正在运行的application的信息,查看任务失败的节点信息 。如图
会弹出失败的节点信息如:
进一步点击里面,去查看logs里的详细的报错信息
往下拉,可以看到具体是代码哪个地方出错了
自己主动将有节点报错的application结束.命令:
yarn application -kill applicatioID
如:
yarn application -kill application_1594195336447_16535164
如果当整个程序已经结束,即浏览器打开的地址将失效(打不开),这个时候只能通过yarn logs 去把错误日志信息拉取下来。
案例:服务器本地的log下的train.sh_20200912_221837_11852_16202.log只能看到是否运行正常或失败的信息,看不到具体的跑的程序的报错信息。查看具体节点的报错信息需要将yarn上的日志拉取下来。
拉取格式为:
yarn logs --applicationId=TrainXXX.log里的applicationId名字(注意带着application)开头 >导入的本地文件名
如:
yarn logs --applicationId=application_1594195336447_14561477 > yarnlogapplication_1594195336447_14561477
然后用vi 打开,到里面去搜Exception 。快捷查询(/Exception)或 error 或limits(可能内存溢出)
搜索limit 可以看到里面有
1] is running beyond physical memory limits. Current usage: 8.0 GB of 8 GB physical memory used; 50.3 GB of 16.8 GB virtual memory used. Killing container.
即自己的内存溢出了。自己申请的只有8个G,但是实际产生的物理内存超过了内训限制,container被killing了。此即找到了代码存在的问题