我有一个hdfs的shell脚本。我已经在oozie中使用以下工作流安排了这个脚本。
工作流程:
<workflow-app name="Shell_test" xmlns="uri:oozie:workflow:0.5">
<start to="shell-8f63"/>
<kill name="Kill">
<message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<action name="shell-8f63">
<shell xmlns="uri:oozie:shell-action:0.1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>
<exec>shell.sh</exec>
<argument>${input_file}</argument>
<env-var>HADOOP_USER_NAME=${wf:user()}</env-var>
<file>/user/xxxx/shell_script/lib/shell.sh#shell.sh</file>
<file>/user/xxxx/args/${input_file}#${input_file}</file>
</shell>
<ok to="End"/>
<error to="Kill"/>
</action>
<end name="End"/>
作业属性
nameNode=xxxxxxxxxxxxxxxxxxxx
jobTracker=xxxxxxxxxxxxxxxxxxxxxxxx
queueName=default
oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/xxxxxxx/xxxxxx
args文件
tableA
tableB
tablec
tableD
现在shell脚本为args文件中的单个作业名运行。如何安排此shell脚本并行运行。
我希望脚本同时运行10个作业。
为此需要采取哪些步骤。我应该对工作流进行哪些更改。
我应该为运行10个并行作业创建10个工作流吗。或者处理这个问题的最佳方案是什么。
我的shell脚本:
# !/bin/bash
[ $# -ne 1 ] && { echo "Usage : $0 table ";exit 1; }
table=$1
job_name=${table}
sqoop job --exec ${job_name}
我的sqoop作业脚本:
sqoop job --create ${table} -- import --connect ${domain}:${port}/${database} --username ${username} --password ${password} --query "SELECT * from ${database}.${table} WHERE \$CONDITIONS" -m 1 --hive-import --hive-database ${hivedatabase} --hive-table ${table} --as-parquetfile --incremental append --check-column id --last-value "${last_val}" --target-dir /user/xxxxx/hive/${hivedatabase}.db/${table} --outdir /home/$USER/logs/outdir
2条答案
按热度按时间mwg9r5ms1#
要并行运行作业,可以使workflow.xml中包含forks。请看下面的例子,这将对您有所帮助。
如果您注意到下面的xml,您将看到我通过传递不同的配置文件使用相同的脚本,在您的示例中,您必须从配置文件中传递不同的表名,或者您也可以在workflow.xml中传递
以sqoop作业为例,您的sqoop应该位于.sh脚本中,如下所示:
因此,基本上,您将尽可能通用地编写sqoop作业,因为它应该从workflow.xml中获得配置单元表、数据库、源表和源数据库名称。这样,您将为所有操作调用相同的脚本,但工作流操作中的env var将更改。请看下面我对第一个动作所做的更改。
我已经向您展示了上面的6个并行作业示例,如果您想运行并行操作,您可以在开始时再添加一些操作,并在工作流中编写这些操作。
这是它的色调
cotxawn72#
据我所知,您需要在oozie中并行运行x个作业。这个“x”可能每次都不同。你能做的是,
有一个包含两个动作的工作流。
壳作用
子工作流操作
shell操作-这将运行一个shell脚本,该脚本将根据您的“x”动态决定您需要选择哪个表等,并创建一个.xml,作为下一个子工作流操作的工作流xml。此子工作流操作将具有“fork”shell作业,以使它们能够并行运行。请注意,您还需要将此xml放入hdfs中,以便它可用于您的子工作流。
子工作流操作-它只执行在上一个操作中创建的工作流。