在我们正在使用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版本 - 这只是常识,您不认为吗?!?