Tag Archives: unable to create new native thread

Aliyun EMR 值班问题解决汇总–DataNode不断掉线问题

在最近给一个大用户排查问题的过程中,发现了这个问题。

现象

客户的DataNode在40分钟内相继有5台掉线,导致了大量的块under replica,客户认为是Hadoop DataNode问题,向我们反馈。

排查

看了客户的ganglia后发现客户的进程总数在那段时间不断增加,直到超过了ulimit。先查看了NameNode的日志,发现这一时期DataNode心跳都超时了,导致了DataNode被认为dead。再查看了一下DataNode的日志,有大量的无法创建线程日志

2017-12-15 10:58:01,078 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Unexpected exception in block pool Block pool ****** (Datanode Uuid ******) service to ******
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.transferBlock(DataNode.java:1922)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.transferBlocks(DataNode.java:1930)
    at org.apache.hadoop.hdfs.server.datanode.BPOfferService.processCommandFromActive(BPOfferService.java:657)
    at org.apache.hadoop.hdfs.server.datanode.BPOfferService.processCommandFromActor(BPOfferService.java:615)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.processCommand(BPServiceActor.java:858)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.offerService(BPServiceActor.java:672)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:824)
    at java.lang.Thread.run(Thread.java:745)

这个错误一般是由下面两方面造成的
1.ulimit设置不合理,设置 /etc/security/limits.d/20-nproc.conf (CentOs 7), /etc/security/limits.conf
2.异常程序耗尽资源
排查了一下ulimit,是正常的。再查看了一下DataNode的其它日志,并没有发现态度异常,gc情况也是正常的,于是怀疑是异常任务导致的。
于是查看了一下客户的NodeManager日志,发现了异常的任务日志:

2017-12-15 11:00:26,023 WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor: Exception from container-launch with container ID: container_****** and exit code: 52
ExitCodeException exitCode=52:
        at org.apache.hadoop.util.Shell.runCommand(Shell.java:545)
        at org.apache.hadoop.util.Shell.run(Shell.java:456)
        at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722)
        at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:212)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

这是一个spark任务,查看了一下spark任务异常退出值,52代表了OutOfMemory Error,同时看了一下这个程序监控的proc情况,发现了虚拟内存到110G。所以怀疑是这个程序造成的问题。

结论

最后将我们的结论很快反馈给了客户,让用户检查一下程序,客户找到了相关人员,发现是由于使用线程没有释放,不断生成线程导致的,把异常程序停止后集群恢复正常。