【本文正在参与 “拥抱开源 — Apache DolphinScheduler 有奖征稿活动】
拥开源—DolphinScheduler 有奖征稿活动 -CSDN
1.安装篇
安装提醒,多看官网,官网写的很详细,多看几遍官网,基本问题都能解决,毕竟国人开源的项目,整体官网还是很友好的,相关安装文档参考官网。
以下根据本人解决问题思路处理,可能根据实际有些差异,供大家参考。
以使用CDH 6.3.2为平台,DolphinScheduler 1.3.3 从2020年12月到使用到现在。
1.运行参数修改
dolphinscheduler_env.sh参数改成:
export HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
export HADOOP_CONF_DIR=/opt/cloudera/parcels/CDH/lib/hadoop/etc/hadoop
#export SPARK_HOME1=/opt/cloudera/parcels/CDH/lib/spark1
#export SPARK_HOME2=/opt/cloudera/parcels/CDH/lib/spark2
#export PYTHON_HOME=/usr/local/python3
export JAVA_HOME=/usr/java/jdk1.8.0_172-amd64
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:$FLINK_HOME/bin:$DATAX_HOME:$PATH
我们只使用shell调度模式,没有使用dolphin自带的spark 之类的,所以就没配置,有需要按照这样配置,这样dolphin才能正常识别环境,运行相关脚本,需要特别注意
2.安装过程中如果遇到脚本正常执行,doplphin却显示失败可能原因:
a.zookeeper配置错误
#Zookeeper地址
zkQuorum="192.168.xx.xx:2181,192.168.xx.xx:2181,192.168.xx.xx:2181"
b.yarn配置错误
HA 和 单 ResourceManager 需要注意以下两个参数配置,认真读完官网文档
官网参数:
# 如果没有使用到Yarn,保持以下默认值即可;如果ResourceManager是HA,则配置为ResourceManager节点的主备ip或者hostname,比如"192.168.xx.xx,192.168.xx.xx";如果是单ResourceManager请配置yarnHaIps=""即可
yarnHaIps="192.168.xx.xx,192.168.xx.xx"
# 如果ResourceManager是HA或者没有使用到Yarn保持默认值即可;如果是单ResourceManager,请配置真实的ResourceManager主机名或者ip
singleYarnIp="yarnIp1"
#####按照以下方式配置#####
如果ResourceManager是HA
yarnHaIps=""即可
yarnHaIps="192.168.xx.xx,192.168.xx.xx"
singleYarnIp="yarnIp1"(默认不要更改)
如果如果ResourceManager是HA或者没有使用到Yarn保持默认值即可;如果是单ResourceManager,把第一个参数注释掉
#yarnHaIps="192.168.xx.xx,192.168.xx.xx"
singleYarnIp="yarnIp1"
3.安装邮箱报警无法正常使用,可能原因:
以下是官网文档里的 我这边添加注释注意事项
# 邮件配置,以qq邮箱为例
# 邮件协议
mailProtocol="SMTP"
# 邮件服务地址
mailServerHost="smtp.qq.com"
(这个地址注意查找下,不要配置错)
# 邮件服务端口
mailServerPort="25"
(如果使用阿里云这个端口默认是关闭的,需要注意,采用在自己电脑 telnet 主机ip 25 查看 )
# mailSender和mailUser配置成一样即可
(这个注意看清,二这一样)
# 发送者
mailSender="xxx@qq.com"
# 发送用户
mailUser="xxx@qq.com"
# 邮箱密码
mailPassword="xxx"
# TLS协议的邮箱设置为true,否则设置为false
starttlsEnable="true"
# 开启SSL协议的邮箱配置为true,否则为false。注意: starttlsEnable和sslEnable不能同时为true
sslEnable="false"
(需要注意:
服务器端口如果是465
starttlsEnable="false"
sslEnable="true"
服务器端口是:587
starttlsEnable="true"
sslEnable="false")
# 邮件服务地址值,参考上面 mailServerHost
sslTrust="smtp.qq.com"
4.特别注意项
安装好dolphinscheduler后,后期需要更改配置文件参数,都要先停止dolphinscheduler所以的服务,
在bin/目录下,然后在原始安装文件里进行更改,就是第一次解压安装的文件,不需要到每个服务器里去更改已经安装的目录,更改后再执行sh install.sh,这样所有的机器服务器都正常配置了,这样才能避免很多坑。
2.使用配置篇
我这里只补充写使用的问题,正式介绍参考官网的文档,很详细的
https://dolphinscheduler.apache.org/zh-cn/docs/latest/user_doc/system-manual.html
1.租户配置问题
进入安全中心配置租户,租户这个就是对应Liunx 用户,这个配置的租户在Liunx 需要给予相关权限,这个需要注意,好多时候会报权限问题,例如我们配置的调度文件在/mnt/XXX/目录下,我们使用 dolphinscheduler租户调度时,会给这个目录 dolphinscheduler用户权限,其他同理。
2.用户配置
这里用户就是登录DolphinScheduler 用户,这里尽可能配置个主要维护人用户,加上用户的邮箱,用于添加在报警功能,这样加在报警组里,整个服务挂掉,会邮件报警的。
3.告警组配置
这里把上面用户加进来,这样服务就可以正常报警了,此报警配置组,用户在工作流中报警显示,所以请认真配置
4.Worker分组管理
这里就是的这个配置控制,它决定worker提交的机器位置。
#在哪些机器上部署DS服务,本机选localhost
ips="ds1,ds2,ds3,ds4"
#ssh端口,默认22
sshPort="22"
#master服务部署在哪台机器上
masters="ds1,ds2"
#worker服务部署在哪台机器上,并指定此worker属于哪一个worker组,下面示例的default即为组名
workers="ds3:default,ds4:default"
#报警服务部署在哪台机器上
alertServer="ds2"
#后端api服务部署在在哪台机器上
apiServers="ds1"
这里会体现在节点配置中
3.项目管理
我们采用迭代方式进行维护,不同大家可按照不同业务部门进行维护各项目是相互独立,是可以进行依赖的,不过不建议跨项目依赖。
以下仅供参考:
1.工作流定义维护
目前我们调度的项目是整个离线数仓项目
按照标准的分层 ODS, DWD ,DWS ,ADS 进行调度,
按照传统方式把各层都放在一个工作流中,通过一个总工作流进行依赖调度
这样整体维护行较差,所以我们这边采用按照分层信息不同类型的表按照不同的用处
这样做了具体细分,做到解耦。
ods层和dwd层脚本较多 ,可以根据业务进行划分 ,让他们相关依赖,这样 你在添加先脚本的时候 不需要再考虑 跨层依赖
再进行采用sub_process 进行组个 全部上线后,只需要定时调度 ods_dwd_dws_ads 这个sub_process任务
如果ods层或者其他层 层级间依赖过多 ,存在一种现象
我们可以使用sub_process 进行单层依赖,这样细分进行解耦合
制作成这样
然后再配合上上面的总任务调度使用 ,
这样整个项目关系比较清晰,减少了不少依赖的情况,添加新脚本时候只需要按照分类加进去就行,维护起来比较方便。
要充分使用sub_process 功能 。
2.工作流脚本维护
我们这边脚本都是采用shell方式调度,相关sqoop 脚本也是自己写好的,这样方便整个数仓ETL脚本维护,
只需要把项目脚本当在/mnt/下就行,通过git进行脚本更新迭代,
我们做了全局变量
参考事例
在全局变量中设置例如 project_address /mnt/xx/ 变量用${project_address}引用
这样方便维护使用。
3.判断CONDITIONS使用
此时跑的情况为 000 成功 1-23 成功 走222
此时 000成功 1-23失败 走333
4.解决跨项目的依赖问题
如果出现相关需要项目的情况
使用DEPENDENT功能
此项可以解决许多问题,比如脚本一个小时跑一次,前一个显示没有跑完,后一个小时不跑情况,就利用这个功能做个判断,检测前一小时任务是否成功就行了,这是个很好的功能。
5.任务启动参数配置
1.失败策略
继续:
如果此时A成功 ,D失败了, 依然会运行C ;
结束:
如果此时A 成功,(B,C同时跑),D失败了,就会暂停整个工作里,不管C 是否正常跑完。
5.资源使用情况:
DolphinScheduler调度,如果资源不足情况,会无法正常调度,相关参数在配置中,所以请保证服务器的资源充足
4.相关延伸
由于DolphinScheduler没有对工作流具体脚本的用时整体排序统计,不利于团队对脚本的优化,所以我们做了两张表以下是相关SQL ,使用相关报表工具进行展示
1.最近XXX个任务排名:
SELECT name,
DATE_FORMAT(start_time, '%Y-%m-%d') AS date_time,
DATE_FORMAT(start_time, '%H:%i:%s') AS start_time,
DATE_FORMAT(end_time, '%H:%i:%s') AS end_time,
CONCAT(
CONCAT(TIMESTAMPDIFF(SECOND, start_time, end_time) DIV 3600, '时'),
CONCAT(TIMESTAMPDIFF(SECOND, start_time, end_time) MOD 3600 DIV 60, '分'),
CONCAT(TIMESTAMPDIFF(SECOND, start_time, end_time) MOD 3600 MOD 60 DIV 1, '秒')
) AS time,
TIMESTAMPDIFF(SECOND, start_time, end_time) MOD 3600 AS s_time
FROM dolphinscheduler.t_ds_task_instance
WHERE task_type = "SHELL"
and state = 7
and TO_DAYS(submit_time) = TO_DAYS(now())
ORDER BY s_time DESC
limit XXX;
2.最近5天任务用时排名
SELECT name,
DATE_FORMAT(start_time, '%Y-%m-%d') AS date_time,
DATE_FORMAT(start_time, '%H:%i:%s') AS start_time,
DATE_FORMAT(end_time, '%H:%i:%s') AS end_time,
CONCAT(
CONCAT(TIMESTAMPDIFF(SECOND, start_time, end_time) DIV 3600, '时'),
CONCAT(TIMESTAMPDIFF(SECOND, start_time, end_time) MOD 3600 DIV 60, '分'),
CONCAT(TIMESTAMPDIFF(SECOND, start_time, end_time) MOD 3600 MOD 60 DIV 1, '秒')
) AS time,
TIMESTAMPDIFF(SECOND, start_time, end_time) MOD 3600 AS s_time
FROM dolphinscheduler.t_ds_task_instance
WHERE
task_type = "SHELL"
and state = 7
and date_sub(curdate(), INTERVAL 5 DAY) <= start_time
ORDER BY s_time DESC
5.相关吐槽
由于目前版本任务才分json拆分问题,导致导出工作流到新环境中出出现问题,需要手动重新对应工作流处理上线,目前只能人工解决,对整体维护起来不太舒服,官方说2.0版本以后会拆分处理,解决此问题,其他的问题基本都能解决。
以上是使用的相关经验总结和吐槽,希望DolphinScheduler越来越好。
【本文正在参与 “拥抱开源 — Apache DolphinScheduler 有奖征稿活动】