作者:qCANL | 来源:互联网 | 2023-05-18 13:20
全流程调度器部署1.不同层数据装载脚本之间存在依赖关系2.业务数据每天都产生,因此脚本每天都要执行--定时问题可以考虑使用ooize、Azkaban,Ooize是重量级的任务调度系
全流程调度器部署
1.不同层数据装载脚本之间存在依赖关系
2.业务数据每天都产生,因此脚本每天都要执行--定时问题
可以考虑使用ooize、Azkaban,Ooize是重量级的任务调度系统,配置更复杂,配合界面UI使用
说到定时——想到linux中的crontab命令
crontab命令详解
命令格式:
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
命令功能:
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。
Azkaban学习
Azkaban是一个轻量级工作流程调度器(Crontab定时的是单一的工作/任务)
工作流程:由多个相互依赖的工作单元组成
Azkaban Web Server MySQL Azkaban Executor Server
Azkaban Executor Server处理工作流和作业的实际执行
部署模型:单机模式/集群模式(Web Server和Executor Server独立部署,可部署多个Executor Server,能够起到一定的负载均衡和容灾的作用)
本项目中在hadoop102部署Web Server,在hadoop102,hadoop103,hadoop104上部署Executor Server
在hadoop102上创建azkaban用户,赋予其增删改查的权限。再创建一个azkaban的库,进行数据库初始化
下图表示hadoop102上的executor已经启动,但未激活
执行下面的语句后,更新表可以看到已激活
curl -G "hadoop104:12321/executor?action=activate" && echo
Azkaban失败重试
自动失败重试:在config中设置config: retries: 3 retry.backoff: 10000
手动失败重试:
手动将其设置为disable
Azkaban条件工作流
1)运行时参数案例
父Job将参数写入JOB_OUTPUT_PROP_FILE环境变量所指向的文件
子Job使用 ${jobName:param}来获取父Job输出的参数并定义执行条件
2)预定义宏案例
Azkaban中预置了几个特殊的判断条件,称为预定义宏
预定义宏会根据所有父 Job 的完成情况进行判断,再决定是否执行。可用的预定义宏如 下:
(1)all_success: 表示父 Job 全部成功才执行(默认)
(2)all_done:表示父 Job 全部完成才执行
(3)all_failed:表示父 Job 全部失败才执行
(4)one_success:表示父 Job 至少一个成功才执行
(5)one_failed:表示父 Job 至少一个失败才执行
定时任务
需求:JobA 每间隔 1 分钟执行一次;
具体步骤:
1)Azkaban 可以定时执行工作流。在执行工作流时候,选择左下角 Schedule
2)右上角注意时区是上海,然后在左面填写具体执行事件,填写的方法和 crontab 配置定时 任务规则一致。
邮件报警 (重要)
Azkaban默认自带支持邮件报警
1.打开邮箱的SMTP协议
2.在hadoop102中配置文件
3.重新登录账号,在azkaban界面-文件执行的部分设置notification
成功/失败都可以发邮件到设置的邮箱
电话报警
第三方告警平台集成,如 睿象云 免费试用
1.将睿象云与azkaban进行集成(选择通用集成中的Cloud Alert Email集成方式)当睿象云的邮箱接收到我们azkaban发过去的邮件,就会出发电话报警
2.利用睿象云发送电话报警
注意:
在测试过程中发现,如果azkaban的发件人是qq邮箱,发送到睿象云的邮件会被退回,所以只好改成其余的如126邮箱
多Excutor模式的注意事项
Azkaban 多 Executor 模式是指,在集群中多个节点部署 Executor。在这种模式下, Azkaban web Server 会根据策略,选取其中一个 Executor 去执行任务。
为确保所选的 Executor 能够准确的执行任务,我们须在以下两种方案任选其一,推荐使 用方案二。
方案一:指定特定的 Executor(hadoop102)去执行任务。
1)在 MySQL 中 azkaban 数据库 executors 表中,查询 hadoop102 上的 Executor 的 id。
2)在执行工作流程时加入 useExecutor 属性,如下
方案二:在 Executor 所在所有节点部署任务所需脚本和应用。(推荐)
在数仓项目中使用azkaban进行全流程调度
流程:
数据采集
1)用户行为日志flume-kafka-hdfs。不需要进行每日工作调度,即不需要包含在工作流程中。因为flume实时采集通道需要在启动后一直运行,不需要每天重复启动
2)业务数据。sqoop进行批量导数据,每次执行sqoop相当于执行mapreduce,因此sqoop流程需要包含在调度流程中
ads层的数据在作用于报表系统之前,会先用sqoop从hive中的数据(hdfs中)导出到mysql中
导出时只支持将hdfs文件导出到mysql
注意:
1.mysql中建表字段与ads中的字段个数、顺序、类型一致
2.由于每天都是以文件的形式全表导入,因此需要注意mysql数据的重复问题:通过建立主键和唯一键解决
全流程调度 新日期的数据准备
用户行为日志写到hdfs上,业务数据写到mysql
用户日志的生成过程:
1.启动zookeeper、kafka、flume
2.修改hadoop102,hadoop103上的application.yml日期
3.然后使用lg.sh产生日志,可以去hadoop102:9870的origin_data中查看
4.考虑到我们机器的资源不足,关闭flume、kafka
业务数据的生成:
进入/opt/module/db_log/
修改application.properties
azkaban中任务的流程图
编写azkaban.projext 和 gmall.flow
Azkaban上传文件报错:Installation Failed. java.lang.String cannot be cast to java.util.Map
可以确定是.project 文件的问题,读成了version0,所以修改.project 文件:
azkaban-flow-version: 2.0
注意2.0与:之间要两个空格