Java 使用配置单元上下文的Spark作业在oozie中失败

Java 使用配置单元上下文的Spark作业在oozie中失败,java,apache-spark,oozie,orc,hivecontext,Java,Apache Spark,Oozie,Orc,Hivecontext,在我们的一个管道中,我们使用sparkjava进行聚合,并使用oozie进行编排。 这将使用以下行将聚合数据管道写入ORC文件 HiveContext hc = new HiveContext(sc); DataFrame modifiedFrame = hc.createDataFrame(aggregateddatainrdd, schema); modifiedFrame.write().format("org.apache.spark.sql.hive.orc").partitionB

在我们的一个管道中,我们使用sparkjava进行聚合,并使用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启动器,主类 [org.apache.oozie.action.hadoop.SparkMain],main抛出异常, org.apache.hadoop.hive.shimmes.hadoopshimmes.isSecurityEnabledZ java.lang.NoSuchMethodError: org.apache.hadoop.hive.shimmes.hadoopshimmes.isSecurityEnabledZ

但在多次重新运行工作流后,同样的操作也会成功

所有必要的jar都在运行时和编译时就位

这是我的第一个spark应用程序,我无法理解这个问题

有人能帮助我更好地理解这个问题,并为同样的问题提供可能的解决方案吗

在多次重新运行工作流后,同样的操作也会成功

听起来你已经用一个不同于运行集群的Hadoop客户端的版本编译/绑定了Spark作业;因此,类路径中存在冲突的JAR,并且根据首先拾取哪个JAR,您的作业会随机失败

可以肯定的是,选择一个成功的Oozie作业和一个失败的Oozie作业,获取标记为job*************但引用纱线ID应用程序的操作的外部ID,并检查两个作业的纱线日志。您应该看到Java类路径中JAR的实际顺序有所不同

如果确实如此,那么尝试以下组合

在Oozie操作中,将Spark驱动程序的属性Oozie.launcher.mapreduce.user.classpath.first设置为true 在Spark配置中,将执行器的属性Spark.Thread.user.classpath.first设置为true 您可以猜user.classpath.first意味着什么

但是,如果冲突JAR实际上不在Hadoop客户机中,而是在Oozie共享库中,那么它可能不起作用。从纱线的角度来看,Oozie是客户机,您不能在Oozie从其ShareLib发布的内容与Spark工作发布的内容之间设置优先级


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

谢谢Samson,您提到的内容很有意义,我已经开始朝这个方向进行调试,但是我有一个疑问,关于类路径,我可以看到两个方面:一个是java.class.path在顶部,另一个是ClassPath元素,哪一个将由spark加载?它们应该匹配-都是来自Oozie launcher类的调试跟踪。谢谢samson!JAR的执行顺序导致了这个问题,我使用oozie.launcher.mapreduce.user.classpath.first来设置优先级。