最近一段时间我们的Hbase集群所用的JobTracker(hadoop基线版本1.0.2)天天夜里挂起,停止服务,无法回应任何TaskTracker心跳,进而无法调度任务。以下是心跳汇报报错:
可以看出最后出错在fairscheduler调度任务阶段,有pool name是null,导致了最后排序报NPE错误。
最后查找这个NULL值得来源,通过jira发现社区已经发现了这一个问题,jira地址是https://issues.apache.org/jira/browse/MAPREDUCE-4195。 简单的说一下这个问题,第一步是有人通过脚本或者工具(不是通过页面链接)调用了jobqueue_details.jsp页面,错误发生在下面代码:
String queueName = request.getParameter("queueName"); TaskScheduler scheduler = tracker.getTaskScheduler(); Collection jobs = scheduler.getJobs(queueName); |
queueName传入的肯定是null,然后调用FairScheduler的getJobs,此时queueName是null。FairScheduler会调用PoolManager的getPool方法:
public synchronized Pool getPool(String name) { Pool pool = pools.get(name); if (pool == null) { pool = new Pool(scheduler, name); pool.setSchedulingMode(defaultSchedulingMode); pools.put(name, pool); } return pool; } |
通过这个方法,就产生了名称是NULL的queueName。此后就跟前文所说,调度器挂起,JT无法调度任何服务。解决方法:参见jira。
另外,提一下我们产生这个问题的原因,是由于Sina曾经被人攻陷内网,安全组有两台服务器不停的扫内部服务器端口,hadoop bug就这样被触发了。
赞