Рабочий процесс Pig с oozie

#apache-pig #oozie

#apache-pig #oozie

Вопрос:

У меня есть сценарий оболочки-оболочки, который считывает входной файл и вызывает сценарий pig несколько раз. Это отлично работает на crontab. Однако, не работает при попытке сделать с oozie engine. Как добиться зацикливания в oozie. Если это неправильный способ, может кто-нибудь предложить альтернативные методы? Мне нужно иметь возможность считывать некоторые параметры из входного файла, а затем для каждой строки (и соответствующего параметра чтения) вызывать сценарий pig или действие pig несколько раз.


во время чтения строки

 do
    seedidprefix=$(echo $line |awk -v OFS='t' '{print $3;}')
    seedaudprefix=$(echo $line |awk -v OFS='t' '{print $2;}')
    adgrpid=$(echo $line |awk -v OFS='t' '{print $1;}')
    nwtype=$(echo $line |awk -v OFS='t' '{print $4;}')
    chainedseedid=$(echo $line |awk -v OFS='t' '{print $5;}')

if [ $nwtype == "ADX" ]; then

    hadoop jar pig.jar -param segid=${seedaudprefix} -param nw=${nwtype} -param date=${MODELDATE} -param seedid=${seedidprefix} -param audienceId=${adgrpid} -param chainedseedid=${chainedseedid} ${TOP_DIR}/histo_bkup_adx.pig

else

    hadoop jar pig.jar -param segid=${seedaudprefix} -param nw=${nwtype} -param date=${MODELDATE} -param seedid=${seedidprefix} -param audienceId=${adgrpid} -param chainedseedid=${chainedseedid} ${TOP_DIR}/histo_bkup.pig

fi

done<${campaign_file}
  

Комментарии:

1. почему вы зацикливаетесь? можете ли вы привести пример данных?

Ответ №1:

Я столкнулся с аналогичной проблемой — мне нужно было выполнить сценарий pig переменное количество раз.

Что сработало для меня, так это использовать встроенную свинью в Python ([см. Документ.] [1]).

Рабочий процесс Oozie имеет действие pig со сценарием, указывающим на файл python. Также используйте тег file, чтобы пометить сценарий pig, который необходимо повторно выполнять, чтобы он загружался в рабочий каталог (то же самое относится и к файлу, из которого контроллер, в вашем случае сценарий оболочки, считывает входные данные).

Сценарий Oozie будет выглядеть,

 <workflow>
    ...        
    <action name="action_1" retry-max="0" retry-interval="1">
        <pig>        
            <script>${path_src}/my_controller.py</script>
            <file>${path_src}/data.txt#data.txt</file>
            <file>${path_src}/my_script.pig#my_script.py</file>
        </pig>
        <ok to="Done"/>
        <error to="Fail"/>
    </action>
    ...
</workflow>
  

Скрипт на python будет выглядеть,

 #!/usr/bin/python
from org.apache.pig.scripting import Pig
if __name__ == '__main__' :
    # Load pig parameters - assuming each parameter is in the format KEY = Value
    pigParams = {}
    ipFile = open( 'data.txt', 'r' )
    for line in ipFile :
        if len( line.strip() ) == 0 :
            continue
        fields = line.split( '=' )
        pigParams[ fields[ 0 ].strip() ] = fields[ 1 ].strip()
    ipFile.close()

    for i in range( 10 ) :
        pigScript = Pig.compileFromFile( 'my_script.pig' )
        pigScript.bind( pigParams ).run()
  

Надеюсь, это поможет.