sqoop 作业 shell 脚本在 oozie 中并行执行
sqoop job shell script execute parallel in oozie
我有一个执行 sqoop job
的 shell 脚本。脚本如下。
!#/bin/bash
table=
sqoop job --exec ${table}
现在,当我在工作流中传递 table 名称时,我会成功执行 sqoop 作业。
工作流程如下。
<workflow-app name="Shell_script" xmlns="uri:oozie:workflow:0.5">
<start to="shell"/>
<kill name="Kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="shell_script">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<exec>sqoopjob.sh</exec>
<argument>test123</argument>
<file>/user/oozie/sqoop/lib/sqoopjob.sh#sqoopjob.sh</file>
</shell>
<ok to="End"/>
<error to="Kill"/>
</action>
<end name="End"/>
</workflow-app>
作业成功执行 table test123
。
现在我有 300 个与上面相同的 sqoop 作业。我想并行执行 10 个 sqoop 作业。所有 table 名称都在一个文件中。
现在我想循环到文件并在前 10 table 秒执行 10 个 sqoop 作业,依此类推。
我该怎么做?我应该准备 10 个工作流程吗?我真的很困惑。
如@Samson Scharfrichter
所述,您可以在 shell 脚本中启动并行作业。
在 shell 和 运行 中并行创建函数 runJob()
。
使用此模板:
#!/bin/bash
runJob() {
tableName=""
#add other parameters here
#call sqoop here or do something else
#write command logs
#etc, etc
#return 0 on success, return 1 on fail
return 0
}
#Run parallel processes and wait for their completion
#Add loop here or add more calls
runJob $table_name &
runJob $table_name2 &
runJob $table_name3 &
#Note the ampersand in above commands says to create parallel process
#Now wait for all processes to complete
FAILED=0
for job in `jobs -p`
do
echo "job=$job"
wait $job || let "FAILED+=1"
done
if [ "$FAILED" != "0" ]; then
echo "Execution FAILED! ($FAILED)"
#Do something here, log or send messege, etc
exit 1
fi
#All processes are completed successfully!
#Do something here
echo "Done successfully"
我有一个执行 sqoop job
的 shell 脚本。脚本如下。
!#/bin/bash
table=
sqoop job --exec ${table}
现在,当我在工作流中传递 table 名称时,我会成功执行 sqoop 作业。
工作流程如下。
<workflow-app name="Shell_script" xmlns="uri:oozie:workflow:0.5">
<start to="shell"/>
<kill name="Kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="shell_script">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<exec>sqoopjob.sh</exec>
<argument>test123</argument>
<file>/user/oozie/sqoop/lib/sqoopjob.sh#sqoopjob.sh</file>
</shell>
<ok to="End"/>
<error to="Kill"/>
</action>
<end name="End"/>
</workflow-app>
作业成功执行 table test123
。
现在我有 300 个与上面相同的 sqoop 作业。我想并行执行 10 个 sqoop 作业。所有 table 名称都在一个文件中。
现在我想循环到文件并在前 10 table 秒执行 10 个 sqoop 作业,依此类推。
我该怎么做?我应该准备 10 个工作流程吗?我真的很困惑。
如@Samson Scharfrichter
所述,您可以在 shell 脚本中启动并行作业。
在 shell 和 运行 中并行创建函数 runJob()
。
使用此模板:
#!/bin/bash
runJob() {
tableName=""
#add other parameters here
#call sqoop here or do something else
#write command logs
#etc, etc
#return 0 on success, return 1 on fail
return 0
}
#Run parallel processes and wait for their completion
#Add loop here or add more calls
runJob $table_name &
runJob $table_name2 &
runJob $table_name3 &
#Note the ampersand in above commands says to create parallel process
#Now wait for all processes to complete
FAILED=0
for job in `jobs -p`
do
echo "job=$job"
wait $job || let "FAILED+=1"
done
if [ "$FAILED" != "0" ]; then
echo "Execution FAILED! ($FAILED)"
#Do something here, log or send messege, etc
exit 1
fi
#All processes are completed successfully!
#Do something here
echo "Done successfully"