如何在 Oozie 中创建有依赖的 WorkFlow

Posted by Yezhiwei on November 25, 2020

原文地址:https://cloud.tencent.com/developer/article/1158324

转载自微信公众号:Hadoop实操

1.文档编写目的


在使用 Hue 创建 WorkFlow 时,单个 WorkFlow 中可以添加多个模块的依赖,使各个模块之间在 WorkFlow 内产生依赖关系,如果对于一个 WorkFlow 被其它多个 WorkFlow 依赖(如:AWorkFlow 执行成功后,BWorkFlow 和 CWorkFlow 依赖 AWorkFlow 的执行结果),这时不可能将 AWorkFLow 作为 BWorkFlow 和 CWorkFlow 中的一个处理模块来,这样会重复执行 AWorkFlow,可能会导致输入 BWorkFlow 和 CWorkFlow 的输入不一致等问题,那本篇文章 Fayson 主要介绍如何使用 Oozie 的 Coordinator 功能来实现 WorkFlow 之间的依赖。

  • 内容概述:

    1. 环境准备

    2. 创建测试 WorkFlow 与 Coordinator

    3. WorkFlow 依赖测试

    4. 总结

  • 测试环境:

    1. CM5.14.3/CDH5.14.2

    2. 操作系统版本为 Redhat7.3

    3. 采用 root 用户进行操作

    4. 集群已启用 Kerberos

2.环境准备


  1. 由于是 Kerberos 环境,在 shell 脚本中需要一个 keytab,生成一个 hiveadmin.keytab 文件
[root@cdh01 ~]# kadmin.local
Authenticating as principal hbase/admin@FAYSON.COM with password.
kadmin.local:  xst -norandkey -k hiveadmin.keytab hive/admin@FAYSON.COM

使用 klist 命令查看导出的 keytab 文件是否正常

[root@cdh02 wordcount]# klist -ek hiveadmin.keytab

  1. 准备两个 shell 脚本用于创建两个 WorkFlow

generator_wordcount.sh 脚本内容如下:

#!/bin/bash

kinit -kt hiveadmin.keytab hive/admin@FAYSON.COM
INPUT_HDFS=/benchmarks/wordcount/input
DATASIZE=1073741824
hadoop fs -rmr ${INPUT_HDFS} || true
hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar randomtextwriter -Dmapreduce.randomtextwriter.totalbytes=${DATASIZE} ${INPUT_HDFS}

wordcount.sh 脚本内容如下:

#!/bin/bash

kinit -kt hiveadmin.keytab hive/admin@FAYSON.COM
INPUT_HDFS=/benchmarks/wordcount/input
OUTPUT_HDFS=/benchmarks/wordcount/output
hadoop fs -rmr $OUTPUT_HDFS
NUM_REDS=160
hadoop jar /opt/cloudera/parcels/CDH/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar wordcount \
    -Dmapreduce.input.fileinputformat.split.minsize=1073741824 \
    -Dmapreduce.reduce.tasks=${NUM_REDS} \
    ${INPUT_HDFS} ${OUTPUT_HDFS}
hadoop fs -rmr ${INPUT_HDFS}

3.创建测试WorkFlow


这里创建 Shell 类型的 Oozie 工作流就不再详细的说明,可以参考 Fayson 前面的文章《Hue中使用Oozie创建Shell工作流在脚本中切换不同用户》中有介绍如何创建一个 shell 类型的 Oozie工作流,这里需要注意的是 Kerberos 环境下,我们需要将 keytab 文件也上传至对应 WorkFlow 的 WorkSpace/lib 目录下,如下图所示:

  1. 创建一个 GeneratorWorkFlow

  1. 创建一个 WordCountWorkFlow

这两个 WorkFlow 的依赖关系,只有 GeneratorWorkFlow 执行成功,生成了 WordCount 的输入数据后,WordCountWorkFlow 才可以执行,否则 WordCountWorkFlow 一直处于等待状态

4.创建Coordinator


在 Hue 中创建 Oozie 的 Coordinator 即对应 Hue 中的功能为 Scheduler

  1. 先创建一个生成数据的 Coordinator,用于定时生成 WordCount 测试数据

  1. 创建一个 WordCountSchedule,用于定时的去执行 WordCount 作业

注意:下面的配置比较关键,通过对 GeneratorWorkflow 工作流输出的 /benchmarks/wordcount/input 目录进行判断,如果满足条件则执行 WordCountWorkFlow 工作流。

完成上述两个 Schedule 的创建后,保存配置并启动该 Schedule。

5.WorkFlow 依赖测试


  1. 点击 Jobs 可以看到如下两个正在运行的 WorkFlow

  1. 通过 Yarn 查看作业的执行情况,这里的作业已经执行成功了,我们通过时间来分析

  1. 通过 GeneratorWorkflow 工作流的作业执行情况可以看到

在 2018-06-10 23:10:00 看到 GeneratorWorkflow 向集群提交了作业,与我们定义的启动时间一致,到 2018-06-10 23:10:14 可以看到开始执行生成数据的 MR 作业,并成功执行,作业执行结束时间为 2018-06-10 23:10:34。

  1. 通过 WordCountWorkFlow 工作流的作业执行情况可以看到

在 2018-06-10 23:11:00 才启动 WordCountWorkFlow 工作流,本应该在 2018-06-10 23:03:00 执行的工作流一致处于等待状态,直到 2018-06-10 23:11:00 GeneratorWorkflow 工作流执行成功,生成了 /benchmarks/wordcount/input 目录的数据后, WordCountWorkFlow 工作流才开始执行,可以看到 WordCount 作业的开始执行时间为 2018-06-10 23:11:14 ,在生成了 WordCount 测试数据后才执行。GeneratorWorkflow 工作流执行成功后与 WordCountWorkFlow 的执行时间间隔为1分钟,即为我们在 WordCountSchedule 中配置的每个一分钟检查一次。

  1. 通过如上作业执行情况分析,可以得出 WordCountWorkFlow 工作流的执行是依赖 GeneratorWorkflow 工作流

6.总结


  1. 在创建有依赖关系的 WorkFlow 时,我们可以通过 Coordinator 的方式来是实现工作流之间的依赖关系,可以避免被依赖的 WorkFlow 工作流被重复执行。

  2. Coordinator 是一个定时执行 WorkFlow 的调度工具,可以基于时间与数据生成为条件的方式触发。

  3. Coordinator 指定 HDFS 的数据目录,可以使用 ${YEAR}、${MONTH} 等EL表达式的方式进行设置。

  4. done_flag 即为数据目录生成的文件标识,若未指定则默认为 _SUCCESS 文件,若指定为空,则表示文件夹本身。

如果觉得还有帮助的话,你的关注和转发是对我最大的支持,O(∩_∩)O: