上一节我们总结了数仓的一些知识包括:建模、数仓的分层、数据的装载等。
一、工作流调度管理工具
我们先来看一下数据的流转走向:外部数据流被采集、到HDFS、再到数仓ODS、DWD、DIM、DWS、DWT、ADS层经过一系列的清洗、加工、汇总等多个工作任务。其中包括shell脚本、hive脚本、java程序jar包等各个任务单元之间组织调度,并且彼此还有相对的复杂的依赖关系。
对于这样复杂执行的计划,整个的执行过程都需要人工参加,并且需要人工盯着各任务的进度,很多任务都是凌晨时间,单单依靠脚本控制来调度显然是不合理的,需要一个更加高效、功能更加全面的工作流调度系统管理工具来调度执行。
crontab -e*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;
如果任务没有按照指定执行,失败后,无从追溯; 大量的crontab任务没有统一管理; 多服务器crontab分散在多集群上,调度混乱;
2.2、基于crontab的WEBUI管理工具

存在问题:
如果任务之间有依赖关系的,crontab没有办法满足需求。
解决办法有以下几个:
设置每个任务时间和顺序,每个任务估算大概的执行时间;
利用Zookeeper组件通知机制;
shell/python脚本将任务job串起来组成一个DAG图
当工作流任务变多,依赖关系更为复杂;
不能统一视角,直观描述各任务调度和关系。
数仓里面充斥着大量的ETL任务:
有些依赖某个时间点去执行,有些依赖数据或者外部的事件来执行。
任务失败,需要有重试和报警功能,而不是等到整个工作流失败才发现问题。
2、复杂工作流调度系统框架
DAG定义 定义方式:表达式,脚本定义,通过WEB UI定义;还需要支持子DAG等; 执行节点 节点类型:unix cmd,shell,python,mapreduce, logging 节点控制 ignore, retry, suspend, run now, test mode等; Metrics 需要对比一段时间内任务的运行时间; Monitor 失败策略,报警通知功能; CLI & Web UI 查询 workflow 执行情况,以及简单的控制;
市面上目前常见的工作流调度系统:Oozie,Azkaban,Airflow,DolphinScheduler等。
二、Oozie
有MapReduce的Action,定义一个mapreduce任务很方便,而且可以直接通过job id关联到hadoop history页面; Oozie任务的资源文件都必须存放在HDFS上; Action也方便扩展,比如添加自定义的任务类型或者报警方式; 
3、Oozie缺点
二、AzKaban
1、简介
Azkaban is a batch workflow job scheduler created at LinkedIn to run Hadoop jobs. Azkaban resolves the ordering through job dependencies and provides an easy to use web user interface to maintain and track your workflows.
2、特点
根据官方的描述有如下特点

Azkaban和Oozie一样,也属于Hadoop生态圈。它的DAG定义方式比Oozie简单很多,在properties文件里面可以通过dependencies指定任务的上游依赖。Azkaban支持可插拔的扩展插件,方便扩展,比如支持pid,hive等。
Azkaban的特点是所有的任务资源文件都需要打成一个zip包上传。这个在资源文件较大的时候不是太方便,当前也可以进行扩展,比如存放在HDFS上,任务实际运行的时候才拉到本地。
界面如下:

三、Airflow
1、简介
Airflow is a platform created by the community to programmatically author, schedule and monitor workflows
https://airflow.apache.org/
Airflow 是一个 Airbnb 的 Workflow 开源项目,使用Python编写实现的任务管理、调度、监控工作流平台。Airflow 是基于DAG(有向无环图)的任务管理系统,可以简单理解为是高级版的crontab,但是它解决了crontab无法解决的任务依赖问题。与crontab相比Airflow可以方便查看任务的执行状况(执行是否成功、执行时间、执行依 赖等),可追踪任务历史执行情况,任务执行失败时可以收到邮件通知,查看错误日志。
2、特点
4大设计原则Principles
Scalable 可扩展的
Airflow 具有模块化架构,并使用消息队列来编排任意数量的工作人员。气流已准备好扩展到无穷大。
Dynamic 动态的
气流管道在 Python 中定义,允许动态管道生成。这允许编写动态实例化管道的代码。
Extensible 可扩展的
轻松定义用户自己的运算符并扩展库以适应适合用户环境的抽象级别。
Elegant 优雅的
气流管道简洁明了。使用强大的 Jinja 模板引擎将参数化内置到其核心中。
4大特征
Pure Python 纯Python
不再需要命令行或 XML!使用标准 Python 功能创建工作流程,包括用于调度的日期时间格式和用于动态生成任务的循环。这使用户可以在构建工作流程时保持完全的灵活性。
Useful UI 良好的用户UI
通过强大而现代的 Web 应用程序监控、安排和管理工作流程。无需学习旧的、类似 cron 的接口。用户始终可以全面了解已完成和正在进行的任务的状态和日志。
Robust Integrations 强大的集成
Airflow 提供了许多即插即用的操作符,可以随时在 Google Cloud Platform、Amazon Web Services、Microsoft Azure 和许多其他第三方服务上执行用户的任务。这使得 Airflow 易于应用于当前的基础设施并扩展到下一代技术。
Easy to Use 使用方便
任何具有 Python 知识的人都可以部署工作流。Apache Airflow 不限制管道的范围;用户可以使用它来构建 ML 模型、传输数据、管理用户的基础架构等等。

四、Dolphin Scheduler
1、简介
2、特点
高可靠性 去中心化的多Master和多Worker服务对等架构, 避免单Master压力过大,另外采用任务缓冲队列来避免过载。 简单易用 DAG监控界面,所有流程定义都是可视化,通过拖拽任务完成定制DAG,通过API方式与第三方系统集成, 一键部署。 丰富的使用场景 支持多租户,支持暂停恢复操作. 紧密贴合大数据生态,提供Spark, Hive, M/R, Python, Sub_process, Shell等近20种任务类型。 高扩展性 支持自定义任务类型,调度器使用分布式调度,调度能力随集群线性增长,Master和Worker支持动态上下线。

总结:
了解为什么需要工作流任务调度管理工具;
会使用crontab对简单脚本文件调度;
常见工作流任务调度管理工具的特点。包括Oozie、AzKaban、airflow、以及dolphinscheduler。
https://github.com/machanic/CronHub https://oozie.apache.org/ https://azkaban.github.io/ https://airflow.apache.org/ https://dolphinscheduler.apache.org/zh-cn/index.html




