Hadoop執行Mapreduce作業時報錯:java.lang.OutOfMemoryError: Java heap space
阿新 • • 發佈:2019-02-10
一、概述
當在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>