Apache DolphinScheduler是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。
1、系统架构图及架构说明
MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。 MasterServer基于netty提供监听服务。
该服务内主要包含:
Distributed Quartz分布式调度组件,主要负责定时任务的启停操作,当quartz调起任务后,Master内部会有线程池具体负责处理任务的后续操作;
MasterSchedulerThread是一个扫描线程,定时扫描数据库中的 command 表,根据不同的命令类型进行不同的业务操作;
MasterExecThread主要是负责DAG任务切分、任务提交监控、各种不同命令类型的逻辑处;
MasterTaskExecThread主要负责任务的持久化。
WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。 WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。 Server基于netty提供监听服务。
该服务包含:
FetchTaskThread主要负责不断从Task Queue中领取任务,并根据不同任务类型调用TaskScheduleThread对应执行器;
LoggerServer是一个RPC服务,提供日志分片查看、刷新和下载等功能。
ZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错。另外系统还基于ZooKeeper进行事件监听和分布式锁。 我们也曾经基于Redis实现过队列,不过我们希望DolphinScheduler依赖到的组件尽量地少,所以最后还是去掉了Redis实现。
提供任务队列的操作,目前队列也是基于Zookeeper来实现。由于队列中存的信息较少,不必担心队列里数据过多的情况,实际上我们压测过百万级数据存队列,对系统稳定性和性能没影响。
提供告警相关接口,接口主要包括告警两种类型的告警数据的存储、查询和通知功能。其中通知功能又有邮件通知和**SNMP(暂未实现)**两种。
API接口层,主要负责处理前端UI层的请求。该服务统一提供RESTfulapi向外部提供请求服务。 接口包括工作流的创建、定义、查询、修改、发布、下线、手工启动、停止、暂停、恢复、从该节点开始执行等等。
系统的前端页面,提供系统的各种可视化操作界面。
2、启动流程
3、去中心化VS中心化
中心化的设计理念比较简单,分布式集群中的节点按照角色分工,大体上分为两种角色:
Master的角色主要负责任务分发并监督Slave的健康状态,可以动态的将任务均衡到Slave上,以致Slave节点不至于“忙死”或”闲死”的状态。
Worker的角色主要负责任务的执行工作并维护和Master的心跳,以便Master可以分配任务给Slave。
中心化思想设计存在的问题:
一旦Master出现了问题,则群龙无首,整个集群就会崩溃。为了解决这个问题,大多数Master/Slave架构模式都采用了主备Master的设计方案,可以是热备或者冷备,也可以是自动切换或手动切换,而且越来越多的新系统都开始具备自动选举切换Master的能力,以提升系统的可用性。
另外一个问题是如果Scheduler在Master上,虽然可以支持一个DAG中不同的任务运行在不同的机器上,但是会产生Master的过负载。如果Scheduler在Slave上,则一个DAG中所有的任务都只能在某一台机器上进行作业提交,则并行任务比较多的时候,Slave的压力可能会比较大。
在去中心化设计里,通常没有Master/Slave的概念,所有的角色都是一样的,地位是平等的,全球互联网就是一个典型的去中心化的分布式系统,联网的任意节点设备down机,都只会影响很小范围的功能。
去中心化设计的核心设计在于整个分布式系统中不存在一个区别于其他节点的”管理者”,因此不存在单点故障问题。但由于不存在” 管理者”节点所以每个节点都需要跟其他节点通信才得到必须要的机器信息,而分布式系统通信的不可靠性,则大大增加了上述功能的实现难度。
实际上,真正去中心化的分布式系统并不多见。反而动态中心化分布式系统正在不断涌出。在这种架构下,集群中的管理者是被动态选择出来的,而不是预置的,并且集群在发生故障的时候,集群的节点会自发的举行”会议”来选举新的”管理者”去主持工作。最典型的案例就是ZooKeeper及Go语言实现的Etcd。
DolphinScheduler的去中心化是Master/Worker注册到Zookeeper中,实现Master集群和Worker集群无中心,并使用Zookeeper分布式锁来选举其中的一台Master或Worker为“管理者”来执行任务。
4、基础软件安装
注意:DolphinScheduler本身不依赖Hadoop、Hive、Spark,仅是会调用他们的Client,用于对应任务的提交。
5、安装并配置
1、下载安装包,并上传解压
[root@hadoop103 module]# mkdir /opt/module/dolphinscheduler [root@hadoop103 module]# cd dolphinscheduler/ [root@hadoop103 dolphinscheduler]# tar -zxvf apache-dolphinscheduler-incubating-1.3.3-dolphinscheduler-bin.tar.gz [root@hadoop103 dolphinscheduler]# mvapache-dolphinscheduler-incubating-1.3.3-dolphinscheduler-bindolphinscheduler-bin
2、创建部署用户和hosts映射。分别给hadoop101,hadoop102,hadoop103三台机器创建dolphinscheduler用户。并且一定要配置sudo免密。
[root@hadoop101 ~]# useradd dolphinscheduler [root@hadoop101 ~]# echo "dolphinscheduler123" | passwd --stdin dolphinscheduler Changingpassword for user dolphinscheduler. passwd:all authentication tokens updated successfully. [root@hadoop101 ~]# echo 'dolphinscheduler ALL=(ALL) NOPASSWD: NOPASSWD:ALL' >> /etc/sudoers [root@hadoop101 ~]# sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers [root@hadoop102 ~]# useradd dolphinscheduler [root@hadoop102 ~]# echo "dolphinscheduler123" | passwd --stdin dolphinscheduler Changingpassword for user dolphinscheduler. passwd:all authentication tokens updated successfully. [root@hadoop102 ~]# echo 'dolphinscheduler ALL=(ALL) NOPASSWD: NOPASSWD:ALL' >> /etc/sudoers [root@hadoop102 ~]# sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers [root@hadoop103 ~]# useradd dolphinscheduler [root@hadoop103 ~]# echo "dolphinscheduler123" | passwd --stdin dolphinscheduler Changingpassword for user dolphinscheduler. passwd:all authentication tokens updated successfully. [root@hadoop103 ~]# echo 'dolphinscheduler ALL=(ALL) NOPASSWD: NOPASSWD:ALL' >> /etc/sudoers [root@hadoop103 ~]# sed -i 's/Defaults requirett/#Defaults requirett/g' /etc/sudoers
3、配置hosts映射,并配置ssh免密登录
[root@hadoop103 ~]$ su dolphinscheduler [dolphinscheduler@hadoop103 ~]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa [dolphinscheduler@hadoop103 ~]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys [dolphinscheduler@hadoop103 ~]$ chmod 600 ~/.ssh/authorized_keys [root@hadoop103 module]# for ip in hadoop101 hadoop102; >do >ssh-copy-id $ip >done
4、数据库初始化,dolphinscheduler默认使用的数据库是PostgreSQL,可以选择MySQL,需要添加mysql-connector-java驱动包到dolphinscheduler的lib目录下。我这边使用MySQL 5.6.24。
[root@hadoop103 software]# cp mysql-connector-java.jar/opt/module/dolphinscheduler/dolphinscheduler-bin/lib/
MySQL安装在hadoop101,进入到数据库,创建dolphinscheduer所需数据库
[root@hadoop101 ~]# mysql -uroot -p123456 mysql>CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATEutf8_general_ci; mysql>GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'%' IDENTIFIEDBY '123456'; mysql>GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'localhost'IDENTIFIED BY '123456'; mysql>flush privileges;
5、创建表和导入基础数据
[root@hadoop103 module]# cd dolphinscheduler/dolphinscheduler-bin/ [root@hadoop103 dolphinscheduler-bin]# cd conf/ [root@hadoop103 conf]# vim datasource.properties
将postgresql的配置注释,并添加mysql地址
#spring.datasource.driver-class-name=org.postgresql.Driver #spring.datasource.url=jdbc:postgresql://localhost:5432/dolphinscheduler spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://hadoop101:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true spring.datasource.username=dophinscheduler spring.datasource.password=123456
导入脚本,导脚本之前确保配置了JAVA_HOME
[root@hadoop103 conf]# cd .. [root@hadoop103 dolphinscheduler-bin]# sh script/create-dolphinscheduler.sh
6、修改运行参数
1、修改dolphinscheduler_env.sh的环境变量,没有用到的可以注释或者忽略,JAVA_HOME和PATH是必须配置的。
[root@hadoop103 dolphinscheduler-bin]# vim conf/env/dolphinscheduler_env.sh exportHADOOP_HOME=/opt/module/hadoop-3.1.3 exportHADOOP_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop #exportSPARK_HOME1=/opt/soft/spark1 exportSPARK_HOME2=/opt/module/spark-3.0.0-bin-hadoop2.7 #exportPYTHON_HOME=/opt/soft/python exportJAVA_HOME=/opt/module/jdk1.8.0_211 exportHIVE_HOME=/opt/module/apache-hive-3.1.2-bin #exportFLINK_HOME=/opt/soft/flink #exportDATAX_HOME=/opt/soft/datax/bin/datax.py exportPATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH:$FLINK_HOME/bin:$DATAX_HOME:$PATH
2、将jdk软链到/usr/bin/java下
[root@hadoop103 dolphinscheduler-bin]# ln -s /opt/module/jdk1.8.0_211/bin/java /usr/bin/java
3、修改
conf/config/install_config.conf各参数
dbtype="mysql" dbhost="hadoop101:3306" username="dolphinscheduler" dbname="dolphinscheduler" password="123456" zkQuorum="hadoop101:2181,hadoop102:2181,hadoop103:2181" # ds安装目录不同于/opt/module/dolphinscheduler installPath="/opt/module/ds" deployUser="dolphinscheduler" mailServerHost="smtp.qq.com" mailServerPort="25" #sender,配置了和mailUser一样就行 mailSender="[email protected]" # user mailUser="[email protected]" #邮箱密码 mailPassword="xxxxxx" #starttlsEnable和sslEnable不能同时为true starttlsEnable="true" sslEnable="false" sslTrust="smtp.qq.com" resourceStorageType="HDFS" defaultFS="hdfs://mycluster" #resourcemanagerHA对应的地址 yarnHaIps="hadoop101,hadoop103" #因为使用了resourcemaanger Ha所以保持默认,如果是单resourcemanager配置对应ip singleYarnIp="yarnIp1" #资源上传根路径,支持hdfs和s3 resourceUploadPath="/data/dolphinscheduler" hdfsRootUser="hdfs" #需要部署ds的机器 ips="hadoop101,hadoop102,hadoop103" sshPort="22" #指定master masters="hadoop101" #指定workers,并且可以指定组名,default为默认组名 workers="hadoop102:default,hadoop103:default" #报警服务器地址 alertServer="hadoop102" #后台api服务器地址 apiServers="hadoop101"
4、如果需要将资源上传到HDFS功能,并且开启了NAMENODE HA则需要将配置文件复制到
/opt/module/dolphinscheduler/conf下。非NAMENODE HA则可以忽略
[root@hadoop103 dolphinscheduler-bin]# cp /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml/opt/module/dolphinscheduler/dolphinscheduler-bin/conf/ [root@hadoop103 dolphinscheduler-bin]# /opt/module/dolphinscheduler/dolphinscheduler-bin/conf/ cp/opt/module/hadoop-3.1.3/etc/hadoop/hdfs-site.xml /opt/module/dolphinscheduler/dolphinscheduler-bin/conf/
7、一键部署
1、 切换用户,执行脚本
[root@hadoop103 module]# chown -R dolphinscheduler:dolphinscheduler dolphinscheduler/ [root@hadoop103 dolphinscheduler]# su dolphinscheduler [dolphinscheduler@hadoop103 dolphinscheduler]$ cd dolphinscheduler-bin/ [dolphinscheduler@hadoop103 dolphinscheduler-bin]$ pwd /opt/module/dolphinscheduler/dolphinscheduler-bin
2、 因为alert服务需要访问mysql,所以hadoop102上也需要mysql驱动包
[root@hadoop101 mysql-connector-java-5.1.27]# scp mysql-connector-java-5.1.27-bin.jarhadoop102:/usr/share/java [root@hadoop102 java]# mv mysql-connector-java-5.1.27-bin.jar mysql-connector-java.jar
3、一键部署
[root@hadoop103 dolphinscheduler-bin]# sh install.sh
4、脚本完成后,会启动以下5个服务
MasterServer —– master服务 WorkerServer—– worker服务 LoggerServer —– logger服务 ApiApplicationServer —– api服务AlertServer —– alert服务
5、根据配置文件访问http地址
6、用户名和密码是admin/dolphinscheduler123