could't create native thread的問題跟蹤

一、問題描述

二、一些現象

       跑了一個map-reduce任務,這個任務處理的都是小文件,最後生成了2萬多個map任務。這個job中許多任務出現java.lang.OutOfMemoryError: unable to create new native thread,觀察了這個job的一些任務,發現這個任務的thread stack持續增長,最後有7000多個thread,最後導致java.lang.OutOfMemoryError: unable to create new native thread,因爲每個map任務分配的內存爲800m,ThreadStackSize是默認值1024k,最後導致內存耗盡。任務的線程棧中持續一下輸出:

"Thread-3689" daemon prio=10 tid=0x00007fb6bf364000 nid=0x2331 in Object.wait() [0x00007fb5b9b94000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:638)
        - locked <0x00000000f89800d0> (a java.util.LinkedList)

"Thread-3688" daemon prio=10 tid=0x00007fb6bf362000 nid=0x10a9 in Object.wait() [0x00007fb5b9c95000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:638)
        - locked <0x00000000f89701c0> (a java.util.LinkedList)

"Thread-3687" daemon prio=10 tid=0x00007fb6bf35a800 nid=0xf23 in Object.wait() [0x00007fb5b9d96000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:638)
        - locked <0x00000000f89681c0> (a java.util.LinkedList)

"Thread-3686" daemon prio=10 tid=0x00007fb6bf358800 nid=0xde9 in Object.wait() [0x00007fb5b9e97000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:638)

三、猜測

1、nodemanager的異常可能與這個有關,當該map-reduce所有任務調度到一臺機器(大概40個container),每個container中任務都生成7000個thread(生成很多小文件?)。導致耗盡max user processes(262144)。但nodemanger需要new thread的時候,出現java.lang.OutOfMemoryError: unable to create new native thread。(ps 昨天這個任務確實在定時跑)

2、可能是hadoop/yarn某些地方的內存溢出問題。參見一個類似的問題。https://issues.apache.org/jira/browse/YARN-4581


四、後記

       hadoop處理大量小文件,要使用org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat,並設置mapreduce.input.fileinputformat.split.maxsize = 5147483648

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章