2015-07-21 109 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