2015-07-21 111 views
1

我编写了SparkSQL,它访问Java中的Hive表,并打包了一个可以使用​​运行的jar文件。将CLASSPATH添加到Oozie工作流程作业

现在我想运行这个jar作为Oozie工作流程(和协调器,如果我让工作流程工作)。当我尝试这样做,作业失败,我在Oozie的作业日志得到

java.lang.NoClassDefFoundError: org/apache/hadoop/hive/conf/HiveConf 

我所做的就是寻找在$HIVE_HOME/lib包含类的jar,复制罐子在我Oozie的的lib路径工作流的根路径,在Spark行动将其添加到workflow.xml

<spark-opts> --jars lib/*.jar</spark-opts> 

但是,这导致另一个java.lang.NoClassDefFoundError指向另一个失踪课,所以我又做了寻找罐子和复制的过程中,运行作业同样的事情都结束了。看起来它需要依赖于我的Hive lib中的许多jar。

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

如何添加或引用必要的类/罐到Oozie路径?

我使用的是Cloudera Quickstart VM CDH 5.4.0,Spark 1.4.0,Oozie 4.1.0。

回答

1

通常情况下,“边缘节点”(一个你可以提到的共享位置连接到)有很多东西预先安装并在默认的CLASSPATH中引用。 但是Hadoop的“工作节点”可能是准系统,只有预先安装的核心Hadoop库。

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

[编辑]如果基本火花功能是确定的,但你失败蜂房格式接口上,然后指定包括“HCatalog”一个列表 ShareLibs的例如

action.sharelib.for.spark=spark,hcatalog 

或者,你可以找出哪些JAR文件和配置文件实际使用的火花,将它们上传到HDFS,并在<文件>所以你Oozie的动作引用它们(所有的人,一个接一个)它们是在运行时在YARN容器的工作目录中下载的。

[编辑]也许ShareLibs包含JAR但不包含配置文件;那么所有你必须上传/下载的是一个有效的配置文件列表(Hive,Spark,不管)

1

避免Oozie中找不到ClassPath异常的更好方法是,在集群中安装Oozie SharedLib,并更新共享位置中的Hive/Pig jar {Oozie Shared Location中的某些时候存在的Jar以获得不匹配与产品罐} HDFS://的hadoop:50070 /用户/ Oozie的/共享/ LIB/ 一次相同的已更新,请传递参数 “oozie.use.system.libpath =真”

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

一旦你必须通过设置paramenter“真实”你没有必要提及的所有和每个瓶子一个个workflow.xml