问题描述:一个项目组的同事反应他们的集群hive突然出现了问题,走mr就报错
问题解决:首先问了下他们最近做了些什么操作,说是最近在lib下复制了一些jar包,后来就出现这个问题,把复制过来的jar包删除了也没用,发了些日志也只是hive报出来的表面现象,所以还是远程协助进行解决,打开resource manager查看到出错的日志如下
Application application_1464140393518_0021 failed 2 times due to Error launching appattempt_1464140393518_0021_000002. Got exception: org.apache.hadoop.yarn.exceptions.YarnException: Unauthorized request to start container.
This token is expired. current time is 1468393291214 found 1468392500369
at sun.reflect.GeneratedConstructorAccessor36.newInstance(Unknown Source)
...
大概意思是在创建container的时候没有权限,token过期了,最重要的一点是
current time is 1468393291214 found 1468392500369这说明时间同步可能有问题
让他们查了一下时间同步是否开启或者是否设置,最后查出来是因为ntp服务启了,但是可能中间有段时间有问题,服务器之间时间差异太大,同步时间后,再运行就不报这个错了
查看资料知道nodemanager有个NMLivelinessMonitor服务
该服务周期性遍历所有NodeManager,如果一个NodeManager在一定时间(可通过参数yarn.nm.liveness-monitor.expiry-interval-ms配置,默认为10min)内未汇报心跳信息,则认为它死掉了,它上面所有正在运行的Container将被置为运行失败(RM不会重新执行这些Container,它只会通过心跳机制告诉对应的AM,由AM决定是否重新执行,如果需要,则AM重新向RM申请资源)。
结合遇到的这个现象可以得出节点时间不同步导致时间相差太大,让nodemanager认为在超过10min没有汇报心跳
所以遇到问题不要只看表面现象,要根据日志进行分析解决