在oozie使用hive上下文失败的Spark作业

时间:2017-03-09 07:34:21

标签: java apache-spark oozie orc hivecontext

在我们的一个管道中,我们使用spark(java)进行聚合,并使用oozie进行编排。 此管道使用以下行将聚合数据写入ORC文件。

HiveContext hc = new HiveContext(sc);
DataFrame modifiedFrame = hc.createDataFrame(aggregateddatainrdd, schema);

modifiedFrame.write().format("org.apache.spark.sql.hive.orc").partitionBy("partition_column_name").save(output);

当oozie作业中的spark动作被触发时,它会抛出以下异常

  

Oozie Launcher失败,主要课程   [org.apache.oozie.action.hadoop.SparkMain],main()抛出异常,   org.apache.hadoop.hive.shims.HadoopShims.isSecurityEnabled()z   java.lang.NoSuchMethodError:   org.apache.hadoop.hive.shims.HadoopShims.isSecurityEnabled()z

但是,在多次重新运行工作流程后,同样成功。

所有必需的罐子都在运行时和编译时都存在。

这是我的第一个火花应用,我无法理解这个问题。

有人可以帮助我更好地理解问题,并为此做出可能的解决方案。

1 个答案:

答案 0 :(得分:1)

  

"在多次重新运行工作流程后,同样成功了#34;

听起来您已经使用不同版本的Hadoop客户端编译/捆绑了Spark作业,而不是运行群集的Hadoop客户端。因此,CLASSPATH中存在冲突的JAR,并且您的作业随机失败,具体取决于首先拾取的JAR。

可以肯定的是,选择一个成功的Oozie工作和一个失败的工作,获得"外部ID"操作(标记为job_*******_****但引用YARN ID application_******_****并检查两个作业的YARN日志。您应该在Java CLASSPATH中看到JAR实际顺序的差异。

如果情况确实如此,那么尝试组合

  • 在Oozie操作中,将属性oozie.launcher.mapreduce.user.classpath.first设置为true (对于Spark驱动程序)
  • 在Spark配置中
  • ,将属性spark.yarn.user.classpath.first设置为true (对于执行程序)

你可以猜出 user.classpath.first 意味着......!


但是,如果冲突的JAR实际上不在Hadoop客户端但在Oozie ShareLib中,它可能无效。从YARN的角度来看,Oozie是"客户",你无法在Oozie从其ShareLib发布的内容与它从Spark作业中发布的内容之间设置优先级。

在这种情况下,您必须在Java项目中使用正确的依赖项,并匹配您将要运行的Hadoop版本 - 这只是常识,不要&#39你觉得呢?!?

相关问题