大家好,我是脚丫先生 (o^^o)
大数据平台核心之一在于数据计算,分为离线计算和实时计算任务。
然而任务是离不开调度的。比如:我们要进行定时抽取业务数据库
的数据,定时跑hive/spark任务,定时推送日报、月报指标数据等。
因而调度系统是大数据平台不可或缺的,正如闹钟对于日常生活的重要性一样。
首先上一个通用型的大数据平台框架:
由此而见,无论是离线任务或者实时任务,都是需要工作流的调度系统。
传统的crontab是linux系统自带的调度工具,使用crontab可以在指定的时间执行一个shell脚本或者一系列Linux命令。
实例:
实例 1:每 1 分钟执行一次 command
命令:
*/1 * * * * command
可见,crontab的使用是非常方便的,配置也极其简单。
但是在任务量较少的时候,是非常nice。
然而随着任务越来越多,就会出现了
1 任务不能在原来计划的时间完成,出现了上级任务跑完前,后面依赖的任务已经起来了,这时候没有数据,任务就会报错,或者两个任务并行跑了,出现了
错误的结果。
2 排查任务错误原因越来麻烦,各种任务的依赖关系越来越复杂,最后排查任务问题就行从一团乱麻中,一根一根梳理出每天麻绳。
3 成千上万的任务,管理起来是非常麻烦的,无穷无尽的痛苦。
总而言之,crontab虽然配置简单易上手,但是随着任务越来越多,任务之间的依赖越来越复杂,那么它是无法满足我们的需求,去解决任务之间的复杂依赖。
调度系统,关注的首要重点是在正确的时间点启动正确的作业,确保作业按照正确的依赖关系及时准确的执行。资源的利用率通常不是第一关注要点,业务流程的正确性才是最重要的。
(但是到随着业务的发展,ETL任务越来越多,你会发现经常有任务因为资源问题没有按时启动!)
实际调度中,多个任务单元之间往往有着强依赖关系,上游任务执行并成功,下游任务才可以执行。
比如 上游任务1结束后拿到结果,下游任务2、任务3需结合任务1的结果才能执行,因此下游任务的开始一定是在上游任务成功运行拿到结果之后才可以开始。
而为了保证数据处理结果的准确性,就必须要求这些任务按照上下游依赖关系有序、高效的执行,最终确保能按时正常生成业务指标。
那么在大数据平台中,调度系统的应用场景又是什么呢?
比如:在离线场景中,需要每天0点后,依次要执行数据采集、数据清洗、数据计算按照顺序依次执行。
job1首先进行数据采集任务。
job2则等待job1执行完成之后,则开始执行。
job3、job4、job5指标计算,需要job2执行完,则开始执行。
因此大数据中,可以把调度系统的作用说明为:定时调度和依赖调度。
Oozie是一个用来管理Hadoop生态圈job的工作流调度系统。由Cloudera公司贡献给Apache。
Oozie是运行于Java servlet容器上的一个java web应用。
**目的:**是按照DAG(有向无环图)调度一系列的Map/Reduce或者Hive等任务。
**应用场景:**Hadoop 自带的开源调度系统,使用方式比较复杂,适合大型项目场景,但是它使用XML配置,oozie任务的资源文什都必颈放在HDFS文什系统上,配置不方便,同时也只用于Hadoop。
Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。
**应用场景:**一个开源调度系统,使用方式比较简单,适合中小型项目场景,但是它使用java properties文件维护任务依赖关系,任务资源文件需要打包成zip,azkaban部署不是很方便。
Airf1ow是一款开源的,分布式任务调度框架,它将一个具有上下级依赖关系的工作流,组装成一个有向无环图。
利用Python的可移植性和通用性,快速的构建的任务流调度平台,实现依赖调度、定时调度。
它具有自己的web任务管理界面,dag任务创建通过python代码,可以保证其灵活airflow性和适应性。
Apache DolphinScheduler是一个分布式、去中心化、易扩展的可视化DG工作流任务调度系统,其致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。
它很好与Spark和Flink整合集成,进行离线批处理任务和实时流计算调度与监控预警。
给小伙伴们总结下这几个调度框架:
总体而言,海豚调度DolphinScheduler, 算是后起之秀。
它因为出来得晚,自然就会集成了以往调度框架的优点,万千优点于一身。
但是,不管如和去选择自己的调度框架,都是根据需求去综合分析的,比如我而言,对Airflow比较熟悉,所以项目中习惯用它。
链接:https://pan.baidu.com/s/1XE_iwx9PzSJBCcN4X0duTQ
提取码:yyds
下载tar包,在服务器里进行导入:
docker load < xxx.tar
version: '3.7'
services:
webserver:
image: docker-airflow:2.2.5
restart: always
user: root
privileged: true
environment:
- LOAD_EX=n
- EXECUTOR=Local
- AIRFLOW__CORE__DAGS_ARE_PAUSED_AT_CREATION=False
- AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL=5
- AIRFLOW__CORE__SQL_ALCHEMY_CONN=mysql://root:[email protected]:3306/airflow2
logging:
options:
max-size: 10m
max-file: "3"
volumes:
- ./dags:/usr/local/airflow/dags
- ./airflow.cfg:/usr/local/airflow/airflow.cfg
ports:
- "8086:8080"
command: webserver
healthcheck:
test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"]
interval: 30s
timeout: 30s
retries: 3
根据docker-compose.yml进行启动:
docker up -d
撒花。
好了,今天就聊到这里,祝各位终有所成,收获满满!
我是脚丫先生,我们下期见~