1. 程式人生 > >在Oozie 中排程執行shell、hive 指令碼,以及通過shell指令碼執行hive/sqoop/shell指令碼的方法

在Oozie 中排程執行shell、hive 指令碼,以及通過shell指令碼執行hive/sqoop/shell指令碼的方法

  最近專案需要用到OOzie工具,可是找了好久,也沒有找到一個完整的、統一的解決和部署方案。經過努力,終於打通了其中的所有環節,解決了各種坑爹的問題。

  首先,就專案需求做一個簡單的介紹:

     專案需要從mysql中匯入資料到hive進行離線計算後,再導回到mysql。過程很簡單,所有流程通過shell指令碼實現了排程。

問題描述:shell排程指令碼執行很好,但是放到Oozie上排程執行,卻發現了各種坑。第一個大坑頁面上執行結果顯示成功,但是結果表中卻並沒有資料。顯然,執行的過程中肯定有環節出了問題。

解決策略: 將排程指令碼中的各個流程分拆開來,單獨放到一個shell指令碼中,然後用Oozie排程執行。具體分拆步驟如下:

一、shell 指令碼中執行shell指令碼。

     在cloudera 的官網(http://gethue.com/use-the-shell-action-in-oozie/)上給出了一個demo,但是隻是執行shell指令碼自身。那對於shell指令碼中執行shell指令碼的情況,與demo中的方法類似。也要指明shell指令碼的名稱以及路徑。如圖1所示:

    需要注意的是:1、檔案的許可權必須具有可執行許可權。本例採用了“777”許可權。 2、第一個輸入框處填包含字尾的檔名,檔案部分的輸入框要包含排程指令碼和被排程指令碼的完整檔名(包含路徑和字尾),且都具有可執行許可權。

   

                                                                       圖1  shell指令碼中包含shell指令碼

二、執行hive指令碼。

    在圖2中的第一個輸入框輸入hdfs上的hive指令碼完整路徑加上檔名(含字尾),hive XML輸入框部分輸入hive-site.xml檔案的路徑。也可以點選介面右上角的設定按鈕,對hive-site.xml檔案進行全域性設定。如圖3所示。需要注意的是:1、上傳hive-site.xml檔案至hdfs (本例為/user/admin/),且許可權為755.許可權太高不會認。 3、此處的hive-site.xml 檔案為”/opt/cloudera-manager/cm-5.4.7/run/cloudera-scm-agent/process/650-oozie-OOZIE_SERVER/hive-conf/hive-site.xml“。查詢的辦法為:find /opt -name hive-site.xml 。如圖2所示


圖2  oozie執行hive指令碼


                                         圖3   hive-site.xml檔案全域性設定

3、shell指令碼中執行hive指令碼

       過程與shell執行shell類似。不過需要注意的是,如果沒有對job進行圖3所示的全域性設定,則需要在檔案部分新增hive-site.xml檔案。此處略。

4、shell 執行sqoop命令

         oozie 本身可以直接執行sqoop命令,但是比較討厭的是,一種是要輸入很多很多的引數,一種是不能夠包含引數中不能包含空格。而且不支援動態傳引數,比如說每天自動執行sqoop命令。因此,理想的辦法自然是放在shell指令碼中排程。

        執行的方法,說白了,其實也很簡單。跟shell排程shell 類似。不過需要注意的是:

1、sqoop匯入資料到hive中,那hive指定的倉庫的路徑或外部表所在的路徑一定要可寫 ,最好設定為766.否則匯入的檔案無法寫人指定目錄,而一旦出錯,通過oozie的日誌,也很難定位錯誤的地方。

         2、如果是匯入具有多分割槽的分割槽表,則第一級分割槽的目錄的許可權必須設定為可寫,如766,該過程在shell指令碼中,執行sqoop命令前就必須設定好。第二級分割槽的檔案目錄則無所謂。 本例中的設定如圖4所示:

     

圖4  shell排程執行sqoop命令

          5、shell指令碼同時排程執行hive/sqoop/shell指令碼

                 方法同以上。需要注意的幾點:1、必須包含所有的檔案。  2、所有檔案必須在同一目錄下。在shell指令碼中動態獲取的目錄不起作用,如shell和hive指令碼置於不同目錄,執行的時候,就無法執行hive指令碼。 3、檔案許可權問題。 4、雖然在本例測試的過程中,發現不用包含hive-site.xml檔案可以正常執行,為防萬一,建議各位加上。本例中的配置如圖5所示:

   

                                                 圖5   shell排程hive、shell、sqoop指令碼