通过Uber Jar与Oozie和Hue运行Spark作业

问题描述:

我目前正在学习如何使用Apache Oozie在CDH 5.8中运行Spark Jobs,但似乎发现问题。通过Uber Jar与Oozie和Hue运行Spark作业

我正在使用IntelliJ> Build Artifact(进入Uber JAR/Fat JAR)编译我的Spark工作,并稍后删除其清单文件。然后我运行spark-submit来运行JAR。它工作正常。

但是当我用Oozie指定Spark Action时。我得到以下错误:

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], exception invoking main(), java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.SparkMain not found 
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.SparkMain not found 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2199) 
    at org.apache.oozie.action.hadoop.LauncherMapper.map(LauncherMapper.java:234) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343) 
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1693) 
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 
Caused by: java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.SparkMain not found 
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:2105) 
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2197) 
    ... 9 more 

job.properties:

oozie.use.system.libpath=false 
security_enabled=False 
dryrun=False 
jobTracker=master.meshiang:8032 
nameNode=hdfs://master.meshiang:8020 

我的工作流程

<workflow-app name="CSV" xmlns="uri:oozie:workflow:0.4"> 
    <start to="spark-2bab"/> 
    <kill name="Kill"> 
     <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
    </kill> 
    <action name="spark-2bab"> 
     <spark xmlns="uri:oozie:spark-action:0.1"> 
      <job-tracker>${jobTracker}</job-tracker> 
      <name-node>${nameNode}</name-node> 
      <master>local[*]</master> 
      <mode>client</mode> 
      <name>MySpark</name> 
       <class>ETL.CSVTransform</class> 
      <jar>/user/meshiang/jar/Spark-GetData.jar</jar> 
       <arg>work_id</arg> 
       <arg>csv_table</arg> 
       <arg>id/FirstName/Lastname</arg> 
       <arg>/user/meshiang/csv/ST1471448595.csv</arg> 
       <arg>,</arg> 
     </spark> 
     <ok to="End"/> 
     <error to="Kill"/> 
    </action> 
    <end name="End"/> 
</workflow-app> 

我已经做了:

  1. 当我将同一个jar放入工作空间的/ lib文件夹中时,使用与上面相同的方法。这项工作持续了10分钟,自杀身亡,并没有显示任何错误代码或消息。
  2. 我在Hue中运行Spark示例作业。我得到了以下信息

错误:

JA018 
Error Message Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost): java.lang.RuntimeException: Stream '/jars/oozie-examples.jar' was not found. at org.apache.spark.network.client.TransportResponseHandler.handle(TransportResponseHandler.java:219) at org.apache.spark.network.server.TransportChannelHandler.channelRead0(TransportChannelHandler.java:106) at org.apache.spark.network.server.TransportChannelHandler.channelRead0(Tr 

我的问题

  1. 我应该只编译我需要的类和使用Oozie的ShareLibs? Oozie一般支持Uber JARS吗?
  2. 如果我使用Pig/Sqoop,我需要这样做吗?

要解决ClassNotFoundException: Class org.apache.oozie.action.hadoop.SparkMain需要启用oozie系统lib属性。

oozie.use.system.libpath=true. 

这是运行任何Hive,Pig,Sqoop,Spark等作业所必需的。

您可以编译和构建spark应用程序jar并将它们放入oozie应用程序路径下的lib目录中。 Oozie应用程序路径是HDFS中用于存储和引用workflow.xml文件的目录。

希望这会有所帮助。谢谢。

+0

谢谢你的回应!我试过,但Oozie纱线作业启动器,但它不断发送给我'ERROR [main] org.apache.hadoop.mapreduce.v2.app.MRAppMaster:错误启动MRAppMaster Java。 lang.NoSuchMethodError:org.apache.hadoop.yarn.webapp.util.WebAppUtils.getProxyHostsAndPortsForAmFilter'。任何想法为什么? –

+0

这是与您最初发布的不同的问题。检查纱线作业的'stdout'日志,你需要找到哪个jar包含'WebAppUtils'类,并且会有两个不同的版本。你可以删除一个(不正确的,没有方法的)jar,但你也需要找到jar的源代码并且永久修复它。谢谢, – YoungHobbit