sqoop 作业 shell 脚本在 oozie 中并行执行

Posted

技术标签:

【中文标题】sqoop 作业 shell 脚本在 oozie 中并行执行【英文标题】:sqoop job shell script execute parallel in oozie 【发布时间】:2017-04-26 01:32:53 【问题描述】:

我有一个执行sqoop job 的shell 脚本。脚本如下。

!#/bin/bash

table=$1

sqoop job --exec $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>

test123的作业成功执行。

现在我有 300 个与上面相同的 sqoop 作业。我想并行执行 10 个 sqoop 作业。所有表名都在一个文件中。

现在我想循环到文件并为前 10 个表执行 10 个 sqoop 作业,依此类推。

我该怎么做?我应该准备 10 个工作流程吗?我真的很困惑。

【问题讨论】:

好吧,理论上,你可以在 shell 脚本中完成所有这些工作;不需要像 Oozie 这样的调度程序。协调并行执行会有点粗糙,而且有点棘手,但另一方面,Oozie 也从来没有打算管理数百个微作业......而且 Oozie 支持任何一种循环。 @SamsonScharfrichter 那么,正如你所说,我们可以在 oozie 中实现这一点吗?它是否正确。如果是这样,我们该怎么做。 什么?引用我自己的话:" 您可以在 shell 脚本" 中完成所有这些操作 你不需要准备10个工作流...准备一个工作流通过shell脚本调用它并将你的表名作为参数传递。 在文件中列出你的表并通过循环一次传递 10 个表 【参考方案1】:

正如@Samson Scharfrichter 提到的,您可以在shell 脚本中启动并行作业。 在 shell 中创建一个函数 runJob() 并并行运行它。 使用此模板:

#!/bin/bash

runJob() 
tableName="$1"
#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"

【讨论】:

理想情况下,即使这不是在 oozie 中做事的正确方式。您的答案适用于 Linux shell 脚本方面。谢谢你的回答

以上是关于sqoop 作业 shell 脚本在 oozie 中并行执行的主要内容,如果未能解决你的问题,请参考以下文章

Oozie Sqoop 作业 - 无法恢复作业

使用 Oozie 永久运行 Sqoop 作业

Oozie shell 脚本作业

通过 oozie 从 sqoop 作业增量导入不会更新 sqoop 元存储中的 incremental.last.value

使用“添加文件”部分(shell 脚本)时,Hortonworks Hue Oozie 流式传输作业失败

从 oozie 提交猪作业