任务调度中心系统-概要设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任务调度中心系统
目录
一、设计目的 (5)
二、整体架构 (7)
2.1 核心功能 (7)
2.2 核心组件 (8)
三、Job元数据 (8)
四、JobClient (9)
五、JobManager (Master) (9)
5.1 RPCServer (9)
5.2 数据库管理服务类 (10)
5.3 资源管理服务 (11)
5.4 Job依赖关系维护 (12)
5.5 定时调度器 (12)
5.7 告警服务 (13)
5.8 初始化流程 (13)
5.9 启动流程 (13)
5.10 成功Job处理流程 (14)
5.11 失败Job处理流程 (14)
六、JobWorker (Slave) (14)
6.1 存数据结构 (14)
6.2 定期从获取可以运行的Job (14)
6.3 执行Job (15)
七、核心流程图 (15)
7.1 Job维护流程 (15)
7.2 Job依赖维护流程 (16)
7.3 资源维护流程 (18)
7.4 Job提交流程 (19)
7.5 Job执行流程 (20)
7.6 Job监控流程 (20)
八、后台部署与运行 (22)
8.1 安装 (22)
8.2 数据库建库建表 (22)
8.3 配置 (22)
8.4 运行 (24)
九、部署与运行 (25)
9.1 安装 (25)
9.2 配置 (25)
9.3 运行 (26)
一、设计目的
●目前整个市场任务调度非常粗糙,基本仅靠Crontab来定时运行,
日志清洗、日志校验、数据分析、入库各模块之间无有效依赖,经
常由于前置任务出错或者未完成,后续的任务运行出错,并且对任
务出错的监控不到位,造成分析数据不能及时入库,导致线上BUG。
●真实业务场景下合理的任务运行图:
(图一)
1.定时触发一个日志校验的Job,去检查清洗后的日志是否已经就
绪;
2.分析的JOB均依赖日志校验的Job,一旦日志校验的Job执行
成功,则并发启动依赖其的分析Job1-4;
3.入库JOB1依赖分析JOB1和分析JOB2,如果这两个分析JOB
全部执行成功,则启动执行入库JOB1;
4.对于入库JOB2,如果分析JOB3和分析JOB4有一个未成功执
行,则入库JOB2就不执行;
●一个复杂的任务依赖图:
●为了解决数据平台分配任务的稳定性,时效性,因此设计开发任务
调度中心系统,旨在解决任务的统一配置,统一调度,统一监控告警等功能,减少开发人员的开发和维护成本,提高平台的稳定性。
二、整体架构
2.1 核心功能
1.Job维护:添加、修改、删除、杀死Job;
2.Job依赖关系维护:添加、修改、删除Job之间的依赖关系;
3.查询类:查询Job列表、根据状态查询Job列表、查询Job的父子依赖等;
4.资源维护:添加、修改、删除资源,查询资源列表;
5.Job触发:支持定时、依赖、手工触发调度Job;
6.任务失败告警:当任务失败或者某个时间点未成功结束时,触发和短信报警;
7.支持任务类型包括:shell、python、MapReduce、Hive、DataHub任务的调度及监
控;
8.可扩展性:Slave(JobWorker)可根据需要随时扩充;
2.2 核心组件
1.元数据库:Mysql,保存Job的配置、依赖关系、运行历史、资源配置、告
警配置等;
2.JobClient:客户端类,对外的唯一接口;
3.JobManager:Master,提供RPC服务,接收并处理JobClient提交的所
有操作;与元数据库通讯,维护Job元数据;负责任务的统一配置维护、触发、调度、监控;
4.JobMonitor: 监控正在运行的Job状态、监控任务池、监控等待运行的Job;
5.JobWorker:Slave,从任务池中获取Job、负责启动并收集Job的执行状
态,以心跳方式发送给JobManager;
以上各组件下文中详细介绍。
三、J ob元数据
元数据存储于Mysql 。
四、J obClient
1.用户与系统交互的唯一接口;
2.封装提供给用户使用的所有接口,单例模式,使用时候指定JobManager
的RPC hostname和端口号;
3.拥有JobManager的RPC代理,将用户提交的操作通过RPC调用
JobManager的相应接口进行处理;
4.提供的接口包括:
●操作Job,包括增加,修改,删除,运行,杀死Job等;
●维护Job依赖关系;
●配置、查询资源;
●查询Job信息,包括指定条件查询,如状态,JobID,时间等;
●查询Job依赖;
五、J obManager (Master)
任务调度中心系统的Master节点,负责所有任务的调度,分发,状态跟踪,报警,资源管理等。
5.1 RPCServer
●JobManager自身为一个RPCServer,为JobClient提供调用接口;
●为JobClient提供的RPC接口:
✓Job操作类接口:保存Job,根据JobID获取Job,获取所有Job,获取新的JobID,删除Job;
✓Job依赖关系维护接口:添加、删除Job依赖,查询Job的父子依赖;
✓查询类接口;查询正在运行的Job,查询Job的历史运行,查询一个时间段的Job等;
✓维护类接口:停止JobManager,添加、修改、删除资源,获取资源列表;
5.2 数据库管理服务类
●JobStoreManager,封装所有与元数据库通讯的接口,用于Job元数
据的持久化和查询。
●使用数据库池;
●接口列表:
5.3 资源管理服务
●ResourceManager,负责Job资源的计算和分配;
●资源包括:主机名/IP,可运行的任务类型,最大运行的任务数量;
●初始化将资源配置表中已分配的Job数全部设为0;
●资源申请流程:
✓根据Job类型,首先从资源配置表中获取可以运行该类型Job的节点、最多可运行的Job数量、已分配出去的Job数量;
✓从上面获取的节点中取(max_job_count – running_job_count)> 0,并按照(max_job_count – running_job_count)降序排列,取第一条记录;
✓如果有返回主机名,表示有资源,则将该资源已分配Job数量+1;
✓返回主机名;
✓如果没有记录返回,则表示没有资源,返回null;
●资源释放流程:
✓根据传入的hostname和job_type,将资源配置表中该记录已分配Job数量-1;
5.4 Job依赖关系维护
●Neo4jService
●使用Neo4j保存任务的依赖关系,供查询使用;
●当Job的依赖关系发生变化时,需要在Neo4j中做相应的维护;
5.5 定时调度器
●QuartzService
●维护定时运行的Job,当Job到达任务触发时间时,提交Job运行;
5.6 Job监控
●监控超时未成功执行的Job,触发告警(可依靠Quartz定时触发);
●监控正在运行的Job列表,当Job长时间未更新时,做相应处理;
●监控待运行Job队列,并尝试提交Job;
●监控任务池,从任务池中删除被拿走的Job;
5.7 告警服务
●提供告警服务,目前只提供告警服务
5.8 初始化流程
●获取RPC host&port:从配置文件conf/master.xml中获取;
●构建RPCServer;
●初始化Neo4j服务;
●从数据库中初始化加载所有Job;
●从数据库中初始化job依赖;
●初始化资源管理服务;
●构建Quartz服务;
5.9 启动流程
●初始化;
●启动jobManagerRPCServer;
●registerShutdownHook;
●启动Neo4j服务线程;
●启动Quartz服务线程;
●启动Job监控线程;
5.10 成功Job处理流程
●更新Job状态;
●获取该Job的一级子Job,分别检查子Job的其他父Job,如果父Job全部完成,
则提交该Job运行;如果有父Job未完成,则将该Job加入因前置Job未全部完
成而等待运行的Job队列
5.11 失败Job处理流程
●更新Job状态;
●告警;
六、J obWorker (Slave)
6.1 存数据结构
●正在运行的JobExecutor列表;
6.2 定期从获取可以运行的Job
●定期从任务池获取可以运行的Job
●定期汇总各个Job状态,并更新;
6.3 执行Job
●根据Job类型,构建相应的JobExecutor,执行并收集Job执行日志;
七、核心流程图
7.1 Job维护流程
●添加、修改Job
●删除Job
7.2 Job依赖维护流程
添加Job依赖
删除Job依赖
●添加、修改资源
●删除资源
●Job自动提交(定时触发和依赖触发)
●Job手动提交(由JobClient提交)
7.5 Job执行流程
7.6 Job监控流程
●监控任务池
●监控等待运行的Job
监控正在运行的Job
八、后台部署与运行
8.1 安装
●解压
●解压后目录结构:
conf/ ##配置文件
bin/ ##执行脚本
lib/ ##第三方jar包
Manager.jar ##核心jar包
8.2 数据库建库建表
●建库:
●赋权:
●建表:
8.3 配置
●conf/c3p0.properties
c3p0数据库池。
●conf/mail.properties
发送告警配置。
●conf/master.properties
JobManager配置文件。
✓job_manager_rpc_host=172.16.0.1 //JobManager RPC运行主机ip ✓job_manager_rpc_port=2234 //JobManager RPC运行端口号✓job_monitor_scan_period=10 //JobMonitor扫描数据库时间间隔
●conf/slave.properties
JobWorker配置文件。
✓job_worker_scan_period=5 //JobWorker线程扫描数据库间隔,单位:秒
✓job_log_dir=/usr/local/skynet/logs //JobWorker记录的日志路径
✓job_worker_jetty_port=9911 //JobWorker中Jetty服务端口号,用于查看Job运行日志
✓job_working_directory=/tmp/skynet/ //job执行工作目录,各用户必须有可读写权限,chmod –R 777 /tmp/skynet
●bin/net.sh
配置export JAVA_HOME=/usr/local/jre1.7.0_67
●bin/monitor-net.sh
系统监控脚本。
配置export JAVA_HOME=/usr/local/jre1.7.0_67
配置maillist= //当系统运行异常时,发给管理员告警●开放相关端口访问权限
job_manager_rpc_port、job_worker_jetty_port
●配置环境变量
NET_HOME,JAVA_HOME
●数据库中配置初始数据
dmp_job_buseinss_type //业务类型
dmp_resource_config //资源
dmp_user //用户、用于前端页面登陆和权限控制
8.4 运行
●运行JobManager
bin/net.sh start jm
启动后,在net/下产生jm.log日志文件
●运行JobWorker
bin/net.sh start jw
启动后,在net/下产生jw.log日志文件
●运行系统监控脚本
bin/ monitor-net.sh
启动后,在net/下产生monitor.log日志文件(5分钟刷新一次)
8.5 停止
●停止JobWorker
bin/net.sh stop jw
●停止JobManager
bin/net.sh stop jm
//会将JobManager和系统监控(monitor-net.sh)一起停止
九、部署与运行
9.1 安装
●将net.war拷贝至$TOMCAT_HOME/ webapps/
9.2 配置
●开放8080端口
●配置tomcat数据库池:
$TOMCAT_HOME/conf/ context.xml
<Resource name="jdbc/NetDB" auth="Container"
type="javax.sql.DataSource"
driverClassName=".mysql.jdbc.Driver"
maxActive="50" maxIdle="10" maxWait="10000"
username="net_reader" password="password"
url="jdbc:mysql://172.16.0.1:3306/net"
validationQuery='select 1'
testWhileIdle='true'
timeBetweenEvictionRunsMillis='8000'
minEvictableIdleTimeMillis='10000'/>
●配置后台服务信息:
$TOMCAT_HOME/ webapps/net/WEB-INF/classes/ jm.properties
job_manager_rpc_port=2234
job_manager_rpc_host=172.16.0.1
9.3 运行
●运行tomcat即可。
●访问页面:localhost:8080/net/
●用户名和密码直接在数据库dmp_user表中更新。