簡體   English   中英

org.apache.hadoop.mapred.YarnChild:運行子級時出錯:java.lang.OutOfMemoryError:Java堆空間

[英]org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: Java heap space

我有一個90MB的快照壓縮文件,試圖將其用作AWS EMR中AMI 3.0.4上Hadoop 2.2.0的輸入。

嘗試讀取文件后,我的記錄讀取器立即收到以下異常:

2014-05-06 14:25:34,210 FATAL [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: Java heap space
at org.apache.hadoop.io.compress.BlockDecompressorStream.getCompressedData(BlockDecompressorStream.java:123)
at org.apache.hadoop.io.compress.BlockDecompressorStream.decompress(BlockDecompressorStream.java:98)
at org.apache.hadoop.io.compress.DecompressorStream.read(DecompressorStream.java:85)
at java.io.InputStream.read(InputStream.java:101)
at org.apache.hadoop.util.LineReader.readDefaultLine(LineReader.java:211)
at org.apache.hadoop.util.LineReader.readLine(LineReader.java:174)
at org.apache.hadoop.util.LineReader.readLine(LineReader.java:365)
...

我正在使用默認內存和io.sort.mb在AWS中的m1.xlarge上運行。 如果我們解壓縮文件並將其用作輸入,則一切正常。 問題是我們有大量的壓縮文件,並且不想四處解壓縮。

我不確定我們的代碼中是否缺少配置設置或接線。 不知道如何進行。

根據您提供的日志,似乎解壓縮塊的大小大於可用堆的大小。

我不了解EMR上的m1.large實例規范,但是您可以嘗試以下一些方法來避免此錯誤。

通常錯誤運行子意味着, 產生了紗線子找不到足夠的堆空間來繼續其MR工作

可以嘗試的選項:

1)增加mapred.java.child.opts大小。 這是子級作為其單獨的JVM進程獲得的默認大小。 默認情況下,它的200mb,對於任何合理的數據分析而言都是很小的。 更改參數-XmxNu (以u為單位的N的最大堆大小)和-XmsNu (以u為單位的N的初始堆大小)。 嘗試使用1Gb即-Xmx1g並查看效果,如果成功,則變小

2)將mapred.child.ulimit設置為先前設置的最大堆大小的1.5或2倍。 它設置進程的虛擬內存量。

3)減少mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum以設置一次運行的並行映射器和化mapred.tasktracker.reduce.tasks.maximum器的最大數量。

4) io.sort.mb您已經嘗試過了。 嘗試將其設置為0.25*mapred.child.java.opts < io.sort.mb < 0.5*mapred.child.java.opts

最后,這是一種反復試驗的方法,因此請嘗試看看哪一個是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM