在oozie的sharelib公共庫中爲同一組件(不僅限spark)配置不同版本的運行環境

最近在公司開發遇到一個問題,oozie中spark的默認環境使用的是es2.0的版本。因爲其他程序都使用2.0版本,所以將2.0的jar包放在了spark的環境中,而我運行spark的任務需要用到es7.2版本,這就導致因jar包版本衝突而無法運行。

經過百度網上有好多oozie整合spark2的文章博客,受此啓發,我可以使用現有的spark默認環境重新搭配一套爲es7的spark運行環境。

1. 使用oozie用戶登錄hue界面,將現有公共庫中的spark文件拷貝一份重命名爲spark-es7。如果沒有oozie用戶,則使用hue的管理用戶添加oozie用戶並給與管理員權限。oozie的公共庫路徑一般爲/usr/oozie/share/lib/lib_<ts>/。如果不用hue界面,也可以使用hadoop fs 命令來拷貝文件

2.將spark-es7中衝突的jar包刪除,添加es7的jar包。

3.更新sharelib庫。登錄oozie所在的服務器,執行命令 oozie admin sharelibupdate 。shell環境變量沒有配置oozie的話,需要到oozie的bin目錄下執行該命令。這一步很重要,不然沒有效果。

4.使用oozie創建workflow時,再編輯spark動作節點時,點擊右上角的小齒輪切換到屬性編輯頁籤,添加屬性。oozie.action.sharelib.for.spark=spark-es7。屬性值就是公共庫中的文件目錄名稱。

5.編輯好spark節點的任務配置,保存提交該workflow就可以正常運行了。

舉一反三:

1. 如果有其他組件(pig、sqoop等)因jar包衝突,可以使用上述方案如法炮製來解決。

2.未實踐,僅僅是猜測。oozie的SharelibResolver類負責解析加載lib,而屬性oozie.action.sharelib.for.xxx配置組件xxx的lib加載目錄,而且多個目錄用逗號分隔。spark目錄下只包含spark原生態的jar包,程序依賴的jar包放在自己的目錄下。因此我們可以爲es2.0的jar包創建目錄es2,爲es7.2的jar包創建目錄es7,在創建workflow的spark節點時添加屬性oozie.action.sharelib.for.spark=spark,es2/7來達到同樣的目的。就是需要改動以前的workflow配置。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章