Apache spark 将类路径添加到Oozie工作流作业

Apache spark 将类路径添加到Oozie工作流作业,apache-spark,hive,oozie,Apache Spark,Hive,Oozie,我用Java编写了访问配置单元表的SparkSQL,并打包了一个可以使用spark submit运行的jar文件 现在,如果让工作流正常工作,我想以Oozie工作流和协调器的身份运行这个jar。当我尝试这样做时,作业失败,我进入Oozie作业日志 java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf 我所做的是在$HIVE_HOME/lib中查找包含该类的jar,将该jar复制到Oozie工作流根路径的lib路

我用Java编写了访问配置单元表的SparkSQL,并打包了一个可以使用spark submit运行的jar文件

现在,如果让工作流正常工作,我想以Oozie工作流和协调器的身份运行这个jar。当我尝试这样做时,作业失败,我进入Oozie作业日志

java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf
我所做的是在$HIVE_HOME/lib中查找包含该类的jar,将该jar复制到Oozie工作流根路径的lib路径中,并在Spark操作中将其添加到workflow.xml中:

<spark-opts> --jars lib/*.jar</spark-opts>
但是这导致了另一个java.lang.NoClassDefFoundError,它指向另一个丢失的类,所以我再次执行了查找jar和复制的过程,运行作业,同样的事情也发生了。看起来它需要依赖于我的配置单元库中的许多jar

我不明白的是,当我使用jar在shell中使用spark submit时,它运行正常,我可以选择并插入到我的配置单元表中。只有当我使用Oozie时才会发生这种情况。看起来Spark在Oozie工作流作业中再也看不到配置单元库了。有人能解释一下这是怎么发生的吗

如何向Oozie路径添加或引用必要的类/jar


我正在使用Cloudera Quickstart VM CDH 5.4.0、Spark 1.4.0、Oozie 4.1.0。

避免Oozie中的类路径未找到异常的更好方法是,在集群中安装Oozie SharedLib,并更新共享位置中的蜂巢/猪罐{有时Oozie共享位置中的现有罐用于与产品罐不匹配。} hdfs://hadoop:50070/user/oozie/share/lib/ 更新后,请传递一个参数 oozie.use.system.libpath=true

这些将通知oozie从Hadoop共享位置读取JAR


一旦您通过设置参数true提到了共享位置,您就不需要在工作流中逐一提到所有jar。xml通常,您可以连接到的边缘节点在默认类路径中预先安装并引用了大量内容。 但是Hadoop工作节点可能是赤裸裸的,只预先安装了核心Hadoop库

因此,您可以等待几年,让Oozie在ShareLib中正确打包Spark依赖项,并使用blablah.system.libpath标志

[编辑]如果基本Spark功能正常,但在配置单元格式界面上失败,则指定一个ShareLib列表,包括HCatalog,例如

action.sharelib.for.spark=spark,hcatalog
或者,您可以找出Spark实际使用的JAR和配置文件,将它们上载到HDFS,并在下的Oozie操作中逐一引用它们,以便在运行时在纱线容器的工作目录中下载它们

[EDIT]可能ShareLib包含JAR,但不包含配置文件;然后,您只需上传/下载一个有效配置文件列表,包括配置单元、Spark等等