• 概述

随着数据仓库的开发,ETL作业会越来越多,怎么把这些作业有序的运行起来,就需要一个健壮的调度系统来保证数据能够准确、及时的提供给BI应用程序。

  • 调度系统设计目标 

                  

数仓 数据调用量 监控 数仓调度_主键

 

  • 调度系统架构

                                            

数仓 数据调用量 监控 数仓调度_数仓 数据调用量 监控_02

 

  • ETL作业

数据仓库的ETL作业可能不至一种,需要把各种作业再次进行封装,建立作业的标准格式,统一作业的输入参数、输出参数和参数格式,达到所有的作业调度方式一致。

  • 作业管理

提供便捷的作业配置和依赖关系配置页面。

  • 作业调度

根据作业调度算法进行自动执行,如果发生异常情况可以进行人工重启和停止。

  • 作业监控

对作业运行情况进行监控,发送邮件或者提供监控页面。

  • 作业逻辑模型

                                       

数仓 数据调用量 监控 数仓调度_主键_03

 

  • 作业调度状态流转图

                                                                     

数仓 数据调用量 监控 数仓调度_数仓 数据调用量 监控_04

 

  1. 初始化:把新添加的作业加入到执行计划中。
  2. 待运行:根据时间和依赖关系把可执行的任务更新为待运行。
  3. 运行中:把待运行的任务执行,更新为运行中。
  4. 结束:作业运行完成,分为成功和失败。
  • python实现调度工具 
  • 准备环境

    1.安装mysql数据库,执行建表脚本。

CREATE TABLE `task_info` (
  `task_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '任务主键',
  `task_name` varchar(255) DEFAULT NULL COMMENT '任务名称',
  `task_dir` varchar(255) DEFAULT NULL COMMENT '任务所在路径',
  `task_cmd` varchar(255) DEFAULT NULL COMMENT '任务启动命令',
  `task_argv` varchar(255) DEFAULT NULL COMMENT '任务参数',
  `task_level` varchar(255) DEFAULT NULL COMMENT '任务层级',
  `target_table_name` varchar(255) DEFAULT NULL COMMENT '目标表名称',
  `start_time` datetime DEFAULT NULL COMMENT '任务启动日期',
  `task_fq` varchar(255) DEFAULT NULL COMMENT '任务执行频率:季-quarters,月-months,周-weeks,天-days,小时-hours,分钟-minutes',
  `time_interval` int(11) DEFAULT NULL COMMENT '时间间隔',
  `create_user` varchar(255) DEFAULT NULL COMMENT '创建人',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_user` datetime DEFAULT NULL COMMENT '更新人',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `is_active` tinyint(4) DEFAULT NULL COMMENT '是否有效',
  PRIMARY KEY (`task_id`),
  UNIQUE KEY `uq_task_name` (`task_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1427 DEFAULT CHARSET=utf8;
CREATE TABLE `task_dpd` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `task_id` int(11) DEFAULT NULL COMMENT '任务外键',
  `task_name` varchar(255) DEFAULT NULL COMMENT '任务名称',
  `pre_task_id` int(11) DEFAULT NULL COMMENT '依赖任务外键',
  `is_active` tinyint(4) DEFAULT NULL COMMENT '是否有效',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `fk_task_dpd_info_id` (`task_id`),
  CONSTRAINT `fk_task_dpd_info_id` FOREIGN KEY (`task_id`) REFERENCES `task_info` (`task_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2064 DEFAULT CHARSET=utf8;
CREATE TABLE `task_plan` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `task_id` int(11) DEFAULT NULL COMMENT '外键',
  `task_name` varchar(255) DEFAULT NULL COMMENT '任务名称',
  `begtime` datetime DEFAULT NULL COMMENT '开始时间',
  `endtime` datetime DEFAULT NULL COMMENT '结束时间',
  `task_status` tinyint(4) DEFAULT NULL COMMENT '任务状态 1-初始化,2-待运行,3-运行中,4-成功,5-失败',
  `retry_count` tinyint(4) DEFAULT '0' COMMENT '重试次数',
  `failed_desc` text COMMENT '失败原因描述',
  `next_time` datetime DEFAULT NULL COMMENT '下次运行时间',
  `task_ppid` int(11) DEFAULT NULL COMMENT '父进程id',
  `task_pid` int(11) DEFAULT NULL COMMENT '子进程id',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `task_result` text COMMENT '执行结果信息',
  PRIMARY KEY (`id`),
  KEY `fk_task_info_task_id` (`task_id`),
  CONSTRAINT `fk_task_info_task_id` FOREIGN KEY (`task_id`) REFERENCES `task_info` (`task_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6401 DEFAULT CHARSET=utf8;

CREATE TABLE `task_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `task_id` int(11) NOT NULL COMMENT '任务外键',
  `task_name` varchar(255) DEFAULT NULL COMMENT '任务名称',
  `begtime` datetime DEFAULT NULL COMMENT '开始时间',
  `endtime` datetime DEFAULT NULL COMMENT '结束时间',
  `task_status` tinyint(4) DEFAULT NULL COMMENT '任务状态 4-成功,5-失败',
  `task_result` text COMMENT '执行结果信息',
  `failed_desc` text COMMENT '失败信息',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `fk_task_info_id` (`task_id`),
  CONSTRAINT `fk_task_info_id` FOREIGN KEY (`task_id`) REFERENCES `task_info` (`task_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2382 DEFAULT CHARSET=utf8;
CREATE TABLE `task_param` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `param_type` varchar(255) DEFAULT NULL COMMENT '参数类型',
  `param_value` varchar(255) DEFAULT NULL COMMENT '参数值',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `param_name` varchar(255) DEFAULT NULL COMMENT '参数名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `task_param`(`id`, `param_type`, `param_value`, `create_time`, `update_time`, `param_name`) VALUES (1, 'IS_START_TASK', '1', '2020-04-17 17:13:59', '2020-04-22 16:57:40', 'IS_START_TASK');

2.安装python3,安装包:pymysql,dateutil,concurrent_log_handler,DBUtils。

3.下载工具包,解压到ETL服务器上。

4.初始化配置文件settings,加载任务和依赖数据。

  • 目录结构描述

                                                        

数仓 数据调用量 监控 数仓调度_主键_05

文件名称

描述

log

任务执行日志,按照文件大小切分。

taskmodels

任务模型,主要有关于数据库操作的方法。

utils

主要有数据连接日志,发送邮件的公共方法。

settings.py

调度工具配置信息。

taskinit.py

任务初始化执行文件。

taskschedule.py

任务调度执行文件。

sendmail.py

发送邮箱执行文件。

  • 运行调度工具 

运行 taskinit.py、taskschedule.py、sendmail.py三个文件