大数据技术之DolphinScheduler
Posted 江南独孤客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据技术之DolphinScheduler相关的知识,希望对你有一定的参考价值。
架构设计
1.1系统架构图
1.2启动流程图
1.3架构说明
- MasterServerMasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。 MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。 MasterServer基于netty提供监听服务。
该服务内主要包含:
Distributed Quartz分布式调度组件,主要负责定时任务的启停操作,当quartz调起任务后,Master内部会有线程池具体负责处理任务的后续操作
MasterSchedulerThread是一个扫描线程,定时扫描数据库中的 command 表,根据不同的命令类型进行不同的业务操作
MasterExecThread主要是负责DAG任务切分、任务提交监控、各种不同命令类型的逻辑处
MasterTaskExecThread主要负责任务的持久化
- WorkerServerWorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。 WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。 Server基于netty提供监听服务。Worker
该服务包含:
FetchTaskThread主要负责不断从Task Queue中领取任务,并根据不同任务类型调用TaskScheduleThread对应执行器。
LoggerServer是一个RPC服务,提供日志分片查看、刷新和下载等功能
- ZooKeeperZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错。另外系统还基于ZooKeeper进行事件监听和分布式锁。 我们也曾经基于Redis实现过队列,不过我们希望DolphinScheduler依赖到的组件尽量地少,所以最后还是去掉了Redis实现。
- Task Queue提供任务队列的操作,目前队列也是基于Zookeeper来实现。由于队列中存的信息较少,不必担心队列里数据过多的情况,实际上我们压测过百万级数据存队列,对系统稳定性和性能没影响。
- Alert提供告警相关接口,接口主要包括告警两种类型的告警数据的存储、查询和通知功能。其中通知功能又有邮件通知和**SNMP(暂未实现)**两种。
- APIAPI接口层,主要负责处理前端UI层的请求。该服务统一提供RESTful api向外部提供请求服务。 接口包括工作流的创建、定义、查询、修改、发布、下线、手工启动、停止、暂停、恢复、从该节点开始执行等等。
- UI系统的前端页面,提供系统的各种可视化操作界面。
1.4去中心化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为“管理者”来执行任务。
第2章 集群部署
2.1 基础软件安装
- PostgreSQL (8.2.15+) or mysql (5.7系列) : 两者任选其一即可
- JDK必装,请安装好后在/etc/profile下配置 JAVA_HOME 及 PATH 变量
- ZooKeeper (3.4.6+) :必装
- Hadoop (2.6+) or MinIO :选装,如果需要用到资源上传功能,可以选择上传到Hadoop or MinIO上
注意:DolphinScheduler本身不依赖Hadoop、Hive、Spark,仅是会调用他们的Client,用于对应任务的提交。
2.2安装部署
2.2.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]# mv apache-dolphinscheduler-incubating-1.3.3-dolphinscheduler-bin dolphinscheduler-bin - 创建部署用户和hosts映射。分别给hadoop101,hadoop102,hadoop103三台机器创建dolphinscheduler用户。并且一定要配置sudo免密[root@hadoop101 ~]# useradd dolphinscheduler
[root@hadoop101 ~]# echo "dolphinscheduler123" | passwd --stdin dolphinscheduler
Changing password 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
Changing password 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
Changing password 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目录下。我这边使用MySQL5.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 COLLATE utf8_general_ci;
mysql> GRANT ALL PRIVILEGES ON dolphinscheduler.* TO dolphinscheduler@% IDENTIFIED BY 123456;
mysql> GRANT ALL PRIVILEGES ON dolphinscheduler.* TO dolphinscheduler@localhost IDENTIFIED BY 123456;
mysql> flush privileges;
- 创建表和导入基础数据
[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
2.2.2修改运行参数
(1)修改dolphinscheduler_env.sh的环境变量,没有用到的可以注释或者忽略,JAVA_HOME和PATH是必须配置的。
[root@hadoop103 dolphinscheduler-bin]# vim conf/env/dolphinscheduler_env.sh
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export HADOOP_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop
#export SPARK_HOME1=/opt/soft/spark1
export SPARK_HOME2=/opt/module/spark-3.0.0-bin-hadoop2.7
#export PYTHON_HOME=/opt/soft/python
export JAVA_HOME=/opt/module/jdk1.8.0_211
export HIVE_HOME=/opt/module/apache-hive-3.1.2-bin
#export FLINK_HOME=/opt/soft/flink
#export DATAX_HOME=/opt/soft/datax/bin/datax.py
export PATH=$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
- 修改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="2473196869@qq.com"
# user
mailUser="2473196869@qq.com"
#邮箱密码
mailPassword="xxxxxx"
#starttlsEnable和sslEnable不能同时为true
starttlsEnable="true"
sslEnable="false"
sslTrust="smtp.qq.com"
resourceStorageType="HDFS"
defaultFS="hdfs://mycluster"
#resourcemanager HA对应的地址
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" - 如果需要将资源上传到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/
2.2.3一键部署
- 切换用户,执行脚本[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.jar hadoop102:/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 - 脚本完成后,会启动一下5个服务MasterServer ----- master服务 WorkerServer ----- worker服务 LoggerServer ----- logger服务 ApiApplicationServer ----- api服务 AlertServer ----- alert服务
- 根据配置文件访问http地址
- 用户名和密码是admin/dolphinscheduler123
第3章 使用
3.1 快速上手
(1)创建队列
- 创建租户,创建租户前,确保hdfs / 目录下所属者都是hdfs,与ds配置文件保持一致。否则会创建失败
- 创建普通用户
- 创建告警组
- 创建token令牌
- 退出账号,切换到test用户
- 创建项目
- 创建工作流
- 执行简单输出,输出hello world
- 选中箭头,将节点进行连接
- 测试,上线。
- 查看是否成功和日志
3.2 资源中心
(1)资源中心用于上传文件和udf函数,所有上传的文件和资源都会被存储到hdfs上(在安装是配置了相关参数)
- 将jar包上传上去,用于后面测试
3.3 Spark节点
(1)创建hdfs(需要和hdf路径上的owner对应)租户
(2)创建用户
(3)切换用户,创建spark节点
上线测试
启动后查看日志,任务已运行
查看甘特图
三个任务已全部跑完
3.4 创建hive数据源
3.5 Sql节点
(1)测试sql节点,简单做个测试创建一张表并插入测试数据,再从这张表数据并行导入到第二张和第三张表。
(2)创建测试库
Create database testdb;
- 创建三张表CREATE TABLE `testa`(
`id` int,
`name` string);
CREATE TABLE `testb`(
`id` int,
`name` string);
CREATE TABLE `testc`(
`id` int,
`name` string);
(4)配置sql节点 - 运行成功
注意,bug提示:当时我测试的hive是apache版3.1.2,该版hive存在bug,跑任务时会报一下错误,需要修复或替换hive版本。修复后的hive放在文件夹中
3.6 Datax节点
(1)因为在安装时没有配置datax路径,先停止ds集群。演示一个从hive数据导入到mysql的例子
[root@hadoop101 ds]# sh bin/stop-all.sh
(2)在worker节点102,103安装datax
[root@hadoop102 module]# wget datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz
[root@hadoop102 module]# tar -zxvf datax.tar.gz
[root@hadoop102 module]# scp -r datax hadoop103:/opt/module/
(3)配置DolphinScheduler env下的dolphinscheduler_env.sh,设置datax路径
[root@hadoop101 ds]# vim conf/env/dolphinscheduler_env.sh
export DATAX_HOME=/opt/module/datax/bin/datax.py
[root@hadoop101 ds]# scp conf/env/dolphinscheduler_env.sh hadoop102:/opt/module/ds/conf/env/
[root@hadoop101 ds]# scp conf/env/dolphinscheduler_env.sh hadoop103:/opt/module/ds/conf/env/
- 重启ds,创建datax节点[root@hadoop101 ds]# sh bin/start-all.sh
- 由于默认数据源中不存在hive,所以开启自定义模板,放入对应json
- json写完后,但是hdfs路径上存在分区目录,在实际情况导数据的时候分区肯定不能写死,需要传参,所以使用自定义参数
- 设置对应参数。启动任务
大数据任务调度工具 Apache DolphinScheduler
大数据任务调度工具 Apache DolphinScheduler
大数据任务调度工具 Apache DolphinScheduler
大数据调度平台分类(Oozie/Azkaban/AirFlow/DolphinScheduler)
Apache DolphinScheduler 征稿 —开源大数据调度器Apache DolphinScheduler安装维护与实践