赵壮实/ 一个数据人的自留地
哈喽,大家好,我是怪力少女赵壮实。
很高兴和大家又一次相聚在周六的早上~在上节《壮实学数据技术04:ETL》中,我们讨论了数仓开发,今天我们衔接一下,讲讲数据加工处理、数据报表生产必不可少的一环:数据调度。
01 什么是数据调度?
在数据开发当中,对于数据调度,我们通常会指是“任务调度”或是“作业调度”。这里,我们先说一个概念,就是job和task。
job和task有几种不同语境下的区别:
spark语境下
在 Spark 中, task 是一个 Job 进行切割后运行的最小运算单元。一般情况下, 一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个 partition 上的数据。而 task 进行组合分批后, 被称为 stage。Spark 会为不同的 stage 以及不同的 task设好前后依赖,来保证整个 job 运行的正确性和完整性,最后一个resultTask 结束意味着 job 成功运行。
job>stage>task
hadoop语境下
Hadoop一个作业称为一个Job,Job里面分为Map Task和Reduce Task阶段,每个Task都在自己的进程中运行,当Task结束时,进程也会随之结束;
job>task
某调度产品语境下
Task:一个任务。
TaskType: 任务类型,如 ETL、MR job、 Simple。
Job:作业,任务在运行过程中的一次执行。
综上所述,job、task不同语境下,他们的关系是不一样的,所以在不同的数据调度产品中,要注意他们的区别。
我们来总结一下,数据调度,就是一个任务何时运行,何时结束以及正确的处理任务之间的依赖关系。我们需要关注的首要重点是在正确的时间点启动正确的作业,确保作业按照正确的依赖关系及时准确的执行。
02 数据调度产品包含什么模块?
在设计调度产品中,我们在其中需要理解几个问题:
1.触发机制:时间、依赖、混合
·时间 即任务按时间进行调度(年/月/日/小时/分钟/秒/毫秒)
·依赖 即任务按依赖关系进行调度
·混合 两者相互进行调度
2.工作流:任务状态(中断&运行)、任务管理or治理(类型、变更)、任务类型、任务分片。
3.调度策略:就绪&超时;重试&重试次数&重试用时。
4.任务隔离:任务和执行的关系等。
目前,市面上的任务调度系统有oozie、azkaban、airflow等等,此外,还有包括阿里的TBSchedule、腾讯的Lhotse、当当的elastic-job。
我们可以按dag工作流类、定时分片系统分为两类:
一种是dag工作流类系统:oozie、azkaban、chronos、lhotse
一种是分片类系统:TB Schedule、elastic-job、saturn
其中,dag ( Directed Acyclic Graph),就是一种向无环图,是指任意一条边有方向,且不存在环路的图。有个灵魂画手,我借鉴过来,我们可以感受一下什么是“有向无环”。
如果选择了dag工作流这种方式,我们就要注意时间、完成度,保证丰富灵活的触发机制。
分片是啥?我们来举个例子:如果我们有 3 台物理机,有 10 个每 5s 执行一次的定时任务,恰恰每个任务都打到第一台机器执行。为了避免“旱的旱死,涝的涝死”,所以我们需要将任务均衡分配到当前所有可执行的物理机上,这就是所谓分片机制。常见的分片机制比如平均分配算法、hash 值、轮询算法,我们以各种各样的算法保证对于物理机的平均“消磨”。
如果我们选择了分片类这种办法,就要注意准确、准时的触发。
03 数据调度产品简介
对于简单的离线数据迁移job,一般都是利用shell脚本通过crontab进行定时执行,但是随着多个job复杂度的提升,似的协调工作、任务监控都变得麻烦,所以我们选择使用工具进行调度监控。
3.1 dag工作流类系统
oozie
oozie是 Hadoop 平台开源的工作流调度引擎,它可以管理Hadoop作业。oozie属于web应用程序,由oozie client和oozie Server两个组件构成。Oozie不只配置多个MR(mapreduce)工作流,它可以执行一个MR1后,接着执行一个java脚本,再执行一个shell脚本,接着是Hive脚本,然后又是Pig脚本,最后又执行了一个MR2。使用oozie时,若前一个任务执行失败,后一个任务将不会被调度。
azkaban
azkaban是由Linkedin开源的批量工作流任务调度器。用于在一个工作流内以特定顺序运行一组工作和流程。Azkaban定义了一种KV文件格式来建立任务之间的依赖关系。
chronos
chronos 是由 Airbnb 公司推出的用来替代 crontab的开源产品。用户可以用它来对作业进行编排,支持使用 Mesos 作为作业执行器,与Hadoop 进行交互。同时,chronos 还可定义作业执行完成后的触发器,支持任意长度的依赖链。
3.2分片类系统
TBSchedule:TBSchedule是淘宝的分布式调度开源框架,基于Zookeeper Java实现。它可以让批量任务或者不断变化的任务,能够被动态的分配到多个主机的JVM中的不同线程组中并行执行,使得所有的任务能够被不重复,不遗漏的快速处理。
elastic-job:当当开发的弹性分布式任务调度系统,采用zookeeper实现分布式协调,实现任务高可用以及分片,并且可以支持云开发。
saturn:唯品会自主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,并且可以很好的部署到docker容器上。
产品阿里SchedulerXElastic-Job
触发方式·Cron
·Fixed rate
·Second delay
·OpenAPI(大规模一次性任务)
·Cron
·瞬时任务(一次性任务)
工作流·DAG图式调度,图形化配置,任务间可数据传递·无
任务分片(并行计算)·任务分片
·MapReduce并行计算
·任务分片
任务类型·Java
·Shell
·Python
·Go
·HTTP(Serverless)
·Node.js
·自定义
·Java
·Shell
任务治理与平台能力·任务管理
·日志收集
·任务报表
·任务管理
·日志收集
·任务报表
任务中断·支持·支持
好啦,今天的又是烧脑的一天。
还记得当初可可爱爱的文玉给我讲crontab的事情,我当时觉得这是爆难的事情。
但是现在从整个调度产品和技术框架来看,crontab就是塞尔达的新手村了。
所以,你会经历寻找防寒服的哭泣,也会经历获得飞行器的欢愉。
To define is to limit。
抒个小情,我是赵壮实,我们《壮实学数据技术06》下周见!