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

news2024/9/20 20:23:03

目录

一、业务痛点

二、应用现状

三、技术改造

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 在蔚来汽车一站式数据治理开发平台的应用改造

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tomcat 搭建博客 及破解数据库密码

一 tomcat 搭建博客 (一)博客安装包 1, 把博客war包 放到 webapps 文件夹下 2,会自动解压 3,做个软连接 方便后续操作 可以注意到 因为war包 是又tomcat 自己解压的 所以属主数组还是 tomcat &#xff08…

Redis性能攻略:Redis-benchmark工具与实用性能优化技巧

Redis作为一种高性能的内存数据库,广泛应用于各种业务场景。然而,随着业务规模的扩大和数据量的增长,Redis的性能问题逐渐凸显出来。为了提高Redis的性能,本文将深入探讨Redis性能优化方案,包括参数配置、数据结构、多…

Java的运行机制与Java开发环境的搭建

1.编译和执行 首先通过文本编辑器编写源程序(后缀为.java),再利用编译器编译成字节码文件(后缀为.class),最后利用虚拟机也叫解释器解释执行。 2.JVM、JRE和JDK的区别 简单来说, ①JVM 提供了运行 Java 程…

【HbuilderX】 uniapp实现 android申请权限 和 退出app返回桌面

目录 android申请权限: 监听用户是否开启权限或关闭权限: 退出app返回桌面: android申请权限: 首先在 manifest.json 内添加你所需要用到权限 添加权限插件 permission.js 一次就好1/权限插件 - Gitee.comhttps://gitee.co…

学习和工作的投入产出比(节选)

人工智能统领全文 推荐包含关于投入、产出、过剩、市场关注、案例、结果和避雷等主题的信息: 投入与产出: 投入和产出都有直接和间接两类常见形式。常见的四种组合是:直接投入、直接产出、间接投入、间接产出。 过剩: 过剩是一个重…

农产品质量追溯系统—简介

概要 农产品质量安全事关广大人民群众的食用安全和身体健康。解决农产品质量安全问题,需要从源头开始抓好、抓实农产品安全监管工作。通过建立从产地到市场的全程质量控制系统和追溯制度,对农产品产地环境、生产过程、产品检测、包装盒标识等关键环节进行监督管理,提高广大…

快速开发一个鸿蒙的页面

文章目录 前言常用组件快速开启简单的鸿蒙页面总结 一、前言 鸿蒙要想快速上手,那么就需要对基础的组件使用比较熟悉,这里就罗列开发中常见的基础组件的使用。 只要是写android的,对于这些组件的使用还是能很快上手的,只要多多…

AI智能分析网关V4智慧环保/智慧垃圾站视频智能分析与监控方案

一、背景介绍 随着城市化进程的加速,垃圾处理问题日益受到人们的关注,传统的垃圾站管理方式已经无法满足现代社会的需求。针对当前垃圾站的监管需求,TSINGSEE青犀可基于旗下视频智能检测AI智能分析网关V4与安防监控视频综合管理系统EasyCVR平…

【STM32】江科大STM32学习笔记汇总(50)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【STM32】STM…

十年经验讲解功能测试的一些基本操作以及报告编写

一、 输入框测试 1. 字符型输入框: (1)字符型输入框:英文全半角、数字、空或者空格、特殊字符“~!#¥%……&*?[]{}”特别要注意单引号和&符号。禁止直接输入特殊字符时,使用…

[递归与递推] 栈与卡特兰数

题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。 栈有两种最重要的操作,即 pop(从栈顶弹出一个元素)和 push(将一个元素进栈)。 栈的重要性不言自…

每日一“类“:深入理解Qt的心脏《QObject》

Qt框架以其强大的跨平台能力和丰富的用户界面元素而广受开发者欢迎,而QObject类无疑是Qt框架心脏的所在。本文将深入探讨QObject,揭示其提供的核心功能以及如何在Qt项目中有效利用这个基类。 核心功能 信号与槽 Qt独特的信号与槽机制是其事件通信的基…

【Rust】——结构体struct

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

vue系列——vscode,node.js vue开发环境搭建

第一步安装node.js 推荐使用nvm进行node.js 的安装 nvm(Node.js version manager) 是一个命令行应用,可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 可以去网上查找相关版本 我这里使用 nvm-setu… 链接:https://pan.baidu.com/s/1UEUtmzw5x…

spring事务方法调用不生效的场景

同一个类中&#xff0c;事务方法调用非事务方法时&#xff0c;事务是可以生效的。反例事务不生效见以下 4. 同一个类中&#xff0c;方法内部调用 Autowired private XXXMapper xxxMapper; Autowired private YYYMapper yyyMapper; Transactional public ResultVO<AssetCh…

pag动效预览

潮玩apk里面分析静态资源发现动效有lottie 和pag文件 PAG官网 | PAG动效PAG动效组件可以降低或消除动效相关的研发成本&#xff0c;接入SDK后&#xff0c;设计师可通过PAGExpoter、PAGViewer等工具&#xff0c;一键将设计师在 AE 中制作的动效内容导出成素材文件&#xff0c;并…

【QT 5 +Linux下软件qt软件打包+qt生成软件创建可以安装压缩包+学习他人文章+第三篇:学习打包】

【QT 5 Linux下软件qt软件打包qt生成软件创建可以安装压缩包学习他人文章第三篇&#xff1a;学习打包】 1、前言2、实验环境3、自我学习总结-本篇总结&#xff08;1&#xff09;了解安装包的目录结构&#xff08;2&#xff09;了解要编写文件与编写脚本1. control文件2. postin…

vue3+vite 项目的创建

这里要提醒一下&#xff0c;如果我们要使用 vue3 的组合式api 的写法的话&#xff0c; 那么我们使用的 vue 版本不能低于 vue3.2 版本&#xff0c;不能低于 vue3.2 版本&#xff0c;不能低于 vue3.2 版本 vue2 已停止维护了&#xff0c; 现在全面拥抱vue3 之前用 vue-cli 创建…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:图片边框设置)

设置容器组件的图片边框样式。 说明&#xff1a; 从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 borderImage borderImage(value: BorderImageOption) 设置组件的图片边框。 卡片能力&#xff1a; 从API version 9开始…

2.2_4 调度算法的评价指标

文章目录 2.2_4 调度算法的评价指标&#xff08;一&#xff09;CPU利用率&#xff08;二&#xff09;系统吞吐量&#xff08;三&#xff09;周转时间&#xff08;四&#xff09;等待时间&#xff08;五&#xff09;响应时间 总结 2.2_4 调度算法的评价指标 注&#xff1a;要理解…