1. 程式人生 > >Hadoop執行Mapreduce作業時報錯:java.lang.OutOfMemoryError: Java heap space

Hadoop執行Mapreduce作業時報錯:java.lang.OutOfMemoryError: Java heap space

  一、概述

      當在Hadoop上執行Mapreduce作業來處理稍微大一點的資料量時,都會遇到報錯:java.lang.OutOfMemoryError: Java heap space的問題。我現在用的是CDH4,是基於Cloudera Manager來安裝的,所以配置檔案都是預設的,沒有手動改過配置。

二、問題原因

1、原始的Hadoop叢集中的mapred-site.xml的配置值很小,202058436位元組=192M

 <property>
    <name>mapred.child.java.opts</name>
    <value> -Xmx202058436</value>
  </property>

2、由於是基於Clousera Manager來安裝的,所以所有的服務的都必須通過它來啟動,這與apache hadoop很不一樣。所有的配置也都要通過Cloudera manager來修改。我曾經嘗試在安裝目錄下修改,然後啟動服務,可是當啟動服務之後,所有的配置又還原成原來的樣子了,反正修改不成功,具體原因我目前還不知道。

三、解決辦法

1、我通過Cloudera Manager管理介面來修改JVM引數,在每個節點的Tasktracker設定mapred.child.java.opts引數為3G記憶體,然後很著急的把Hadoop叢集重啟,接著馬上把之前的作業再重提交上去,大概等了40分鐘,那個JOB終於又報記憶體溢位了,讓我很糾結,之後靜下心來想一想,我自己打包的那個jar檔案裡又有三個配置檔案core-site.xml,hdfs-site.xml,mapred-site.xml。在mapred-site.xml裡的那個JVM引數並沒有改過來,其實Hadoop執行時是以Client提交的配置資訊為準的,叢集的配置資訊將會被覆蓋掉。


最終把我自己打包的那個jar包裡的mapred-site.xml裡修改mapred.child.java.opts引數如下,然後重新放到叢集上跑,大概只花7分鐘就跑完了。

 <property>
    <name>mapred.child.java.opts</name>
    <value> -Xmx3221225472</value>
  </property>