2014-03-13 115 views
4

我在探索Oozie管理Hadoop工作流的功能。我試圖設置一個調用一些配置單元命令的shell動作。我的shell腳本hive.sh如下所示:Oozie shell腳本動作

#!/bin/bash 
hive -f hivescript 

其中hive腳本(已獨立測試)創建一些表格等等。我的問題是在何處保留hivescript,然後如何從shell腳本中引用它。

我已經試過兩種方式,一是使用本地路徑,如hive -f /local/path/to/file,並使用相對路徑像上面,hive -f hivescript,在這種情況下,我把我的hivescript在Oozie的應用程序路徑目錄(同hive.sh和workflow.xml)並將其設置爲通過workflow.xml轉到分佈式緩存。

使用這兩種方法,我在oozie Web控制檯上收到錯誤消息: "Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]"。另外我已經嘗試在shell腳本中使用hdfs路徑,並且據我所知這不起作用。

我job.properties文件:

nameNode=hdfs://sandbox:8020 
jobTracker=hdfs://sandbox:50300 
queueName=default 
oozie.libpath=${nameNode}/user/oozie/share/lib 
oozie.use.system.libpath=true 
oozieProjectRoot=${nameNode}/user/sandbox/poc1 
appPath=${oozieProjectRoot}/testwf 
oozie.wf.application.path=${appPath} 

而且workflow.xml:

<shell xmlns="uri:oozie:shell-action:0.1"> 

    <job-tracker>${jobTracker}</job-tracker> 

    <name-node>${nameNode}</name-node> 

    <configuration> 

     <property> 

      <name>mapred.job.queue.name</name> 

      <value>${queueName}</value> 

     </property> 

    </configuration> 

    <exec>${appPath}/hive.sh</exec> 

    <file>${appPath}/hive.sh</file> 

    <file>${appPath}/hive_pill</file> 

</shell> 

<ok to="end"/> 

<error to="end"/> 

</action> 

<end name="end"/> 

我的目標爲了使用oozie通過shell腳本調用配置單元腳本,請給出您的建議。

+0

您是否檢查了啓動的oozie作業的mapreduce日誌?它是否提供更多細節? –

+0

另外,請詳細說明'另外我已經嘗試在shell腳本中使用hdfs路徑,並且這種方式並不像我所知道的那樣工作。 –

回答

0

http://oozie.apache.org/docs/3.3.0/DG_ShellActionExtension.html#Shell_Action_Schema_Version_0.2

如果你把你的shell腳本和蜂巢腳本無論是在工作流的某些文件夾,然後就可以執行它。

看到命令樣品

<exec>${EXEC}</exec> 
     <argument>A</argument> 
     <argument>B</argument> 
     <file>${EXEC}#${EXEC}</file> <!--Copy the executable to compute node's current  working directory --> 

你可以寫你的文件要

您還可以使用使用蜂巢行動有直接

http://oozie.apache.org/docs/3.3.0/DG_HiveActionExtension.html

10

一件事無論命令Oozie工作流程一直很棘手的是執行bash腳本。 Hadoop被創建爲大規模並行,所以架構的行爲與您想象的完全不同。

當oozie工作流執行shell操作時,它將從集羣中任何節點上的作業跟蹤器或YARN接收資源。這意味着爲文件使用本地位置將不起作用,因爲本地存儲專門位於您的邊緣節點上。如果這個工作碰巧在你的邊緣節點上產生,那麼它就會工作,但是任何其他時間它都會失敗,並且這個分佈是隨機的。

爲了解決這個問題,我發現最好將我需要的文件(包括sh腳本)放在hdfs中的lib空間或與我的工作流程相同的位置。

這是一個很好的方法來處理你想要實現的。

<shell xmlns="uri:oozie:shell-action:0.1"> 

    <exec>hive.sh</exec> 
    <file>/user/lib/hive.sh#hive.sh</file> 
    <file>ETL_file1.hql#hivescript</file> 

</shell> 

一件事,你會注意到的是,高管只是hive.sh因爲我們假設該文件將被移動到外殼動作完成

爲了確保最後的基本目錄注意是真實的,你必須包含文件的hdfs路徑,這將強制oozie通過該操作分發該文件。 對於你的情況,配置單元腳本啓動器應該只編碼一次,並簡單地提供不同的文件。由於我們有一對多的關係,因此hive.sh應該保存在一個lib中,而不是隨每個工作流程分發。

最後你看行:

<file>ETL_file1.hql#hivescript</file> 

這行做了兩兩件事。在#之前我們有文件的位置。這僅僅是文件名,因爲我們應該用我們的工作流程

user/directory/workflow.xml 
user/directory/ETL_file1.hql 

和運行SH都會有這個分發到它自動的節點分發我們的不同配置單元文件。最後,#之後的部分是我們在sh腳本內部分配兩個變量的名稱。這使您可以反覆重複使用相同的腳本,併爲其提供不同的文件。

HDFS目錄筆記,

如果該文件嵌套在相同的目錄內部工作流程,那麼你只需要指定子路徑:

user/directory/workflow.xml 
user/directory/hive/ETL_file1.hql 

會產生:

<file>hive/ETL_file1.hql#hivescript</file> 

但是,如果路徑在工作流目錄之外,則需要完整路徑:

user/directory/workflow.xml 
user/lib/hive.sh 

會產生:

<file>/user/lib/hive.sh#hive.sh</file> 

我希望這有助於大家。