在Oozie中使用蜂巢上下文失败的Spark Job



在我们正在使用Spark(Java)进行聚合的管道中,它是使用Oozie进行策划的。该管道使用以下行将汇总数据写入兽人文件。

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作业中的火花动作时,它会引发以下异常

失败的Oozie发射器,主要班级 [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

,但是在多次重新启动工作流程后,这一成功率也会成功。

在运行时间和编译时间期间,所有必要的罐子都已到位。

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

有人可以帮助我更好地理解这个问题,也可能会解决相同的解决方案。

"在多次重新启动工作流程后,同样的成功"

听起来好像您已经在不同的版本中与Hadoop客户端编译/捆绑了Spark作业,而不是运行群集的;结果,class路径中存在冲突的罐子,而您的工作失败随机取决于首先拾取JAR。

可以肯定的是,选择一个成功的Oozie作业和一个失败的作业,获取操作的"外部ID" (标记为job_*******_****,但请参考YARN ID ID application_******_****纱线记录了这两个工作。您应该在Java Class Path中看到罐子的实际顺序。

如果确实如此,请尝试使用

的组合
  • 在Oozie Action中,将属性oozie.launcher.mapreduce.user.classpath.first设置为 true (对于火花驱动程序)
  • 在Spark配置中,将属性spark.yarn.user.classpath.first设置为true (对于执行者)

您可以猜测 user.classpath.first 暗示...!


但是,如果相互冲突的罐子实际上不在hadoop客户端,而是在Oozie Sharelib中,则可能行不通。从纱线的角度来看,Oozie是"客户",您无法在Sharelib的Oozie船只与Spark Job的船只之间设置优先级。

在这种情况下,您必须使用Java Project 中的适当依赖项,并匹配您将要使用的Hadoop版本 - 这只是常识,您不认为吗?!?

相关内容

  • 没有找到相关文章

最新更新