我试着用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
应用程序不应该需要太多资源—使用spark将单个csv(<10mb)加载到hive。
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启动程序,主类[org.apache.oozie.action.hadoop.sparkmain],调用main()的异常,permgen space
标准:
异常:java.lang.outofmemoryerror从线程“yarn application state monitor”中的uncaughtexceptionhandler抛出,失败的oozie启动程序,主类[org.apache.oozie.action.hadoop.sparkmain],调用main()的异常,permgen space
系统日志:
2017-03-14 12:31:19939错误[main]org.apache.hadoop.mapred.yarnchild:运行child:java.lang.outofmemoryerror:permgen space时出错
请建议增加哪些配置参数。
2条答案
按热度按时间qc6wkl3g1#
permgen内存是一种非堆内存,用于存储类元数据和字符串常量。如果没有class.forname()或任何其他第三方jar加载运行时类,它通常不会急剧增长。如果在启动应用程序时收到此错误消息,则意味着分配的永久生成空间小于应用程序中所有类文件实际需要的空间。
“-xx:maxpermsize=2g”
您已经为永久内存设置了2gb。您可以逐渐增加这个值,看看哪个值不会抛出内存错误并保留该值。还可以使用探查器监视永久生成的内存使用情况并设置正确的值。
如果此错误是在运行时触发的,则可能是由于运行时类加载或在永久生成中过度创建字符串常量所致。它需要分析您的应用程序来修复问题并为-xx:maxpermsize参数设置正确的值。
e4eetjau2#
这里至少有2个选项:1)通过将此添加到workflow.xml,增加启动器mr作业的permgen大小:
详情请参见:http://www.openkb.info/2016/07/memory-allocation-for-oozie-launcher-job.html
2) 首选的方法是使用Java8而不是过时的Java7