如何在Oozie中执行并行作业

4 shell hadoop hdfs oozie oozie-coordinator

我在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"/>
Run Code Online (Sandbox Code Playgroud)

工作性质

nameNode=xxxxxxxxxxxxxxxxxxxx
jobTracker=xxxxxxxxxxxxxxxxxxxxxxxx
queueName=default
oozie.use.system.libpath=true
oozie.wf.application.path=${nameNode}/user/${user.name}/xxxxxxx/xxxxxx 
Run Code Online (Sandbox Code Playgroud)

args文件

tableA
tableB
tablec
tableD
Run Code Online (Sandbox Code Playgroud)

现在,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}
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 6

要并行运行作业,您可以在其中创建带有forks的工作流。请参阅以下示例,它将为您提供帮助。

如果您注意到下面的XML,您会看到我正在通过传递不同的配置文件来使用同一脚本,在这种情况下,您必须传递所需的配置文件中的不同表名,或者也可以在工作流中传递。 XML格式

以sqoop作业为例,您的sqoop应该位于.sh脚本中,如下所示:

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 "${hivetable}" --as-parquetfile --incremental append --check-column id --last-value "${last_val}"  --target-dir /user/xxxxx/hive/${hivedatabase}.db/${table} --outdir /home/$USER/logs/outdir
Run Code Online (Sandbox Code Playgroud)

因此,基本上,您将尽可能以通用方式编写sqoop作业,在该地方应该期望工作流表,数据库,源表以及来自工作流.xml的源数据库名称。这样,您将为所有操作调用相同的脚本,但是工作流操作中的Env-var将会更改。请参阅我对第一个操作所做的以下更改。

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 "${hivetable}" --as-parquetfile --incremental append --check-column id --last-value "${last_val}"  --target-dir /user/xxxxx/hive/${hivedatabase}.db/${table} --outdir /home/$USER/logs/outdir
Run Code Online (Sandbox Code Playgroud)

我已经向您展示了上面的6个并行作业示例,如果您想运行并行操作,则可以在开始时添加几个并在工作流中编写这些操作。

这是HUE的外观

在此处输入图片说明


Suv*_*yil 0

据我了解,您需要在 Oozie 中并行运行“x”个作业。这个“x”每次可能会有所不同。你能做的是,

有一个包含 2 个操作的工作流程。

  1. 壳牌行动
  2. 子工作流程操作

  1. Shell 操作 - 这将运行一个 shell 脚本,该脚本将根据您的“x”动态决定您需要选择哪个表等,并创建一个 .xml,它将用作接下来的子工作流操作的工作流 xml。该子工作流操作将具有“fork”shell 作业,以使它们能够并行运行。请注意,您还需要将此 xml 放入 HDFS 中,以便它可用于您的子工作流。

  2. 子工作流操作 - 它只会执行在先前操作中创建的工作流。