跟之前学习过的Azkaban非常的相似,两者二选一。架构师就是老中医(同样的病,抓不同的药)。
Azkaban 能做任务调度,任务编排 A --> B
还可以做定时任务,还能预警(发邮件,发钉钉,打电话)
数仓项目因为是分层的,分层的数据之间,是有先后顺序的。所以可以编写
ods.sh dwd.sh dws.sh dim.sh ads.sh 编排好顺序,每天执行一次,每天自动分析,自动导出指标,可视化界面一刷新就是新的指标数据。
DolphinScheduler是2019年中国易观公司开源的一个调度系统。目前是apache顶级项目之一:https://dolphinscheduler.apache.org/zh-cn/index.html
Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用(拎包入住)。
DAG --有向无环图,有顺序,但是不会形成环的图表。
DolphinScheduler的主要角色如下:
MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交、任务监控,并同时监听其它MasterServer和WorkerServer的健康状态。
WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。
ZooKeeper服务,系统中的MasterServer和WorkerServer节点都通过ZooKeeper来进行集群管理和容错。
Alert服务,提供告警相关服务。
API接口层,主要负责处理前端UI层的请求。
UI,系统的前端页面,提供系统的各种可视化操作界面。
DS是一个大型的,专业的调度工具,非常的耗内存。
到公司一定要看好是什么操作系统:
CentOS 6.x和7.x 命令有所变化 7.x systemctl restart 服务名
6.x service mysql restart等
Unbantu 或者 redhat 命令也不一样。
DolphinScheduler支持多种部署模式,包括单机模式(Standalone)、伪集群模式(Pseudo-Cluster)、集群模式(Cluster)等。
虚拟机的准备工作:
如果是集群的话(至少 8G+3G+3G),如果是单台的(10G+)
单机模式(standalone)模式下,所有服务均集中于一个StandaloneServer进程中,并且其中内置了注册中心Zookeeper和数据库H2。只需配置JDK环境,就可一键启动DolphinScheduler,快速体验其功能。
配置链接:
https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/installation/standalone.html
注意: Standalone 仅建议 20 个以下工作流使用,因为其采用内存式的 H2 Database, Zookeeper Testing Server,任务过多可能导致不稳定,并且如果重启或者停止 standalone-server 会导致内存中数据库里的数据清空。
如何启动和关闭单机版:
# 启动 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh start standalone-server
# 停止 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh stop standalone-server
# 查看 Standalone Server 状态
bash ./bin/dolphinscheduler-daemon.sh status standalone-server
单机启动,不需要zk,它内置了zk,把我们自己的zk服务停掉。
单机模式比较省内存:
访问地址:http://bigdata01:12345/dolphinscheduler
账号和密码: admin dolphinscheduler123
伪集群模式(Pseudo-Cluster)是在单台机器部署 DolphinScheduler 各项服务,该模式下master、worker、api server、logger server等服务都只在同一台机器上。Zookeeper和数据库需单独安装并进行相应配置。
配置链接:
https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/guide/installation/pseudo-cluster.html
集群模式(Cluster)与伪集群模式的区别就是在多台机器部署 DolphinScheduler各项服务,并且可以配置多个Master及多个Worker。
1)节点均需部署JDK(1.8+),并配置相关环境变量。
2)需部署数据库,支持MySQL(8.0+)或者PostgreSQL(8.2.15+)。
3)需部署Zookeeper(3.4.6+)。
4)需安装进程管理工具包psmisc
yum install -y psmisc
把没有用的服务可以停掉了。
停止azkban : azkaban.sh 0
停止datax-web服务:
[root@bigdata01 bin]# cd /opt/installs/datax-web-2.1.2/
[root@bigdata01 datax-web-2.1.2]# cd bin
[root@bigdata01 bin]# ./stop-all.sh
停止hive服务:
hive-server-manager.sh stop
停止hdfs以及yarn:
stop-all.sh
停止单机模式:
[root@bigdata01 bin]# cd /opt/modules/apache-dolphinscheduler-1.3.9-bin/bin
[root@bigdata01 bin]# ./dolphinscheduler-daemon.sh stop standalone-server
原生的命令:
zkServer.sh start
关闭:
zkServer.sh stop
查看状态:
zkServer.sh status
使用脚本命令:
zk.sh start
创建一个用户,设置密码:
CREATE USER 'dolphinscheduler'@'%' IDENTIFIED BY '123456';
需要设置数据库的密码规则:
set global validate_password.policy=LOW;
set global validate_password.length=4;
set global validate_password.mixed_case_count=0;
set global validate_password.number_count=0;
set global validate_password.special_char_count=0;
开始创建一个数据库:
CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
创建用户之后,赋予权限:
GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'dolphinscheduler'@'%';
flush privileges;
连接数据库:
ALTER USER 'dolphinscheduler'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
为什么不需要设置远程连接?
因为创建用户的时候,这个% 就是所有IP的意思。
开始修改数据库连接:
cd /opt/modules/apache-dolphinscheduler-1.3.9-bin/conf
修改:datasource.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://bigdata01:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=dolphinscheduler
spring.datasource.password=123456
拷贝一个mysql的驱动包:
第一次安装:
cp /opt/modules/mysql-connector-java-8.0.26.jar /opt/modules/apache-dolphinscheduler-1.3.9-bin/lib/
如果没有这个jar,从hive中拷贝一个:
cp /opt/installs/hive/lib/mysql-connector-java-8.0.26.jar /opt/modules/apache-dolphinscheduler-1.3.9-bin/lib/
假如已经安装过,需要修复:
cp /opt/modules/mysql-connector-java-8.0.26.jar /opt/installs/dolphinscheduler/lib/
初始化数据库:
进入 /opt/modules/apache-dolphinscheduler-1.3.9-bin/script
执行脚本:create-dolphinscheduler.sh
./create-dolphinscheduler.sh
该软件由于不是一解压就能使用的,所以,需要进行一键部署,在部署之前需要配置脚本中的数据
1)先上传
2)解压
tar -zxvf apache-dolphinscheduler-1.3.9-bin.tar.gz
不要解压到 /opt/installs 下,因为还没有安装呢。
3)修改一键部署脚本
cd /opt/modules/apache-dolphinscheduler-1.3.9-bin/conf/config
修改解压目录下的conf/config目录下的install_config.conf文件
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# NOTICE : If the following config has special characters in the variable `.*[]^${}\+?|()@#&`, Please escape, for example, `[` escape to `\[`
# postgresql or mysql
dbtype="mysql"
# db config
# db address and port
dbhost="bigdata01:3306"
# db username
username="dolphinscheduler"
# database name
dbname="dolphinscheduler"
# db passwprd
# NOTICE: if there are special characters, please use the \ to escape, for example, `[` escape to `\[`
password="123456"
# zk cluster
zkQuorum="bigdata01:2181,bigdata02:2181,bigdata03:2181"
# Note: the target installation path for dolphinscheduler, please not config as the same as the current path (pwd)
installPath="/opt/installs/dolphinscheduler"
# deployment user
# Note: the deployment user needs to have sudo privileges and permissions to operate hdfs. If hdfs is enabled, the root directory needs to be created by itself
deployUser="root"
# alert config
# mail server host
mailServerHost="smtp.exmail.qq.com"
# mail server port
# note: Different protocols and encryption methods correspond to different ports, when SSL/TLS is enabled, make sure the port is correct.
mailServerPort="25"
# sender
mailSender="xxxxxxxxxx"
# user
mailUser="xxxxxxxxxx"
# sender password
# note: The mail.passwd is email service authorization code, not the email login password.
mailPassword="xxxxxxxxxx"
# TLS mail protocol support
starttlsEnable="true"
# SSL mail protocol support
# only one of TLS and SSL can be in the true state.
sslEnable="false"
#note: sslTrust is the same as mailServerHost
sslTrust="smtp.exmail.qq.com"
# user data local directory path, please make sure the directory exists and have read write permissions
dataBasedirPath="/tmp/dolphinscheduler"
# resource storage type: HDFS, S3, NONE
resourceStorageType="HDFS"
# resource store on HDFS/S3 path, resource file will store to this hadoop hdfs path, self configuration, please make sure the directory exists on hdfs and have read write permissions. "/dolphinscheduler" is recommended
resourceUploadPath="/dolphinscheduler"
# if resourceStorageType is HDFS,defaultFS write namenode address,HA you need to put core-site.xml and hdfs-site.xml in the conf directory.
# if S3,write S3 address,HA,for example :s3a://dolphinscheduler,
# Note,s3 be sure to create the root directory /dolphinscheduler
defaultFS="hdfs://bigdata01:9820"
# if resourceStorageType is S3, the following three configuration is required, otherwise please ignore
s3Endpoint="http://192.168.xx.xx:9010"
s3AccessKey="xxxxxxxxxx"
s3SecretKey="xxxxxxxxxx"
# resourcemanager port, the default value is 8088 if not specified
resourceManagerHttpAddressPort="8088"
# if resourcemanager HA is enabled, please set the HA IPs; if resourcemanager is single, keep this value empty
yarnHaIps=
# if resourcemanager HA is enabled or not use resourcemanager, please keep the default value; If resourcemanager is single, you only need to replace ds1 to actual resourcemanager hostname
singleYarnIp="bigdata01"
# who have permissions to create directory under HDFS/S3 root path
# Note: if kerberos is enabled, please config hdfsRootUser=
hdfsRootUser="root"
# kerberos config
# whether kerberos starts, if kerberos starts, following four items need to config, otherwise please ignore
kerberosStartUp="false"
# kdc krb5 config file path
krb5ConfPath="$installPath/conf/krb5.conf"
# keytab username
keytabUserName="[email protected]"
# username keytab path
keytabPath="$installPath/conf/hdfs.headless.keytab"
# kerberos expire time, the unit is hour
kerberosExpireTime="2"
# api server port
apiServerPort="12345"
# install hosts
# Note: install the scheduled hostname list. If it is pseudo-distributed, just write a pseudo-distributed hostname
ips="bigdata01"
# ssh port, default 22
# Note: if ssh port is not default, modify here
sshPort="22"
# run master machine
# Note: list of hosts hostname for deploying master
masters="bigdata01"
# run worker machine
# note: need to write the worker group name of each worker, the default value is "default"
workers="bigdata01:default"
# run alert machine
# note: list of machine hostnames for deploying alert server
alertServer="bigdata01"
# run api machine
# note: list of machine hostnames for deploying api server
apiServers="bigdata01"
开始进行安装:
安装之前先启动zk,因为安装完会自动启动,启动过程需要zk,否则启动失败
因为这个软件比较大,所以需要先停止到没有用的服务。
cd /opt/modules/apache-dolphinscheduler-1.3.9-bin
执行一键安装脚本: ./install.sh
以下操作都是在安装目录下:
1)一键启停所有服务
./bin/start-all.sh
./bin/stop-all.sh
注意同Hadoop的启停脚本进行区分。
2)启停 Master
./bin/dolphinscheduler-daemon.sh start master-server
./bin/dolphinscheduler-daemon.sh stop master-server
3)启停 Worker
./bin/dolphinscheduler-daemon.sh start worker-server
./bin/dolphinscheduler-daemon.sh stop worker-server
4)启停 Api
./bin/dolphinscheduler-daemon.sh start api-server
./bin/dolphinscheduler-daemon.sh stop api-server
5)启停 Logger
./bin/dolphinscheduler-daemon.sh start logger-server
./bin/dolphinscheduler-daemon.sh stop logger-server
6)启停 Alert
./bin/dolphinscheduler-daemon.sh start alert-server
./bin/dolphinscheduler-daemon.sh stop alert-server
进入:
DolphinScheduler UI地址为http://bigdata01:12345/dolphinscheduler
初始用户的用户名为:admin,密码为dolphinscheduler123
查看安装路径:
/opt/installs/dolphinscheduler 以后都使用这个文件夹下的命令或者配置文件
安装原理图:
假如zookeeper 在安装的时候,你安装的是集群的话,启动的时候也必须是集群,否则会zk 有可能没启动,这个错误。
假如启动完成后连接不上:
检查你的数据库连接是否初始化成功了。
去查看日志:/opt/installs 这个文件夹下的ds中的logs 查看
检查zk状态是否正常(如果是集群,就要启动集群)
查看防火墙是否关系
租户对应的是Linux系统用户,是Worker执行任务使用的用户。如果Worker所在节点没有这个用户,Worker会在执行任务时创建这个用户。比如Linux中 root , 还可以创建laoyan,假如你使用了一个Linux中不存在的用户,会在linux中创建该用户。
一看上面的错误,就知道hadoop没有启动hdfs
start-all.sh 启动hadoop集群
可以使用普通用户登录ds
添加组内成员:
切换普通用户
下图为工作流配置页面,共包含三个模快,分别为工作流定义、工作流实例和任务实例。
工作流定义:用于定义工作流,包括工作流各节点任务详情及各节点依赖关系等。
工作流实例:工作流每执行一次就会生成一个工作流示例。此处可查看正在运行的工作流以及已经完成的工作流。
任务实例:工作流中的一个节点任务,每执行一次就会生成一个任务实例。此处可用于查看正在执行的节点任务以及已经完成的节点任务。
定义工作流:
依次创建B任务,和C任务
将这三个任务,进行任务编排:
点击保存按钮,出现保存界面:
定义任务结束:
任务必须先上线才能执行,只有下线才能编辑
点击上线,并没有运行,需要点击--执行
此时任务实例就会出现:
假如你的任务运行了,但是没有工作流实例,只提示成功,可以查看一下是否为内存不够了。
worker 192.168.233.128:1234 current cpu load average 0.43 is too high or available memory 0.17G is too low
提升一下内存即可。
创建好的定时任务需要将定时任务上线才可以运行。
查看定时任务是否运行了:
当Linux的系统时间,不对的时候,定时任务,普通任务都会受到影响
同步时间的两个命令:
systemctl restart chronyd
ntpdate time1.aliyun.com
此处的传参,有两种,一个是局部变量,一个是全局变量
将工作流上线,执行,查看A的日志,发现打印了:
目前 A\B\C 任务都需要一个变量 dt。
在保存工作流的时候,弹出来的界面可以指定全局变量。
执行结果:
B和C都是打印的2023-7-20,唯独A打印的是2023-7-18
因为A设置了局部变量,当一个任务有局部变量又有全局变量的时候,以局部变量的值为准(就近原则)
Linux中获取前一天数据的命令:date -d '1 day ago' +'%y%m%d'
date1=`date -d '1 day ago' +'%y%m%d'`
DolphinScheduler提供了一些时间相关的系统参数,方便定时调度使用
1)系统参数--格式太固定,没法自定义
实战:
查看B的日志:
在C任务中:
自定义日期格式
$[yyyyMMdd], $[HHmmss], $[yyyy-MM-dd]
$[yyyyMMdd]也可以写成$[yyyy-MM-dd]
$[HHmmss] 也可以添加: $[HH:mm:ss]
保存之后其实本质上是上传到了hdfs路径下。
资源如何使用?
DS默认支持两种告警:邮件和SMS(短信),短信这个功能有点Bug,可以演示邮件。
DS是一个任务调度工具,任务执行很慢,所以我们不需要一个告警通知,不管是成功还是失败,都需要第一时间通知我。
联想到Azkaban 里面有 邮箱、电话、钉钉
需要一个能够发送邮件的邮箱(这个邮箱是一个发送方,需要将信息发送给需要的人)
vi /opt/installs/dolphinscheduler/conf/alert.properties
不要修改/opt/modules下的dolphinscheduler,这个文件夹下的内容在你安装完之后的那一刻已经没有任何价值了。
修改alert.properties中的文件:
# mail server configuration
mail.protocol=SMTP
mail.server.host=smtp.163.com
mail.server.port=25
mail.sender=邮箱
mail.user=邮箱
mail.passwd=授权码
# TLS
mail.smtp.starttls.enable=false
# SSL
mail.smtp.ssl.enable=false
mail.smtp.ssl.trust=smtp.exmail.qq.com
重启alert服务:
./bin/dolphinscheduler-daemon.sh start alert-server
./bin/dolphinscheduler-daemon.sh stop alert-server
记得同步一下时间,在ds中,同步时间有奇效。
假如需要你做一个电话通知,怎么办?默认不支持。
使用第三方平台 -- 睿象云
只需要获取一个睿象云的邮箱即可得到电话通知。
当一个工作流特长,任务特别复杂的时候,执行到某一处失败了,下一次想从失败的地方开始运行,而不是重新开始。
修改任务,将失败的地方修复一下,开始运行。
重跑:从头开始,再来一遍
恢复失败:从失败的节点开始运行,直到运行结束。
数仓项目中,其实只统计了一天的数据 20230711
真实的数仓,应该是每天都会将我们编写的SQL语句执行一遍,手动执行的效率太低了,占用大量的时间。
可以使用ds将任务进行编排。
可以编写4个脚本:
ods.sh dwd.sh dws.sh ads.sh
这四个脚本依次执行,有先后顺序的。
每一个脚本中:
以ods.sh 为例:
第一:执行sqoopJob.sh
第二:采集本地的数据到hdfs上(flume)执行导入语句
第三:广告数据每天都在采集中,所以不用管了。
dwd.sh 干点:
/opt/installs/hive/bin/hive -f dwd.hql
dwd.hql语句:
比如这样的语句:
insert overwrite table dwd_nshop.dwd_nshop_actlog_launch partition(bdp_day='20230711')
select
customer_id ,
device_num ,
device_type ,
os ,
os_version ,
manufacturer,
carrier,
network_type,
area_code,
case
when from_unixtime(cast(ct/1000 as int) + 3600*8,'HH') between 0 and 6 then 1
when from_unixtime(cast(ct/1000 as int) + 3600*8,'HH') between 7 and 12 then 2
when from_unixtime(cast(ct/1000 as int) + 3600*8,'HH') between 13 and 18 then 3
when from_unixtime(cast(ct/1000 as int) + 3600*8,'HH') between 19 and 24 then 4
end launch_time_segment,
ct
from ods_nshop.ods_nshop_01_useractlog where action='02'
and bdp_day='20230711';
一个文件中,写一堆这样的语句,后缀名修改为hql即可。hql语句中需要动态传参,每日日期不一样。
将4个任务编写完之后,还有定时执行,一般 在12:30, 因为12点之后,还有一些采集数据的任务没有执行完。
cat /dev/null > /var/spool/mail/root
echo "unset MAILCHECK" >> /etc/profile
source /etc/profile