2013-05-09 4 views
4

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

У меня есть файл свойств, как это (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 будет изменен после каждого выполнения. Но я вижу, что это не меняется, хотя работа оози успешна. Для отладки цели, я распечатал расположение файла во время выполнения, и обнаружил, что он копируется в другое место (из журнала):

>>> 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 обратно через оболочку fs hadoop (запоминание для удаления файла перед загрузкой), что-то вроде:

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, а не жестко кодировать его в скрипт.

Update

Проблема разрешения, потому что работа oozie работает как mapred пользователя, однако файл имеет только rwx разрешения для пользователя ambari_qa и группы hdfs

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

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

+0

Спасибо большого Крис за ответ. Исходя из этого, я немного изменил мой сценарий 'Hadoop фс -rm/пользователь/ambari_qa/WFE/координатор/$ файла SED -i "S | $ oldStartIndexStr | $ newStartIndexStr | г" $ файл Hadoop фс -put $ file/user/ambari_qa/wfe/coordinator' Но проблема с разрешением разрешения. Что следует ожидать разрешения на те файлы, которые я хочу изменить с помощью рабочего процесса oozie? Еще раз спасибо. – dreamer

+0

Является ли сервер oozie запущенным как его собственный пользователь и/или у вас есть маскарадирование пользователя, включенное в HDFS. В основном, кто владеет файлом, и вы можете опубликовать полное сообщение об исключении (обновите свой вопрос, а не как комментарий). –

+0

Спасибо большое @ Крис снова. Я обновил свой вопрос. – dreamer

0

У меня была аналогичная проблема.

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

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

hadoop_user передаются как $ {ВФ: пользователь} в рабочем процессе в качестве аргумента к действию

Смежные вопросы