2017-03-14 65 views
0

我試圖執行與火花程序Oozie工作流作爲單一步驟。 我用它成功地執行JAR火花提交或火花外殼(同樣的代碼):Oozie工作流與火花應用程序報告內存不足

spark-submit --packages com.databricks:spark-csv_2.10:1.5.0 --master yarn-client --class "SimpleApp" /tmp/simple-project_2.10-1.1.jar 

應用不應該要求大量的資源 - 加載一個CSV(< 10MB)採用蜂巢火花。

  • 星火版本:1.6.0
  • Oozie的版本:4.1.0

工作流程與色調,Oozie的工作流編輯器創建:

<workflow-app name="Spark_test" xmlns="uri:oozie:workflow:0.5"> 
    <start to="spark-589f"/> 
    <kill name="Kill"> 
     <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
    </kill> 
    <action name="spark-589f"> 
     <spark xmlns="uri:oozie:spark-action:0.2"> 
      <job-tracker>${jobTracker}</job-tracker> 
      <name-node>${nameNode}</name-node> 
      <configuration> 
       <property> 
        <name>mapreduce.map.java.opts</name> 
        <value>-XX:MaxPermSize=2g</value> 
       </property> 
      </configuration> 
      <master>yarn</master> 
      <mode>client</mode> 
      <name>MySpark</name> 
      <jar>simple-project_2.10-1.1.jar</jar> 
       <spark-opts>--packages com.databricks:spark-csv_2.10:1.5.0</spark-opts> 
      <file>/user/spark/oozie/jobs/simple-project_2.10-1.1.jar#simple-project_2.10-1.1.jar</file> 
     </spark> 
     <ok to="End"/> 
     <error to="Kill"/> 
    </action> 
    <end name="End"/> 
</workflow-app> 

我被運行後,下列日誌工作流程:

標準輸出:

Invoking Spark class now >>> Invocation of Main class completed <<<

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], exception invoking main(), PermGen space

標準錯誤:

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "Yarn application state monitor" Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], exception invoking main(), PermGen space

系統日誌:

2017-03-14 12:31:19,939 ERROR [main] org.apache.hadoop.mapred.YarnChild: Error running child : java.lang.OutOfMemoryError: PermGen space

請建議其配置參數應該增加。

回答

2

你至少有2個選擇這裏: 1)加入這workflow.xml增加PermGen的大小發射MR工作:

<property> 
    <name>oozie.launcher.mapreduce.map.java.opts</name> 
    <value>-XX:PermSize=512m -XX:MaxPermSize=512m</value> 
</property> 

這裏查看詳細信息:http://www.openkb.info/2016/07/memory-allocation-for-oozie-launcher-job.html

2)首選方式是使用Java 8而不是過時的Java 7

+0

Java 7自帶CDH 5.9.0,我不想改變它。用java 8不會出現這種情況嗎? – caruso

0

PermGen內存是一個非堆內存,用於存儲類元數據和字符串常量。如果沒有通過class.forname()或任何其他第三方JAR加載運行時類,它通常不會大幅增長。 如果您在啓動應用程序後立即收到此錯誤消息,則表示分配的永久生成空間小於應用程序中所有類文件實際需要的空間。

「-XX:MaxPermSize參數= 2G」

您已經是PermGen的內存設置2GB。你可以逐漸增加這個值,看看哪個值不會拋出內存錯誤並保持這個值。您還可以使用分析器來監視永久生成的內存使用情況並設置正確的值。

如果在運行時觸發此錯誤,則可能是由於運行時類加載或永久生成中字符串常量的過度創建。它需要分析您的應用程序來解決問題併爲-XX:MaxPermSize參數設置正確的值。