在我们的一个管道中,我们使用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
但是,在多次重新运行工作流程后,同样成功。
所有必需的罐子都在运行时和编译时都存在。
这是我的第一个火花应用,我无法理解这个问题。
有人可以帮助我更好地理解问题,并为此做出可能的解决方案。
答案 0 :(得分:1)
"在多次重新运行工作流程后,同样成功了#34;
听起来您已经使用不同版本的Hadoop客户端编译/捆绑了Spark作业,而不是运行群集的Hadoop客户端。因此,CLASSPATH中存在冲突的JAR,并且您的作业随机失败,具体取决于首先拾取的JAR。
可以肯定的是,选择一个成功的Oozie工作和一个失败的工作,获得"外部ID"操作(标记为job_*******_****
但引用YARN ID application_******_****
)并检查两个作业的YARN日志。您应该在Java CLASSPATH中看到JAR实际顺序的差异。
如果情况确实如此,那么尝试组合
oozie.launcher.mapreduce.user.classpath.first
设置为true
(对于Spark驱动程序) spark.yarn.user.classpath.first
设置为true
(对于执行程序) 你可以猜出 user.classpath.first 意味着......!
在这种情况下,您必须在Java项目中使用正确的依赖项,并匹配您将要运行的Hadoop版本 - 这只是常识,不要&#39你觉得呢?!?