【问题标题】:Oozie workflow with spark application reports out of memory带有 Spark 应用程序的 Oozie 工作流报告内存不足
【发布时间】:2017-03-14 12:10:05
【问题描述】:

我尝试使用 Spark 程序作为单步执行 Oozie 工作流。 我使用了通过 spark-submit 或 spark-shell 成功执行的 jar(相同的代码):

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

应用程序不应需要大量资源 - 使用 spark 将单个 csv (

  • Spark 版本:1.6.0
  • Oozie 版本:4.1.0

工作流程是使用 Hue、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>

运行工作流后我得到以下日志:

标准输出:

现在调用 Spark 类 >>> 主类调用完成

Oozie Launcher 失败,主类 [org.apache.oozie.action.hadoop.SparkMain],异常调用 main(),PermGen 空间

标准错误:

异常:从线程“Yarn 应用程序状态监视器”中的 UncaughtExceptionHandler 抛出 java.lang.OutOfMemoryError Oozie Launcher 失败,主类 [org.apache.oozie.action.hadoop.SparkMain],异常调用 main(),PermGen 空间

系统日志:

2017-03-14 12:31:19,939 错误 [main] org.apache.hadoop.mapred.YarnChild:运行子错误:java.lang.OutOfMemoryError:PermGen 空间

请建议应该增加哪些配置参数。

【问题讨论】:

    标签: hadoop apache-spark memory workflow oozie


    【解决方案1】:

    您在这里至少有 2 个选项: 1) 通过将其添加到 workflow.xml 来增加启动器 MR 作业的 PermGen 大小:

    <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

    【讨论】:

    • Java 7 附带 CDH 5.9.0,我不想更改它。 java 8不会出现这种情况吗?
    【解决方案2】:

    PermGen 内存是一种非堆内存,用于存储类元数据和字符串常量。如果没有通过 class.forname() 或任何其他第三方 JAR 加载运行时类,它通常不会大幅增长。 如果您在启动应用程序时立即收到此错误消息,则表示分配的永久代空间小于应用程序中所有类文件实际所需的空间。

    "-XX:MaxPermSize=2g"

    您已经为 PermGen 内存设置了 2gb。您可以逐渐增加此值,并查看哪个值不会抛出 outofmemoryerror 并保持该值。您还可以使用分析器来监控永久代的内存使用情况并设置正确的值。

    如果在运行时触发此错误,则可能是由于运行时类加载或永久生成中过度创建字符串常量。它需要分析您的应用程序以解决问题并为 -XX:MaxPermSize 参数设置正确的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多