Запуск скрипта оболочки через oozie


Я пытаюсь выполнить сценарий оболочки через oozie, но у меня возникли некоторые проблемы.

У меня есть такой файл свойств (import.свойства):

startIndex=2000
chunkSize=2000

Идея заключается в том, что в каждом отдельном выполнении значение startIndex будет обновляться размером блока. Поэтому, если я выполню его, он должен иметь

startIndex=4000
chunkSize=2000

Я протестировал сценарий отдельно, и он отлично работает. Вот мои другие родственники файлы.

Иов.свойства

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

Рабочий процесс.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:

[ambari_qa@sandbox 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

Я ожидал, что импорт.файл свойств будет меняться после каждого выполнения. Но я вижу, что это не меняется, хотя работа с Иози успешна. Для отладки я распечатал расположение файла во время выполнения и обнаружил, что он скопирован в другое место (из журнала):

>>> 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
Но затем я начал сталкиваться с проблемой разрешения. Я дал разрешение на запись в этот файл и папку.
[ambari_qa@ip-10-0-0-91 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 4

2 ответа:

Sed работает на локальной версии распределенного кэша файла - вам нужно будет передать вывод sed обратно через оболочку hadoop fs (не забыв удалить файл перед загрузкой), что-то вроде:

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, но файл имеет только разрешения rwx для пользователя ambari_qa и группы hdfs

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

Я бы либо изменил разрешения файла на файл и родительскую папку таким образом, чтобы пользователь mapred мог удалить / заменить файл, либо искал маскировку под пользователя, у которого есть правильные разрешения

У меня была похожая проблема.

Я мог бы решить эту проблему, добавив

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

Hadoop_user передается как ${wf:user} в рабочем процессе в качестве аргумента действия