DolphinScheduler——蔚来汽车数据治理开发平台的应用改造

目录

一、业务痛点

二、应用现状

三、技术改造

3.1 稳定性

3.1.1 滚动重启+黑名单机制+精准路由

3.2 易用性

依赖节点优化

补数任务优化

多 SQL 执行

  原文大佬的这篇基于调度系统的数据治理案例有借鉴意义,这里摘抄下来用作学习和知识沉淀。

一、业务痛点

    蔚来汽车构建一个统一的数据中台之前,我们面临这样一些业务痛点和困境:

(1)数据缺乏治理,数仓不规范、不完整

  • 没有统一的数据仓库,无全域的数据资产视图

  • 存在数据孤岛;

(2)工具散乱,用户权限不统一,学习成本高

  • 用户需要在多个工具之间切换,导致开发效率低
  • 底层运维成本高

(3)数据需求响应周期长,找数难,取数难

  • 无沉淀的数据资产与中台能力,重复处理原始数据;
  • 业务数据需求从提出到获取结果的周期长

   基于这些痛点和问题,我们构建了一个公司层面的业务中台,内部叫做 DataSight。

   由上图可知,最底下是一些基础组件;往上一层,这些基础组件主要是支撑了一些数据接入与开发的模块;再向上是数据治理,以及数据资产与应用层模块。其中, DolphinScheduler调度系统的在公司内部主要应用于交互的模块,就是数据开发和数据运维两个模块。

二、应用现状

  作业现状:DolphinScheduler( 版本2.0.7)集群机器共有 9 台,分别是两台 Master 机器,是8c 和 32G;六台 Worker 机器,16c 和 64G,以及一台 Alert 机器,8c 和 32G。目前DS线上运行大概一年多,日均的调度工作流实例大概在 4w+,日均调度任务实例大概在 10w+ 左右,主要的任务节点有Spark 节点、SparkSQL、prestoSQL、Python 和 Shell,其中 Spark 节点占比约 70%。

三、技术改造

    为了适应业务需求,我们对DolphinScheduler 进行了一些技术改造,核心目标是确保作业调度稳定性。

3.1 稳定性

3.1.1 滚动重启+黑名单机制+精准路由

      这个改造是因为我们遇到的一些痛点,首先,大家知道,DolphinScheduler 的 Worker 重启机制在重启时会把所有的任务给 kill 掉,然后去Restart 这个任务,把这个 kill 的任务分发到新的 Worker 机器上。这样会导致任务执行时间较长,这不符合我们的预期。

    同时,我们也无法在特定的worker上进行验证任务的,对比我们的解决方案就是滚动重启,在重启某台机器之先下线这台机器,也就是加上黑名单,这样的话,Master 机器就不会给这台下已经下线的机器去分发Worker任务。这台机器会在上面的任务全部处理完毕后自动上线,也就是移出这个黑名单,接下来所有的worker节点都按照此时方式重启,达到平滑重启的目标。

   这样做的好处在于不会阻塞每个任务的执行,集群在重启的时候稳定性能得到大幅提升。

    如图所示,我们在这个任务后面加一个specific dispatch-worker02 的话,那这个任务一定会被分配到Worker02这台机器上去。这样的好处在于,假设我们想要去某一个功能点,我们只需要把某一台Worker 机器下线重启,需要测试的功能点按照这个方式就一定能够打到这台特定的机器上去,实现最小范围的灰度,有助于提高稳定性。

  • 优化存储

     在存储方面,我们痛点也很明显,就是process instance和task instance 这两张表数据量是比较大的,由于我们每天的数据量比较大,目前已经达到了千万级别,造成 MySQL 的存储压力比较大。另外,部分 SQL 执行时间长,业务响应变慢;而且 DDL 时会造成锁表,导致业务不可用。

     针对这些问题,我们的解决方案包括去梳理所有的慢 SQL,然后去添加合适的索引。与此同时,还有降低查询频率,特别是针对依赖节点。因为我们知道依赖节点每 5 秒钟查询一次数据库,所以我们根据依赖节点所在的 tasks instance ID 去做一个“打散”,偶数节点每 30 秒查询一次,奇数节点每 30 秒查询一次,把他们分开来降低对整个数据库的查询压力。

    另外,为了减轻表数据量大的问题,我们也做了一个定期删除的策略,以及定时同步历史数据的策略。

   定时删除就是我们利用 DolphinScheduler 自身的调度能力建立两个工作流去删除这两张表,保证 process instance 这张表保留两个月的数据,task instance 这张表保留一个月的数据。同时在删表的时候,我们要注意在非业务高峰期时去做这个动作,每次删表的时候,batch size 要控制好,尽量不要影响线上的任务。

   定时同步历史数据,就是我们针对 process instance这个表,依据schedule time 按年去分表;针对task instance这张表,按first submit time 按月去分表。

  • Spark任务优化

     我们提交Spark任务的方式是通过Spark Submit 去提交的,它的缺点在于提交 Spark 任务后,常驻机器,导致机器内存过大,会有机器宕机的风险,worker 的运行效率较低。我们优化了 Spark 任务提交和运行的逻辑,就是通过 Spark Submit 提交的时候添加spark.yarn.submit.waitAppCompletion=false 这个参数,这样任务提交完以后这个进程就消失了。考虑到要保证Worker 机器任务的线程和Spark 和 Yarn 上的状态一致,我们间隔一定时间查询 Spark任务状态,如图所示:

     这里的while true循环,首先去判断这个任务是否超时,如果任务已经超时就会结束这个spark任务,同时会kill掉集群上的那个真正在跑的任务。

   如果任务没有超时,我们会去获取任务的状态,如果任务状态是终止状态,就直接跳出这个循环,否则会间隔一定的时间,比如 30秒,再继续这个while true 循环。这种方式让整个 Worker 机器所能承载的Spark任务大大增加。

3.2 易用性

  • 依赖节点优化

     我们的依赖节点之前的痛点在于,它的使用规则不太符合用户的需求,比如之前是单次查询不到上游即失败;日志内容显示信息不全,对用户不友好;用户无法自定义依赖范围。

    针对这些问题,我们做的工作包括修改了查询逻辑为继续等待,就是说当这个任务查询不到上游的时候,我们会继续等待,而不是直接失败。同时我们会也有个极端的保证,就是这个依赖节点超过 24 小时以后就让它自动失败,然后给用户发一个报警。

   针对依赖节点,我们也做了强制成功这样一个小技巧,并支持用户自定义依赖范围。

     另外,我们还优化了依赖节点的日志输出,当用户点击依赖节点的日志的时候,可以比较清楚地看到依赖的上游所在的空间,这个空间内任务所对应的维护人是什么,以及工作流节点是什么和完成状态,让用户可以点对点地找到上游的同学,快速解决这个依赖节点卡住的问题。

  • 补数任务优化

    针对补数之前的痛点,比如补数任务没有进度提示,并行补数流程实例不严格按照时间顺序,停止并行补数任务逻辑比较麻烦等问题,我们的解决方案包括并行任务引入线程池,也就是把任务按照时间顺序一个一个抛到新建的线程池里,执行完毕以后退出这个线程池,然后再放一个新的进来,达到并行补数的状态。同时,执行时间按递增的顺序。

    当我们想停止这个补数任务的时候也比较简单,直接把这个线程池 shutdown 就行。

  • 多 SQL 执行

     最后是关于多 SQL 执行方面的优化。我们之前面临的痛点包括:

  • 多 SQL 需要多节点执行浪费集群资源;

  • 自定义环境变量无法实现;

  • 无法跟踪 SparkSQL 的运行日志。

   我们的解决方案包括拆分这条 SQL,支持多条 SQL 同时执行。与此同时,我们可以在 SparkSQL 任务执行之前拦截执行select engine_id() as engine_id语句。

    如上图所示,对于 SQL 1 和 SQL 2,之前我们会在两个任务里面去放着,但是现在可以在一个任务节点里面放下来,它会执行两次。同时我们可以清晰地看到这个 SparkSQL 所在的 application ID 是什么,用户能够清晰地根据这个 application ID 找这个业务所在的地址,了解这个作业的进度。

参考文章:

日均调度 10W+ 任务实例,DolphinScheduler 在蔚来汽车一站式数据治理开发平台的应用改造

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/419199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

lazada、速卖通、亚马逊店铺需要补单来稳定出单率吗?

亚马逊、速卖通、Lazada、shoppe、速卖通、敦煌网、Temu、shein、阿里国际、卖家如何保证店铺出单稳定?在竞争激烈的平台上,保持店铺的稳定出单是每个卖家都追求的目标。为了实现这一目标,卖家需要综合考虑产品、运营、客户服务等多个方面的因素&#x…

刘志雄:新产品市场+新智造模式,构建“声音+”产业创新生态 | 演讲嘉宾公布

随着科技的飞速发展,新技术、新的应用场景不断涌现,也影响着“声音”产业未来的发展方向。如何应对市场变化,满足市场的多样化需求?如何应用新产品市场、智造新模式去构造“声音”产业创新生态呢?请到GAS2024一探究竟。…

ElasticSearch之Completion Suggester

写在前面 通过completion suggester可以实现如下的效果: 其实就是做的like xxx%这种。通过FST这种数据结构来存储,实现快速的前缀匹配,并且可以将es所有的数据加载到内存中所以速度completion的查询速度非常快。 需要注意,如果…

2024最新版,Android开发教程入门

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读Android系统源码,还包括各种优秀的开源库。 由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。 深入解析微信 MMKV 源码 初始化获取修改删除读取…

利用Quartz实现复杂的任务调度

第一章:引言 大家好,我是小黑,任务调度,简而言之,就是按照预定计划自动执行任务的过程。不管是数据库备份、报表生成还是发送定时邮件,它们都需要一个可靠的任务调度系统来保证按时完成。 那么&#xff0…

【学习笔记】深度学习实战 | LeNet

简要声明 学习相关网址 [双语字幕]吴恩达深度学习deeplearning.aiPapers With CodeDatasets 深度学习网络基于PyTorch学习架构,代码测试可跑。本学习笔记单纯是为了能对学到的内容有更深入的理解,如果有错误的地方,恳请包容和指正。 参考文献…

基于ssm网络办公系统论文

摘 要 计算机网络发展到现在已经好几十年了,在理论上面已经有了很丰富的基础,并且在现实生活中也到处都在使用,可以说,经过几十年的发展,互联网技术已经把地域信息的隔阂给消除了,让整个世界都可以即时通话…

【Linux】Linux安装

Linux安装(保姆级教程) 准备工具下载链接 Linux镜像系统官网(Centos版本):https://www.centos.org/ 虚拟机下载官网:https://www.vmware.com 注:Linux是一种系统统称,就像Windows…

小米科技分享:深入解析阿里巴巴面试题之SQL查询

大家好,我是小米,今天要和大家分享的是在阿里巴巴面试中常见的SQL查询题目。SQL查询是数据库领域中的基础,但也是一个非常重要的技能,无论是在面试中还是实际工作中,都有着举足轻重的地位。让我们一起深入了解一下吧! SQL语句的执行过程 首先,我们来了解一下SQL语句的执…

【Java】基本数据类型、包装类与字符串间的转换 例题

写在前面: 关于这道题,初见感觉有点cpu烧坏了,准确来说是看了网上的一些讲解都感觉不尽人意。自己整理了一下,希望能帮助到大家。 题目: 如下两个题目输出结果相同吗?各是什么。 Object o1 true ? new…

悄悄告诉你,干洗店60%业务都在自这里

洗衣管理软件,让生活更轻松!无论是洗衣还是洗鞋,这款软件都能帮你轻松搞定一切:预约、洗涤进度查询、顾客反馈,一切尽在指尖。 店家使用软件智能管理收衣收鞋,从接收、洗涤到通知顾客取衣,全程自…

【UE 材质】制作加载图案(2)

在上一篇(【UE 材质】制作加载图案)基础上继续实现如下效果的加载图案 效果 步骤 1. 复制一份上一篇制作的材质并打开 2. 添加“Floor”节点向下取整 除相同的平铺数 此时的效果如下 删除如下节点 通过“Ceil”向上取整,参数“Tiling”默认…

4、正则表达式、本地存储

一、正则表达式 1、定义 用事先定义好的一些特定字符,这样的字符组合,组合成一个“规则字符串” 2、正则的组成 特殊字符 字母、数字、下划线、中文、特殊字符… 元字符(常用) 1、\d 匹配至少有一个数字 var reg /\d/ /…

东莞IBM服务器维修之IBM x3630 M4阵列恢复

记录东莞某抖音电商公司送修一台IBM SYSTEM X3630 M4文档服务器RAID6故障导致数据丢失的恢复案例 时间:2024年02月20日, 服务器品牌:IBM System x3630 M4,阵列卡用的是DELL PERC H730P 服务器用途和用户位置:某抖音电…

新品齐发!小牛电动打造全场景高端化产品阵列!

2 月 29 日,全球智能城市出行品牌小牛电动发布“新世代性能旗舰”电摩NX、电自NXT,以及“全场景智驾越野电摩”X3三款新品。同时,与知名体育电竞俱乐部——JDG京东电子竞技俱乐部携手,打造“英雄的联盟”超级形象,引领…

文件误删除怎么恢复?盘点4个有效方法!

“我有一些很重要的工作文件保存在电脑上了,但是刚刚操作的时候却发现有些文件被误删了。有什么简单的误删文件恢复方法吗?” 在日常生活和工作中,我们可能都需要在电脑上保存各种各样的文件。如果在操作时误删比较重要的文件,很多…

进阶了解C++(4)——多态

在上篇文章中,简单的介绍了多态中的概念以及其相关原理。本文将针对多态中其他的概念进一步进行介绍,并且更加深入的介绍关于多态的相关原理。 目录 1. 抽象类: 2. 再谈虚表: 3. 多继承中的虚函数表: 1. 抽象类&am…

Mybatis-Plus介绍

目录 一、Mybatis-Plus简介 1.1、介绍 1.2、特性 1.3、架构 1.4、Mybatis-Plus与Mybatis的区别 二、快速入门 2.1、首先创建数据库mybatis-plus 2.2、创建user表 2.3、插入数据 2.4、创建Spring-Boot项目 2.5、添加依赖 2.6、连接数据库 一、Mybatis-Plus简介 1.1、…

Springboot项目集成短信验证码(超简单)

操作流程 注册验证码平台创建验证码模版开始集成(无需引入第三方库) 注册并登陆中昱维信验证码平台 获取AppID和AppKey。 创建验证码模版 创建验证码模版,获取验证码模版id 开始集成 创建controller import org.springframework.web.bi…

跨域引起的两个接口的session_id不是同一个

来源场景: RequestMapping(“/captcha”)接口设置了SESSION_KEY,也能获取到,但是到了PostMapping(“/login”)接口就是空的,由于跨域导致的两个session_id不是同一个 /*** 系统用户 前端控制器*/ Controller CrossOrigin(origins…