2013-05-09 209 views
4

我試圖通過oozie執行shell腳本,但我遇到了一些問題。通過oozie運行shell腳本

我有這樣的(import.properties)屬性文件:

startIndex=2000 
chunkSize=2000 

的想法是,在每一個執行的startIndex值將由塊大小更新。所以如果我執行它,它應該有

startIndex=4000 
chunkSize=2000 

我已經單獨測試了腳本,它工作正常。這是我的其他相關文件。

job.properties

nameNode=hdfs://192.168.56.101:8020 
jobTracker=192.168.56.101:50300 
wfeRoot=wfe 
queueName=default 
EXEC=script.sh 
propertyLoc=import.properties 

oozie.use.system.libpath=true 
oozie.wf.application.path=${nameNode}/user/${user.name}/${wfeRoot}/coordinator 

workflow.xml

<workflow-app xmlns='uri:oozie:workflow:0.2' name='shell-wf'> 
<start to='shell1' /> 
<action name='shell1'> 
    <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>${EXEC}</exec> 
    <file>${EXEC}#${EXEC}</file> 
     <file>${propertyLoc}#${propertyLoc}</file> 
    </shell> 
    <ok to="end" /> 
    <error to="fail" /> 
</action> 
<kill name="fail"> 
    <message>Script failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message> 
</kill> 
<end name='end' /> 

script.sh

#!/bin/sh 
file=import.properties 
. $file 

SCRIPT=$(readlink -f $file) 
SCRIPTPATH=$(dirname $SCRIPT) 
echo $SCRIPTPATH 

newStartIndex=`expr $chunkSize + $startIndex` 
newStartIndexStr=startIndex=$newStartIndex 

oldStartIndexStr=startIndex=$startIndex 
chunkSizeStr=chunkSize=$chunkSize 

sed -i "s|$oldStartIndexStr|$newStartIndexStr|g" $file 

我把我HDFS工作目錄中的所有這些文件:

[[email protected] coordinator]$ hadoop fs -lsr /user/ambari_qa/wfe/coordinator 
-rw-rw-rw- 1 ambari_qa hdfs   32 2013-05-09 00:12 /user/ambari_qa/wfe/coordinator/import.properties 
-rw-rw-rw- 1 ambari_qa hdfs  533 2013-05-09 01:19 /user/ambari_qa/wfe/coordinator/script.sh 
-rw------- 1 ambari_qa hdfs  852 2013-05-09 00:50 /user/ambari_qa/wfe/coordinator/workflow.xml 

我期待每次執行後都會更改import.properties文件。但是,即使oozie工作成功,我也發現這並沒有改變。爲了調試的目的,我在執行過程中打印出來的文件的位置,並發現它複製到另一個位置(從日誌):

>>> Invoking Shell command line now >> 

Stdoutput /hadoop/mapred/taskTracker/ambari_qa/distcache/-5756672768810005023_889271025_125659265/192.168.56.101/user/ambari_qa/wfe/coordinator 
Stdoutput startIndex=4000 
Stdoutput startIndex=2000 
Exit code of the Shell command 0 
<<< Invocation of Shell command completed <<< 

我需要做的,這樣它的影響HDFS的工作目錄是什麼?提前致謝。

更新:

改變基於克里斯的建議,該腳本之後,就變成(最後3行):

hadoop fs -rm hdfs://ip-10-0-0-92:8020/user/ambari_qa/wfe/shell-oozie/$file 
sed -i "s|$oldStartIndexStr|$newStartIndexStr|g" $file 
hadoop fs -put $file /user/ambari_qa/wfe/shell-oozie 

但後來,我開始對着權限問題。我給了該文件和文件夾的寫入權限。

[[email protected] shell-oozie]$ hadoop fs -ls /user/ambari_qa/wfe/shell-oozie 

找到3項:

-rw-rw-rw- 3 ambari_qa hdfs   32 2013-05-10 16:55 /user/ambari_qa/wfe/shell-oozie/import.properties 
-rw-rw-rw- 3 ambari_qa hdfs  540 2013-05-10 16:48 /user/ambari_qa/wfe/shell-oozie/script.sh 
-rw-rw-rw- 3 ambari_qa hdfs  826 2013-05-10 15:29 /user/ambari_qa/wfe/shell-oozie/workflow.xml 

以下是錯誤日誌:

rm: org.apache.hadoop.security.AccessControlException: Permission denied: user=mapred, access=EXECUTE, inode="ambari_qa":ambari_qa:hdfs:rwxrwx--- 
put: org.apache.hadoop.security.AccessControlException: Permission denied: user=mapred, access=EXECUTE, inode="ambari_qa":ambari_qa:hdfs:rwxrwx--- 
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1] 

回答

2

sed的是該文件的本地分佈式緩存版本上運行 - 你需要管通過hadoop fs shell返回sed的輸出結果(記得在上傳之前刪除文件),例如:

hadoop fs -rm /user/ambari_qa/wfe/coordinator/$file 

sed "s|$oldStartIndexStr|$newStartIndexStr|g" $file \ 
    hadoop fs -put - /user/ambari_qa/wfe/coordinator/$file 

有可能你可以找到hdfs中的協調器路徑,而不是硬編碼到腳本中。

更新

的權限問題是由於Oozie的作業運行作爲mapred用戶,但該文件只對用戶ambari_qa和組hdfs

user=mapred, access=EXECUTE, inode="ambari_qa":ambari_qa:hdfs:rwxrwx--- 

我會rwx權限將修改文件和父文件夾的文件權限,以便mapred用戶可以刪除/替換文件,或者將僞裝看作具有正確權限的用戶

+0

感謝您的答覆了很多克里斯

我可以通過添加

hadoop_user=${2} export HADOOP_USER_NAME=${hadoop_user}

hadoop_user作爲$通過解決這個問題。在此基礎上,我稍微改變了我的腳本 'Hadoop的FS -rm /用戶/ ambari_qa/WFE /協調員/ $文件 SED -i 「S | $ oldStartIndexStr | $ newStartIndexStr | G」 $文件 Hadoop的FS -put $ file/user/ambari_qa/wfe/coordinator' 但面臨權限問題。對於我想通過oozie工作流程修改的文件,應該期待什麼權限?再次感謝。 – dreamer 2013-05-10 15:51:55

+0

oozie服務器是否以自己的用戶身份運行,和/或您是否在HDFS中啓用了用戶僞裝功能。基本上誰擁有該文件,並且可以發佈完整的異常消息(更新您的問題而不是評論) – 2013-05-10 17:28:08

+0

再次感謝@Chris。我更新了我的問題。 – dreamer 2013-05-10 17:34:05

0

我有一個類似的問題。 {:用戶WF}在工作流作爲參數傳遞給動作