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)
要并行运行作业,您可以在其中创建带有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的外观
据我了解,您需要在 Oozie 中并行运行“x”个作业。这个“x”每次可能会有所不同。你能做的是,
有一个包含 2 个操作的工作流程。
Shell 操作 - 这将运行一个 shell 脚本,该脚本将根据您的“x”动态决定您需要选择哪个表等,并创建一个 .xml,它将用作接下来的子工作流操作的工作流 xml。该子工作流操作将具有“fork”shell 作业,以使它们能够并行运行。请注意,您还需要将此 xml 放入 HDFS 中,以便它可用于您的子工作流。
子工作流操作 - 它只会执行在先前操作中创建的工作流。
| 归档时间: |
|
| 查看次数: |
3802 次 |
| 最近记录: |