Fordeal 的数据平台调度零碎之前是基于 Azkaban 进行二次开发的,然而在用户层面、技术层面都存在一些痛点问题难以被解决。比方在用户层面短少工作可视化编辑界面、补数等必要性能,导致用户上手难体验差。在技术层面,架构过期,继续迭代难度大。基于这些状况,通过竞品比照和调研后,Fordeal 数据平台新版零碎决定基于 Apache DolphinScheduler 进行降级革新。那整个迁徙过程中开发人员是如何让应用方平滑过渡到新零碎,又做出了哪些致力呢?
5 月 Apache Dolphinscheduler 线上 Meetup,来自 Fordeal 的大数据开发工程师卢栋给大家分享了平台迁徙的实践经验
讲师介绍
卢栋Fordeal 大数据开发工程师。5 年的数据开发相干教训,目前就任于 Fordeal,次要关注的数据技术方向包含:湖仓一体、MPP 数据库、数据可视化等。
本次演讲次要蕴含四个局部:
- Fordeal 数据平台调度零碎的需要剖析
- 迁徙到 Apache Dolphin Scheduler 过程中如何适配
- 适配实现后如何实现特新加强
- 将来布局
01 需要剖析
01 Fordeal 利用背景
Fordeal 数据平台调度零碎最早是基于 Azkaban 进行二次开发的。反对机器分组,SHELL 动静参数、依赖检测后勉强能够满足应用,但在日常应用中仍然存在以下三个问题,别离是在用户、技术和运维的层面。
首先在 用户层面,不足可视化的编辑、补数等必要的性能。只有技术的同学能力应用该调度平台,而其余没有根底的同学如果应用就非常容易出错,并且 Azkaban 的报错模式导致开发人员对其进行针对性地进行批改。
第二在 技术层面,Fordeal 数据平台调度零碎的技术架构十分古老,前后端并不拆散,想要减少一个性能,二开的难度十分高。
第三在 运维层面,也是最大的问题。零碎不定时会进去 flow 执行卡死的问题。要解决这个问题,须要登录到数据库,删除 execution flow 外面的 ID,再重启 Worker 和 API 服务,过程非常繁琐。
02 Fordeal 所做的调研
因而,在 2019 年 Apache DolphinScheduler 开源时,咱们就及时地关注到,并开始理解是否能够进行迁徙。过后一起调研了三款软件,Apache Dolphin Scheduler、Azkaban 和 Airflow。咱们基于五大需要。
-
首选 JVM 系语言。因为 JVM 系语言在线程、开发文档等方面较为成熟。
Airflow 基于 Python 其实和咱们当初的体系并无二异,非技术同学无奈应用
- 分布式架构,反对 HA。Azkaban 的 work 并不是分布式 web 和 master 服务是耦合在一起,因而属于单节点。
- 工作流必须反对 DSL 和可视化编辑。这样能够保障技术同学能够用 DSL 进行书写,可视化则面向用户,用以扩充用户面。
- 前后端拆散,支流架构。前后端能够离开进行开发,剥离开来后耦合度也会升高。
- 社区活跃度。最初关注的的社区活跃度对于开发也非常重要,如果常常存在一些“陈年”老 bug 都须要本人进行批改,那会大大降低开发效率。
03 Fordeal 当初的架构
现在咱们的数据架构如上图。Apache Dolphin Scheduler 承接了整个生命周期从 HDFS、S3 采集到 K8S 计算再到基于 Spark、Flink 的开发。两边的 olphinScheduler 和 Zookeeper 都是作为基础性的架构。咱们的调度信息如下:Master x2、Worker x6、API x1(承载接口等),目前日均工作流实例:3.5k,日均工作实例 15k+。(下图为 1.2.0 版本架构图)
02 适配迁徙
01 外部零碎对接
Fordeal 外部零碎须要上线对用户提供拜访,这时候必须对接几个外部服务,以升高用户上手老本和缩小运维工作。次要包含以下 三个零碎。
-
单点登录零碎:
基于 JWT 实现的 SSO 零碎,一次登录,认证所有。
-
工单零碎:
DS 对我的项目的受权接入工单,防止人肉运维。
(接入所有受权动作,实现自动化)
-
告警平台:
扩大 DS 告警模式,将告警信息全副发送到外部告警平台,用户可配置电话、企业微信等模式告警。
下方三张图就是对应别离是 登录零碎、工单权限和企业微信的告警。
02 Azkaban 的兼容
Azkaban 的 Flow 治理是基于 自定义的 DSL 配置,每个 Flow 配置蕴含的 Node 数量多则 800+ 少则 1 个,其更新的形式次要有三类。
1、用户本地保留,每次批改后 zip 压缩上传,用户自行保护 Flow 的信息。2、所有的 flow 配置和资源都托管 git,在 Azkaban 我的项目设置中绑定 git 地址,git 是由咱们自行开发的,git 提交后在页面点击刷新按钮。3、所有的 Flow 托管到配置核心,对接 Azkaban 的上传接口去笼罩掉之前的调度信息。
上图为一部分数仓我的项目的flow 配置文件。想要把 Azkaban 迁徙到 Apache DolphinScheduler 中,咱们一共列出了十点需要。
- DS 上传接口反对 Flow 配置文件的解析并生成工作流。(反对嵌套 flow)Flow 的配置文件就相当于 Azkaban 的 DAG 文件,如果不配适咱们就要本人写代码解析配置文件,将 Flow 转成 Json。
- DS 资源核心反对 文件夹(托管 Azkaban 我的项目下的所有资源)过后咱们的 1.2.0 版本过后没有文件夹性能,而咱们的数仓有许多文件夹,因而咱们必须要反对。
- DS 提供 client 包,提供根底的数据结构类和工具类,不便调用 API,生成工作流的配置。
- DS 反对工作流并发管制(并行或跳过)
- DS 工夫参数需反对配置时区(例如:dt=$[ZID_CTT yyyy-MM=dd=1])。尽管咱们配置的时区大多在海内,但对于用户而言,他们更心愿看到北京时区。
- DS 跑数和部署界面反对全局变量覆写。因为咱们的版本较低,一些相似补数的性能都没有,工作流用什么变量跑,心愿用户能够本人设置。
- DS DAG 图反对 task 多选操作。
- DS task 日志输入最终执行内容,不便用户查看调试。
- DS 反对运行中失败工作手动重试。通常一次跑数仓须要数个小时,其中有几个 task 可能因为代码问题报错,咱们心愿能够在不中断工作流的状况下,手动重试,把谬误的节点逐个批改完后重试。这样最终的状态是胜利的。
- 数仓我的项目需反对一键迁徙,放弃用户的工作习惯(jenkins 对接 DS)。
在咱们与五六个组进行一直的沟通和革新后,这十点需要最终满足。
03 性能优化汇总
从 Azkaban 齐全迁徙到 Apache DolphinScheduler 实现大略用时一年,因为波及到 API 用户,波及到 git 用户,还有反对各种各样性能用户,每个项目组都会提出本人的需要,在帮助其余团队迁徙的整个过程中,依据用户应用反馈,共提交了 140+ 个优化 commit,以下是 commit 分类词云。
03 个性加强
01 前端重构
对于为什么咱们要重构,咱们的痛点到底是什么?咱们列出了一下几点。首先 ,Azkaban 的操作步骤过于繁琐。用户想要找一个工作流定义时,首先要关上我的项目,找到我的项目首页中的工作流列表,再找到定义,用户无奈一眼找到我想要的定义。 第二 ,我无奈通过名字、分组等条件检索到工作流定义和实例。 第三 ,无奈通过 URL 分享工作流定义和实例详情。 第四,数据库表和 API 设计不合理,查询卡顿,常常会呈现长事务告警。第五,界面很多中央写死布局,如设置了宽度,导致增加列不能很好适配电脑和手机。第六,工作流定义和实例短少批量操作。但凡程序必定有谬误,如何批量重试,成为用户十分头疼的问题。
执行计划
- 基于 AntDesign 库开发新的一套前端界面。
-
弱化我的项目概念,不想让用户过多去关注我的项目这个概念,我的项目只作为工作流或实例的标签。
目前电脑版只有四个入口,首页、工作流列表、执行列表和资源核心列表,手机版只有两个入口,别离是工作流列表和执行列表。
- 简化操作步骤,将工作流列表和执行列表放在第一入口。
-
优化查问条件和索引,减少批量操作接口等。
减少联结索引。
- 齐全适配电脑和手机(除了编辑 dag,其余性能都统一)
02 依赖调度
什么是依赖调度 ?即工作流实例或 Task 实例胜利后被动登程上游工作流或 Task 跑数(执行状态为依赖执行)。 构想以下几个场景,上游工作流须要依据上游工作流的调度工夫去设置本人的定时工夫;上游跑数失败后,上游定时跑数是也会呈现谬误;上游补数,只能告诉所有上游业务方补数。数仓上下游定时距离调整难,计算集群资源利用率没有最大化(K8S)。因为用户并不是继续提交的。
构思图(按层触发工作流)
依赖调度规定
- 工作流反对工夫,依赖,两者组合调度(且与或)
- 工作流内的 Task 反对依赖调度(不受定时限度)。
- 依赖调度须要设置一个依赖周期,只有当所有的依赖在这个周期内满足才会触发。
- 依赖调度最小的设置单位是 Task,反对依赖多个工作流或 Task(只反对且关系)。
- 工作流仅仅只是一个执行树中的组概念,就是说不会限度 Task。
手机工作流依赖详情
03 工作拓展
拓展更多的 Task 类型,将罕用的性能形象并提供编辑界面,升高应用老本,咱们次要扩大了以下几个。
-
数据开放平台(DOP):
次要是提供数据导入导出性能(反对 Hive、Hbase,Mysql、ES、Postgre、Redis、S3)
-
数据品质:基于 Deequ 开发的数据校验。
对数据进行形象供用户应用。
- SQL-Prest 数据源:SQL 模块反对 Presto 数据源
- 血统数据采集:内置到所有 Task 中,Task 裸露血统须要的所有数据
04 监控告警
架构为 Java+Spring 下的服务监控,平台是有一套通用的 Grafana 监控看板,监控数据存储在 Prometheus,咱们的准则是服务外部不做监控,只须要把数据裸露进去即可,不反复造轮子,革新列表为:
- API、Master 和 Worker 服务接入 micrometer-registry-prometheus,采集通用数据并裸露 Prometheus 采集接口。
- 采集 Master 和 Worker 执行线程池状态数据,如 Master 和 Worker 正在运行的工作流实例、数据库等,用于后续的监控优化和告警(下右图)。
- Prometheus 侧配置服务状态异样告警,比方一段时间内工作流实例运行数小于 n(阻塞)、服务内存 &CPU 告警等等。
04 将来布局
01 跟进社区个性
目前 Fordeal 线上运行的版本是基于社区第一个 **Apache 版本(1.2.0)** 进行二开的,通过监控咱们也发现了几个问题。
- 数据库压力大,网络 IO 费用高
- Zookeeper 充当了队列角色,时不时对导致磁盘 IOPS 飙升,存在隐患
- Command 生产和 Task 散发模型比较简单,导致机器负载不平均
- 这个调度模型中应用了十分多的轮询逻辑(Thread.sleep),调度生产、散发、检测等效率不高
社区倒退迅速,当下的架构也更加的正当易用,很多问题失去了解决,咱们近期比拟关注的问题是 Master 间接对 Worker 的散发工作,加重 Zookeeper 的压力,**Task 类型插件化,易于后续扩大。**Master 配置或自定义散发逻辑,机器简单更加正当。更完满的容错机制和运维工具(优雅高低线),当初 Worker 没有优雅高低线性能,当初更新 Worker 的做法是切掉流量,让线程池归零后再高低线,比拟平安。
02 欠缺数据同步
目前只提供了工作流实例的执行统计,粒度比拟粗,后续须要反对更细化的统计数据,如 依照 Task 筛选进行统计分析,依照执行树进行统计分析,依照最耗时的执行路径分析等(对其进行优化)。
再次,减少更多的数据同步性能,如执行统计增加同步、环比阈值告警等性能,这些都是基于工作流的告警。
03 连贯其余零碎
当调度迭代稳固后,会逐渐充当根底组件应用,提供更加便当的 接口和可嵌入的窗口(iframe),让更多的下层数据利用(如 BI 零碎,预警系统)等对接进来,提供根底的调度性能。
我的分享就到这里,谢谢大家认真浏览!