2017-03-09 92 views
0

在我們的一個管道中,我們使用spark(java)進行聚合,並使用oozie進行編排。 該流水線使用以下幾行將聚合數據寫入ORC文件。在oozie中使用hive上下文失敗的Spark作業

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的工作火花動作被觸發,它拋出以下異常

Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.SparkMain], main() threw exception, org.apache.hadoop.hive.shims.HadoopShims.isSecurityEnabled()Z java.lang.NoSuchMethodError: org.apache.hadoop.hive.shims.HadoopShims.isSecurityEnabled()Z

但多次重新運行工作流程後,同樣是越來越成功。

所有必需的jar都在運行時和編譯期都有。

這是我的第一個火花應用程序,我無法理解這個問題。

有人可以幫助我更好地理解問題和可能的解決方案。

回答

0

"the same is getting succeeded after rerunning the workflow multiple times"

聽起來像是你編譯/捆綁了Hadoop的客戶端中的星火工作在不同版本不是運行在集羣的一個;因此CLASSPATH中存在衝突的JAR,並且根據首先拾取哪個JAR,您的作業隨機失敗

可以肯定的,選擇成功的一個Oozie的工作,失敗一個作業,讓行動(將其標記job_*******_****而是指紗線ID application_******_****的「外部ID」並檢查紗線日誌這兩個工作。您應該在Java CLASSPATH中以JAR的實際順序查看差異。

如果這是事實確實如此,那麼嘗試

    在Oozie的動作
  • 組合,設置屬性oozie.launcher.mapreduce.user.classpath.firsttrue(對於Spark驅動程序)
  • 在星火配置
  • ,設置屬性spark.yarn.user.classpath.firsttrue(用於執行者)

你可以猜出什麼是user.classpath.first意味着...!


但是,如果衝突的JAR實際上不在Hadoop客戶端中,而是在Oozie ShareLib中,它可能不起作用。而從YARN的角度來看,Oozie是「客戶端」,你不能在Oozie從ShareLib發佈到從Spark工作發佈的內容之間設置優先級。

在這種情況下,你將不得不使用正確的依賴關係在你的Java項目,並匹配你將針對運行Hadoop的版本 - 這只是常識,你不覺得嗎?!?

+0

謝謝Samson你提到的是有道理的,我已經開始在這個方向上進行調試,但是我有一個懷疑在紗線日誌中,我可以看到關於類路徑的兩件事情之一是java.class.path在頂部和其他的是ClassPath元素,哪一個會被spark加載? –

+0

它們應該匹配 - 都是Oozie啓動器類的調試跟蹤。 –

+0

謝謝samson!有jar的執行順序導致了這個問題,我用oozie.launcher.mapreduce.user.classpath.first來設置優先順序。 –

相關問題