Java 使用配置单元上下文的Spark作业在oozie中失败
在我们的一个管道中,我们使用sparkjava进行聚合,并使用oozie进行编排。 这将使用以下行将聚合数据管道写入ORC文件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
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来设置优先级。