任务调度中心系统目录一、设计目的 (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 obClient1.用户与系统交互的唯一接口;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●删除Job7.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.propertiesc3p0数据库池。
●conf/mail.properties发送告警配置。
●conf/master.propertiesJobManager配置文件。
✓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.propertiesJobWorker配置文件。
✓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 运行●运行JobManagerbin/net.sh start jm启动后,在net/下产生jm.log日志文件●运行JobWorkerbin/net.sh start jw启动后,在net/下产生jw.log日志文件●运行系统监控脚本bin/ monitor-net.sh启动后,在net/下产生monitor.log日志文件(5分钟刷新一次)8.5 停止●停止JobWorkerbin/net.sh stop jw●停止JobManagerbin/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.propertiesjob_manager_rpc_port=2234job_manager_rpc_host=172.16.0.19.3 运行●运行tomcat即可。