我有一个包装器shell脚本,它读取输入文件并多次调用pig脚本。这在crontab上工作正常。但是,在尝试使用oozie引擎时不起作用。如何在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}
答案 0 :(得分:1)
我遇到了类似的问题 - 我需要多次执行一个猪脚本。
对我有用的是在Python中使用嵌入式猪([参见文档] [1])。
Oozie工作流有 pig 操作,脚本指向python文件。 还可以使用文件标记来标记需要重复执行的pig脚本,以便它可以加载到工作目录(对于控制器的文件来说也是如此,在您的情况下是shell脚本,读取输入)。
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()
希望这有帮助。