一、問題描述
之前因爲
java.lang.OutOfMemoryError: unable to create new native thread
設置了Xss參數,見http://zouqingyun.blog.51cto.com/782246/1879975nodeManager仍然出現該異常,同時map-reduce的任務中也出現該異常
二、一些現象
跑了一個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