当前位置: 首页 > 知识库问答 >
问题:

内存不足的spark应用程序报告Oozie工作流

濮阳宏硕
2023-03-14

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

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(

  • 火花版本: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启动器,Main类[org.apache.Oozie.action.hadoop.SparkMain],调用Main()的异常,PermGen空间

标准:

异常:java.lang.OutOfMemoryError从UncaughtExceptionHandler抛出线程"纱线应用程序状态监视器"失败Oozie启动器, Main类[org.apache.oozie.action.hadoop.SparkMain],异常调用main(), PermGen空间

系统日志:

2017-03-14 12:31:19939错误[主]组织。阿帕奇。hadoop。映射。YarnChild:运行子级java时出错。lang.OutOfMemoryError:PermGen空间

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

共有2个答案

冉伯寅
2023-03-14

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

“-XX:MaxPermSize=2g”

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

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

柯轶
2023-03-14

这里至少有2个选项:1)通过将其添加到工作流中,增加启动器MR作业的PermGen大小。xml:

<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)首选方法是使用Java8而不是过时的Java7

 类似资料:
  • 我已经建立了一个Spark and Flink k-means应用程序。我的测试用例是一个3节点集群上的100万个点的集群。 当内存瓶颈开始时,Flink开始外包给磁盘,工作缓慢,但工作正常。然而,如果内存已满,Spark将失去执行器,并再次启动(无限循环?)。 我尝试在邮件列表的帮助下自定义内存设置,谢谢。但是火花仍然不起作用。 是否需要设置任何配置?我是说Flink的记忆力很差,斯帕克也必须能

  • 我是否正确理解了客户端模式的文档? 客户端模式与驱动程序在应用程序主程序中运行的集群模式相反? 在客户端模式下,驱动程序和应用程序主程序是独立的进程,因此+必须小于计算机的内存? 在客户端模式下,驱动程序内存不包括在应用程序主内存设置中吗?

  • 5个节点各有4个内核和32GB内存,其中一个节点(节点4)有8个内核和32GB内存。 所以我总共有6个节点-28个核,192GB RAM。(我想使用一半的内存,但要使用所有的内核) 计划在集群上运行5个spark应用程序。 我的spark\u默认值。配置如下: 我想在每个节点上使用16GB max,并通过设置以下配置在每台机器上运行4个工作实例。所以,我希望(4个实例*6个节点=24个)集群上的工

  • 我正在尝试使用bin/spark-submit运行一个spark应用程序。当我引用本地文件系统中的应用程序jar时,它会正常工作。但是,当我将我的应用程序jar复制到hdfs中的一个目录时,我得到了以下异常: 我使用的是hadoop版本2.6.0和spark版本1.2.1