版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ApacheDolphinScheduler介绍和设计原理1 概述(前处在孵化阶段)是个分布式、去中化、易扩展的可视化DAG作流任务调度系统,其致于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即。DolphinScheduler是今年(2019年)中国公司开源的个调度系统,在今年,易观开源的分布式任务调度引擎DolphinScheduler(原EasyScheduler),根据Apache基会邮件列表显,在包含11个约束性投票(binding votes)和2个约束性投票(non-binding votes)的投票全部持赞同意见,弃权票和反对票,投票顺利通过,这样便以全
2、票通过的优秀表现正式成为了Apache孵化器项!1.1背景在2017年,易观在运营6.8Pb、6.02亿活、每天近万个调度任务的数据平台时,受到ETL复杂的依赖关系、平台易性、可维护性及次开发等掣肘,易观的技术团队渴望找到个具有以下功能的数据调度具:易于使,开发员可以通过常简单的拖拽操作构建ETL过程。不仅对于ETL开发员,法编写代码的也可以使此具进ETL操作,例如系统管理员和分析师;解决“复杂任务依赖”问题,并且可以实时监视ETL运状态;持多租户;持许多任务类型:Shell,MR,Spark,SQL(mysql,postgresql,hive,sparksql),Python,Sub_Pro
3、cess,Procedure等;持HA和线性可扩展性。易观技术团队意识到现有开源项没有能够达到他们要求的,因此决定开发这个具。他们在2017年底设计了DolphinScheduler的主要架构;2018年5完成第个内部使版本,后来迭代了个内部版本后,系统逐渐稳定下来。这介绍下DolphinScheduler易观技术团队,他们是来百度、阿、百分点、Ptmind、热云等团队的“数据极客”,秉持易观“让数据能平民化”的初,积极拥抱开源,曾贡献过Presto Hbase Connector, 等令开发者称赞的项。这次他们在公司的持下,积极地将开发的调度具推动开源,旨在回馈开源的同时,助打造个更为强的开
4、源态。如果跃跃欲试的想去贡献代码的,贡献流程可以参考这篇博客:。团队在2019年3初,范围(10多家公司)开放了DS的种户试,得到了常正能量的反馈,在4初的正式对外开放源码后,很快就获得了许多开发员的关注兴趣,前github上的star现在已超过1700个,参与开发和使的公司包括嘀嗒出、雪球、凤凰融、滴互助、华润万家等,更详细的可以查看:。1.2特点DolphinScheduler提供了许多易于使的功能,可加快数据ETL作开发流程的效率。其主要特点如下:通过拖拽以DAG 图的式将 Task 按照任务的依赖关系关联起来,可实时可视化监控任务的运状态;持丰富的任务类型;持作流定时调度、依赖调度、动
5、调度、动暂停/停/恢复,同时持失败重试/告警、从指定节点恢复失败、Kill任务等操作;持作流全局参数及节点定义参数设置;持集群HA,通过 Zookeeper实现 Master 集群和 Worker 集群去中化;持作流运历史树形/特图展、持任务状态统计、流程状态统计;持补数,并或串回填数据。2 系统架构2.1名词解释流程定义:通过拖拽任务节点并建任务节点的关联所形成的可视化DAG流程实例:流程实例是流程定义的实例化,可以通过动启动或定时调度成,流程定义每运次,产个流程实例任务实例:任务实例是流程定义中任务节点的实例化,标识着具体的任务执状态任务类型: 前持有SHELL、SQL、SUB_PROCE
6、SS(流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依赖),同时计划持动态插件扩展,注意:其中 SUB_PROCESS 也是个单独的流程定义,是可以单独启动执的调度式: 系统持基于cron表达式的定时调度和动调度。命令类型持:启动作流、从当前节点开始执、恢复被容错的作流、恢复暂停流程、从失败节点开始执、补数、定时、重跑、暂停、停、恢复等待线程。其中 恢复被容错的作流 和 恢复等待线程 两种命令类型是由调度内部控制使,外部法调定时调度:系统采 quartz 分布式调度器,并同时持cron表达式可视化的成依赖:系统不单单持 DAG 简单的前驱和后继节点之间的依赖,
7、同时还提供任务依赖节点,持流程间的定义任务依赖优先级 :持流程实例和任务实例的优先级,如果流程实例和任务实例的优先级不设置,则默认是先进先出邮件告警:持 SQL任务 查询结果邮件发送,流程实例运结果邮件告警及容错告警通知失败策略:对于并运的任务,如果有任务失败,提供两种失败策略处理式,继续是指不管并运任务的状态,直到流程失败结束。结束是指旦发现失败任务,则同时Kill掉正在运的并任务,流程失败结束补数:补历史数据,持区间并和串两种补数式2.2架构关于更详细的系统架构设计可以查看官提供的刘春(xiaochun.liu)篇博客 。3 部署3.1后端部署后端有2种部署式,分别为动化部署和编译源码部署
8、。下主要介绍下载编译后的进制包键动化部署的式完成DolphinScheduler后端部署。Mysql(5.5+) : 必装JDK (1.8+) : 必装ZooKeeper(3.4.6+) :必装Hadoop(2.6+) :选装, 如果需要使到资源上传功能,MapReduce任务提交则需要配置Hadoop(上传的资源件前保存在Hdfs上)Hive(1.2.1) : 选装,hive任务提交需要安装Spark(1.x,2.x) : 选装,Spark任务提交需要安装PostgreSQL(8.2.15+) : 选装,PostgreSQL PostgreSQL存储过程需要安装编译时如果是编译源码:毕装:毕
9、装,最好 3.6 版本注意:EasyScheduler本不依赖Hadoop、Hive、Spark、PostgreSQL,仅是会调他们的Client,于对应任务的运。在所有需要部署调度的机器上创建部署户(本次以node2、node3节点为例),因为worker服务是以 sudo -u linux-user 式来执作业,所以部署户需要有 sudo 权限,且是免密的。# 1 创建户# 3 sudo权限。编辑系统sudoers 件# root权限# chmod 640 /etc/sudoers# 100root下添加如下# 并且需要注释掉Default requiretty 。如果有则注释,没有没有跳
10、过su eschedulersudo mkdir /opt/DolphinScheduler# 2 DolphinSchedulerescheduler户sudo chown -R escheduler:escheduler /opt/DolphinScheduler# 3 escheduler-backendcd /opt/DolphinSchedulerwget /apache/incubator-dolphinscheduler/releases/download/1.1.0/escheduler-1.1.0-backend.tar.gz# 4 解压# 5 录介绍binconfinsta
11、ll.sh # 键部署脚本lib# jarjarjar# 集群启动、停和服务监控启停脚本# sql件5 directories, 1 file# node2node3。提输密码时,输escheduler 户的密码ssh-copy-id -i /.ssh/id_rsa.pub eschedulernode2ssh-copy-id -i /.ssh/id_rsa.pub eschedulernode3# node2node3。提输密码时,输escheduler 户的密码ssh-copy-id -i /.ssh/id_rsa.pub eschedulernode2ssh-copy-id -i /.s
12、sh/id_rsa.pub eschedulernode3执以下命令创建数据库和账号CREATE DATABASE escheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;- escheduler的访问密码为eschedulerip做限制- ip198.168.33.%)GRANT ALL PRIVILEGES ON escheduler.* TO escheduler% IDENTIFIED BY escheduler;flush privileges;创建表和导基础数据 修改vim /opt/Dolphin
13、Scheduler/escheduler/conf/dao/data_perties中的下列属性# 概在第4 MySQLurlspring.datasource.url=jdbc:mysql:/node1:3306/escheduler?characterEncoding=UTF-8# 户名。spring.datasource.username=escheduler# IDENTIFIED BY后设置的密码spring.datasource.password=escheduler执创建表和导基础数据脚本# /opt/DolphinScheduler/escheduler-backend 录下,
14、然后执数据初始化脚本# 最后看到 create escheduler success 表数据库初始化成功sh ./script/create_escheduler.sh# 1 conf/env/录下的 .escheduler_env.sh 环境变量export HADOOP_HOME=/opt/hadoop-3.1.2export HADOOP_CONF_DIR=/opt/hadoop-3.1.2/etc/hadoopexport SPARK_HOME1=/opt/spark-2.3.4-bin-hadoop2.7export JAVA_HOME=/usr/local/zulu8/#expor
15、t PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATHexport PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH#export HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop#export HADOOP_CONF_DIR=/etc/hadoop/conf.cloudera.yarn#ex
16、port SPARK_HOME1=/opt/cloudera/parcels/CDH/lib/spark#export SPARK_HOME2=/opt/soft/spark2#export JAVA_HOME=/usr/local/zulu8/#export HIVE_HOME=/opt/cloudera/parcels/CDH/lib/hive#export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH#export PATH=
17、$HADOOP_HOME/bin:$SPARK_HOME1/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH修改 install.sh中的各参数,替换成业务所需的值,这只列出了重要的修改项,其它默认不改即可。# mysql配置# mysql ,端mysqlHost=:3306# mysql 数据库名称mysqlDb=escheduler# mysql 户名mysqlUserName=escheduler# mysql 密码# conf/config/install_config.conf配置# 部署户# sudohdfshdfs,根录需要创建deployUser=
18、escheduler# zk集群zkQuorum=:2181,:2181,:2181# hosts# workerhostname列表workers=,# api serverhostname列表apiServers=# SMTP邮件协议mailProtocol=SMTP# 发送。# 路径xlsFilePath=/home/escheduler/xls#是否启动监控启动脚本# HDFS,S3,NONEresUploadStartupType=HDFS# resourcemanager HAresourcemanager,yarnHaIps=yarnHaIps=# 如果是单 resourcema
19、nager,resourcemanager HA,则默认配置就好singleYarnIp=# common 配置# 程序路径programPath=/opt/DolphinScheduler/escheduler-backend#下载路径downloadPath=/tmp/escheduler/download# api 服务端apiServerPort=12345如果使hdfs相关功能,需要拷贝hdfs-site.xml和core-site.xml到conf录下cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml conf/cp $HADOOP_HOME/etc/
20、hadoop/core-site.xml conf/易云邮箱服务客户端户名和密码获取,开启客户端授权码,并获取。如果 DolphinScheduler 已经安装,则可以通过设置部署的后端服务下的conf/perties件mail.server.host=# SSL协议端 465/994协议端 25mail.server.port=465mail.sender=*mail.passwd=yore*enterprise.wechat.corp.id=xxxxxxxxxxenterprise.wechat.secret=xxxxxxxxxxenterprise.wechat.agent.id=xxx
21、xxxxxxxenterprise.wechat.users=xxxxx,xxxxxenterprise.wechat.token.url=/cgi-bin/gettoken?corpid=$corpId&corpsecret=$secretenterprise.wechat.push.url=/cgi-bin/message/send?access_token=$tokenenterprise.wechat.team.send.msg=toparty:$toParty,agentid:$agentId,msgtype:text,text:content:$msg,safe:0enterpri
22、se.wechat.user.send.msg=touser:$toUser,agentid:$agentId,msgtype:markdown,markdown:content:$msgsh install.sh# 2 查看志.outescheduler-alert-server.pid.outescheduler-logger-server.pid.outescheduler-master-server.pid.outescheduler-worker-server.pidtaskInstanceId.log# 3.1 node2# master 服务# alert 服务31695 Log
23、gerServer# logger 服务# 3.2 node326718 LoggerServer错误1:如果查看/opt/DolphinScheduler/escheduler-backend/logs/escheduler-api-server-*.out志报如下错误nohup: failed to run command /bin/java: No such file or directory解决将JAVA_HOME/bin下的java软连接到/bin下。(每个dolphinscheduler节点都执)3.1.8 服务进程的说明由前我们可以看到,后端服务正常启动后,共有 5 个进程:Wo
24、rkerServer、ApiApplicationServer、MasterServer、AlertServer、LoggerServer 。另外还有个 UI,具体说明如下:服务说明主要负责任务的提交、执和任务状态的更新。LoggerServer于Rest Api通过 RPC 查看志提供Rest Api服务,供UI进调提供告警服务AlertServerUI服务前端页展说明/opt/DolphinScheduler/escheduler-backend/script/stop_all.sh3.2前端部署前端有3种部署式,分别为动化部署,动部署和编译源码部署。这主要使动化脚本式部署DolphinS
25、cheduler前端服务。# 1 下载 UI escheduler-uitar -zxf escheduler-1.1.0-ui.tar.gz -C escheduler-uicd escheduler-ui执动化部署脚本。脚本会提些参数,根据提完成安装。linuxnginx8888 :8888api serverip,192.168.xx.xx :api server,12345 :12345=1.CentOS6安装2.CentOS7安装3.Ubuntu安装4.退出=(1|2|3|4)2Complete!使动化部署脚本会检查系统环境是否安装了Nginx,如果没有安装则会通过络动下载Nginx
26、包安装,通过引导设置后的Nginx配置件为/etc/nginx/conf.d/escheduler.conf。但产环境般法法访问外,此时可以通过动离线安装Nginx,然后进些配置即可。# 例如下载Cento7 CPU指令为x86版本的下在动再Nginx中添加个DolphinSchedule 服务配置。因为在/etc/nginx/nginx.conf(Nginx默认加载的配置件)中有include/etc/nginx/conf.d/*.conf ,所以我们可以在/etc/nginx/conf.d/下创建个 conf后缀的配置件,配置件的件名随意,例如叫escheduler.conf。这需要特别注
27、意的是在/etc/nginx/nginx.conf 配置件中前有个配置user nginx 如果启动Nginx的户不是nginx,定要修改为启动Nginx的户,否则代理的服务会报 403 的错误。这我们在/etc/nginx/conf.d/escheduler.conf配置如下内容,重点在 server 中配置 listen(DolphinSchedule Web UI的端)、*root *(解压的escheduler-ui 中的 dist 路径 )、proxy_pass (DolphinSchedule后台接的地址)等信息。最后重启Nginx执命令systemctl restart ngin
28、x。location /escheduler proxy_pass :12345; # ()proxy_set_header Host $host;proxy_connect_timeout 4s;proxy_read_timeout 30s;proxy_send_timeout 12s;#error_page 404/404.html;# redirect server error pages to the static page /50 x.html#error_page 500 502 503 504 /50 x.html;location = /50 x.html root /usr/
29、share/nginx/html;传件限制编辑配置件vim /etc/nginx/nginx.confclient_max_body_size 1024m4快速开始创建个队列。队列管理 - 创建队列 - 输名称和队列值 - 提交。创建租户。租户管理 - 创建租户 - 输租户编码、租户名称和队列值 - 提交。创建警告组。警告组管理 - 创建警告组 - 输组名称、组类型(邮件、短信)- 提交。使普通户登录(户名和密码都是demo)。点击右上户名“退出”,重新使普通户登录。登陆成功的页如下。创建个项。点击页头部的项管理,进项页,再点击创建项,创建个DolphinScheduler任务调度项,在弹出的
30、框中输项名称和描述,例如这创建个hello_dolphinScheduler名称的项,最后点击提交。项创建完毕后,在项管理页点击我们创建的项,进该项的管理页。点击作流定义 - 创建作流 - 在左侧具栏可以选择(SHELL、USB_PROCESS、PROCEDURE、SQL、SPARK、MapReduce、PYTHON、DEPENDENT)。拖拽SHELL节点到画布,新增个Shell任务,填写 节点名称、描述、脚本 字段;选择 任务优先级 ,级别的任务在执队列中会优先执,相同优先级的任务按照先进先出的顺序执;超时告警, 填写 超时时长 ,当任务执时间超过超时时长可以告警并且超时失败。(注意:这的
31、节点不是机器的节点,应该是作流的节点)确认修改完毕后,点击保存,此时设置DAG图名称,选择组租户,最后添加。未上线状态的作流定义可以编辑,但是不可以运,所以要执作流,需要先上线作流点击”运“,执作流。运参数说明:失败策略:当某个任务节点执失败时,其他并的任务节点需要执的策略。”继续“表:其他任务节点正常执,”结束“表:终所有正在执的任务,并终整个流程。通知策略:当流程结束,根据流程状态发送流程执信息通知邮件。流程优先级:流程运的优先级,分五个等级:最(HIGHEST),(HIGH),中(MEDIUM),低(LOW),最低(LOWEST)。级别的流程在执队列中会优先执,相同优先级的流程按照先进先
32、出的顺序执。worker分组: 这个流程只能在指定的机器组执。默认是Default,可以在任worker上执。通知组: 当流程结束,或者发容错时,会发送流程信息邮件到通知组所有成员。收件:输邮箱后按回车键保存。当流程结束、发容错时,会发送告警邮件到收件列表。抄送:输邮箱后按回车键保存。当流程结束、发容错时,会抄送告警邮件到抄送列表。点击任务实例可以查看每个任务的列表信息,点击操作栏,可以看到任务执的志信息。5 Worker分组和数据源添加worker分组,提供了种让任务在指定的worker上运的机制。管理员创建worker分组,在任务节点和运参数中设置中可以指定该任务运的worker分组,如果
33、指定的分组被删除或者没有指定分组,则该任务会在任worker上运。worker分组内多个ip地址(不能写别名),以英逗号分隔。管理员户(admin)登陆Web页,点击 安全中 - Worker分组管理,如下图所。创建Worker分组。填写组名称和IP,IP可以是多个,英逗号分割即可。例如下图,我们将Worker的IP分为了两组。6添加数据源脚本(般是SQL脚本)执时可能会到些数据源,例如MySQL、PostgreSQL、Hive、Impala、Spark、ClickHouse、Oracle、SQL Server,通过添加数据源在DolphinScheduler页编写Job时直接选择,不再指定驱
34、动、连接、户名和密码等信息,可以快速创建个SQL脚本的作流Job,同时这个数据源时户隔离的,每个户添加的数据源相互独(admin户除外,管理员户可以看到所有户添加的数据源)。下我们以Impala为例,选择页头部的 数据源中 - 添加数据源,会弹出下图 编辑数据源 弹窗,主要填写如下项。因为Impala没有设置密码,户为必填可以任意添加个,在jdbc连接参数中必须添加auth:noSasl数,否则会直等待确认认证。其它数据源类似,例如我们添加如下个数据源,后会到ClickHouse(详见我的另篇博客 )。7实例在项管理下,点击作流定义,在具栏处选择最后的DEPENDENT定义个带依赖的作流Job
35、,拖动到编辑板,设置task的节点名为cdh2-task1,在 Worker分组 中选择执的Worker节点为cdh2,编辑完这个Task后选择 确认添加。选择执的Worker分组名,这选择前设置的cdh2组,确认添加,如下图所。同样的式设置第个依赖Task,将其Worker分组设置到cdh3节点,并添加依赖为 且。接下来设置两个Shell执脚本,cdh2-task11上执task11,主要是在cdh2上执个hostname命令,打印执节点的HostName。同样的式,在依赖节点cdh3-task21上设置在cdh3执,也是执hostname命令。最后再在依赖节点cdh3-task21上添加个
36、SQL脚本,查询我们的瓣电影数据,具体操作如下在具栏拖拽添加个SQL脚本Task节点;节点名称可以叫:ck-task01,并添加描述信息;Worker分组:cdh3;数据源:CLICKHOUSE clickhouse-cdh3;sql类型选择查询。表格;邮件信息:填写主题。收件邮箱、抄送邮箱;sql语句:SELECT m.id,m.movie_name,m.rating_num,m.rating_people,q.rank,q.quote FROM movie mLEFT JOIN quote qON q.id=m.idORDER BY m.rating_num DESC,m.rating_p
37、eople DESC LIMIT 10;1234各个task编写完毕后,选择右上的 选择线条连接,作流编写完毕后如下图,最后点击保存,输DAG图名称,并选择租户,选择添加保存。回到作流定义,可以看到新添加的当前户的所有作流列表,点击右侧的操作栏的 上线,然后点击 运 执我们的作流。当然这也可以添加 定时 调度。点击运后,可以在 作流实例 页看到当前运的Job的状态信息。每个作可能会有多个Task构成,查看Task的执信息可以在 任务实例 页查看,操作栏可以查看这个task的执志信息。如果执成功后,可以选择作流的特图,在时间轴上查看执状况。也可以查看作流的执的树形图信息,如下图。运成功后填写的收
38、件箱会接收到执结果的封邮件,这封邮件中包含了脚本执的结果。8与 Azkaban的对ClassItemDolphinSchedulerAzkaban是,单个 Web 和调度程序组合节点过载处理务队列,不会造成机器卡死DAG监控界易性否,通过定义DSL绘制DAG打包上传集群化部署,复杂功能持暂停、恢复操作否,只能先将作流杀死再重新运停和恢复否多租户的映射关系,这对于数据作业上的调度是常重要的持传统的shell任务,同时持数据平台任务调度MR、Spark、SQL(MySQL、shell、gobblin、hadoopJava、Java、Hive、Pig、Spark、hdfsToTeradata、ter
39、adataToHdfs持数据作业Spark、Hive、MR的调度,同时由于持多租户,于数据业务更加 由于不持多租户,在数据平台业务使契合度契合上不够灵活是否持是是是否持 是,调度器使分布式调度,整体的调度能会随着集群的规模线性增长,Master和集群扩展 Worker持动态上下线是,但是复杂,Executor平扩展9节Apache DolphinScheduler是个分布式、去中化、易扩展的可视化DAG作流任务调度系统,从上的安装可以看到这个调度系统集成了ZooKeeper,很好的实现了去中化,每个的服务可以起多个,从znode上可以看到masters和workers的些元信息都注册在了上,交
40、由ZK去选举,当然它也是个分布式的。如果某个服务挂了,ZooKeeper会在剩下的其它节点进选举,例如当某些节点的Worker服务挂了,我们不做任何处理,DolphinScheduler上依然可以正常提交和执作,在它的监控中的页可以看到,系统动选举出了个新的Work节点。# znode上的信息zk: localhost:2181(CONNECTED) 1 ls /eschedulertasks_queue, dead-servers, masters, lock, workers, tasks_kill123尤其可以多Worker进分组以及添加数据源的功能,可以指定Wroker节点,直接指定改
41、户下的数据,执SQL脚本,同时页增加的监控中、任务状态统计、流程状态统计、流程定义统计等也能很好的帮助我们管理和查看任务执的信息和集群的状态。系统架构设计在对调度系统架构说明之前,我们先来认识下调度系统常的名词1.DAG: 全称Directed Acyclic Graph,简称DAG。作流中的Task任务以有向环图的形式组装起来,从度为零的节点进拓扑遍历,直到后继节点为。举例如下图:dag例流程定义:通过拖拽任务节点并建任务节点的关联所形成的可视化DAG流程实例:流程实例是流程定义的实例化,可以通过动启动或定时调度成,流程定义每运次,产个流程实例任务实例:任务实例是流程定义中任务节点的实例化,
42、标识着具体的任务执状态任务类型: 前持有SHELL、SQL、SUB_PROCESS(流程)、PROCEDURE、MR、SPARK、PYTHON、DEPENDENT(依赖),同时计划持动态插件扩展,注意:其中 SUB_PROCESS 也是个单独的流程定义,是可以单独启动执的调度式: 系统持基于cron表达式的定时调度和动调度。命令类型持:启动作流、从当前节点开始执、恢复被容错的作流、恢复暂停流程、从失败节点开始执、补数、定时、重跑、暂停、停、恢复等待线程。其中 恢复被容错的作流 和 恢复等待线程 两种命令类型是由调度内部控制使,外部法调定时调度:系统采 quartz 分布式调度器,并同时持cro
43、n表达式可视化的成依赖:系统不单单持 DAG 简单的前驱和后继节点之间的依赖,同时还提供任务依赖节点,持流程间的定义任务依赖优先级 :持流程实例和任务实例的优先级,如果流程实例和任务实例的优先级不设置,则默认是先进先出邮件告警:持 SQL任务 查询结果邮件发送,流程实例运结果邮件告警及容错告警通知失败策略:对于并运的任务,如果有任务失败,提供两种失败策略处理式,继续是指不管并运任务的状态,直到流程失败结束。结束是指旦发现失败任务,则同时Kill掉正在运的并任务,流程失败结束补数:补历史数据,持区间并和串两种补数式2.2.1 系统架构图系统架构图2.2 架构说明MasterServerMaste
44、rServer采分布式中设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进容错处理。该服务内主要包含:Distributed Quartz分布式调度组件,主要负责定时任务的启停操作,当quartz调起任务后,Master内部会有线程池具体负责处理任务的后续操作MasterSchedulerThread是个扫描线程,定时扫描数据库中的 command 表,根据不同的命令类型进不同的业务
45、操作MasterExecThread主要是负责DAG任务切分、任务提交监控、各种不同命令类型的逻辑处理MasterTaskExecThread主要负责任务的持久化WorkerServerWorkerServer也采分布式中设计理念,WorkerServer主要负责任务的执和提供志服务。WorkerServer服务启动时向Zookeeper注册临时节点,并维持跳。该服务包含:FetchTaskThread主要负责不断从Task Queue中领取任务,并根据不同任务类型调TaskScheduleThread对应执器。LoggerServer是个RPC服务,提供志分查看、刷新和下载等功能ZooKee
46、perZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进集群管理和容错。另外系统还基于ZooKeeper进事件监听和分布式锁。 我们也曾经基于Redis实现过队列,不过我们希望EasyScheduler依赖到的组件尽量地少,所以最后还是去掉了Redis实现。Task Queue提供任务队列的操作,前队列也是基于Zookeeper来实现。由于队列中存的信息较少,不必担队列数据过多的情况,实际上我们压测过百万级数据存队列,对系统稳定性和性能没影响。Alert提供告警相关接,接主要包括告警两种类型的告警数据的存储、查询和通知功能。其中通
47、知功能有邮件通知和*SNMP(暂未实现)*两种。APIAPI接层,主要负责处理前端UI层的请求。该服务统提供RESTfulapi向外部提供请求服务。 接包括作流的创建、定义、查询、修改、发布、下线、启动、停、暂停、恢复、从该节点开始执等等。UI系统的前端页,提供系统的各种可视化操作界,详见*部分。2.3 架构设计思想、去中化vs中化中化思想中化的设计理念较简单,分布式集群中的节点按照分,体上分为两种:Master的主要负责任务分发并监督Slave的健康状态,可以动态的将任务均衡到Slave上,以致Slave节点不于“忙死”或”闲死”的状态。Worker的主要负责任务的执作并维护和Master的
48、跳,以便Master可以分配任务给Slave。中化思想设计存在的问题:旦Master出现了问题,则群龙,整个集群就会崩溃。为了解决这个问题,多数Master/Slave架构模式都采了主备Master的设计案,可以是热备或者冷备,也可以是动切换或动切换,且越来越多的新系统都开始具备动选举切换Master的能,以提升系统的可性。另外个问题是如果Scheduler在Master上,虽然可以持个DAG中不同的任务运在不同的机器上,但是会产Master的过负载。如果Scheduler在Slave上,则个DAG中所有的任务都只能在某台机器上进作业提交,则并任务较多的时候,Slave的压可能会较。去中化在去
49、中化设计,通常没有Master/Slave的概念,所有的都是样的,地位是平等的,全球互联就是个典型的去中化的分布式系统,联的任意节点设备down机,都只会影响很范围的功能。去中化设计的核设计在于整个分布式系统中不存在个区别于其他节点的”管理者”,因此不存在单点故障问题。但由于不存在”管理者”节点所以每个节点都需要跟其他节点通信才得到必须要的机器信息,分布式系统通信的不可靠,则增加了上述功能的实现难度。实际上,真正去中化的分布式系统并不多见。反动态中化分布式系统正在不断涌出。在这种架构下,集群中的管理者是被动态选择出来的,不是预置的,并且集群在发故障的时候,集群的节点会发的举会议来选举新的管理者
50、去主持作。最典型的案例就是ZooKeeper及Go语实现的Etcd。EasyScheduler的去中化是Master/Worker注册到Zookeeper中,实现Master集群和Worker集群中,并使Zookeeper分布式锁来选举其中的台Master或Worker为“管理者”来执任务。、分布式锁实践EasyScheduler使ZooKeeper分布式锁来实现同时刻只有台Master执Scheduler,或者只有台Worker执任务的提交。1. 获取分布式锁的核流程算法如下1. EasyScheduler中Scheduler线程分布式锁实现流程图:2.三、线程不循环等待问题如果个DAG中没
51、有流程,则如果Command中的数据条数于线程池设置的阈值,则直接流程等待或失败。如果个的DAG中嵌套了很多流程,如下图则会产“死等”状态:上图中MainFlowThread等待SubFlowThread1结束,SubFlowThread1等待SubFlowThread2结束, SubFlowThread2等待SubFlowThread3结束,SubFlowThread3等待线程池有新线程,则整个DAG流程不能结束,从其中的线程也不能释放。这样就形成的流程循环等待的状态。此时除启动新的Master来增加线程来打破这样的”僵局”,否则调度集群将不能再使。对于启动新Master来打破僵局,似乎有点
52、差强意,于是我们提出了以下三种案来降低这种风险:1. 计算所有Master的线程总和,然后对每个DAG需要计算其需要的线程数,也就是在DAG流程执之前做预计算。因为是多Master线程池,所以总线程数不太可能实时获取。2. 对单Master线程池进判断,如果线程池已经满了,则让线程直接失败。3. 增加种资源不的Command类型,如果线程池不,则将主流程挂起。这样线程池就有了新的线程,可以让资源不挂起的流程重新唤醒执。注意:Master Scheduler线程在获取Command的时候是FIFO的式执的。于是我们选择了第三种式来解决线程不的问题。四、容错设计容错分为服务宕机容错和任务重试,服务宕机容错分为Master容错和Worker容错两种情况1.宕机容错服务容错设计依赖于ZooKeeper的Watcher机制,实现原理如图:其中Master监控其他Master和Worker的录,如果监听到remove事件,则会根据具体的业务逻辑进流程实例容错或者任务实例容错。Master容错流程图:ZooKeeper Master容错完成之后则重新由EasyScheduler中Scheduler线程调度,遍历 DAG 找到”正在运”和“提交成功”的任务,对”正在运”的任务监控其任务实例的状态,对”提交成功”的任务需
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装修合同样本公司协议范本
- 展柜制造企业采购合同
- 电商店铺托管服务合同
- 不参与社保保证函
- 陶瓷地砖采购
- 软件许可协议合同
- 弱电竣工备案流程
- 【项目管理】邵洪芳 教材精讲班教案 28-第3章-3.2.1-施工合同管理(二)
- 2024买卖合同模板
- 2024寄卖合同范文
- 美体师招聘笔试题及解答(某大型集团公司)2025年
- 合成生物学基础知识单选题100道及答案解析
- 初一语文家长会课件
- 语文-句子成分划分名师公开课获奖课件百校联赛一等奖课件
- 2024-2030年中国眼视光行业现状态势与未来前景预测报告
- 黄山学院《西方文明史》2022-2023学年第一学期期末试卷
- 注册健康管理师基础考试题库及答案
- 烘干设备购销合同模板
- 2024年国际贸易佣金居间服务协议
- 2024年国家宪法日知识竞赛考试题库200题(含答案)
- 小学三年级上册数学竖式计算题大全
评论
0/150
提交评论