【用户案例】太美医疗基于Apache DolphinScheduler的应用实践

news2024/12/23 0:43:20

大家好,我叫杨佳豪,来自于太美医疗。今天我为大家分享的是Apache DolphinScheduler在太美医疗的应用实践。今天的分享主要分为四个部分:

  • 使用历程及选择理由
  • 稳定性的改造
  • 功能定制与自动化部署
  • 运维巡检与优化

使用历程及选择理由

公司介绍

我们是一家专注于生命科学产业的运营平台公司,致力于提供医疗行业解决方案。

file

作为一家基于AI大数据云平台的药品全生命周期解决方案商,我们提供从药物研发到上市的全流程服务。我们的服务范围涵盖医药研发、药物警戒、医药预警等多个领域。

服务与技术平台

在提供服务的过程中,特别是在药物警戒服务方面,我们依赖数据的调度及ETL清洗,这让我们与Apache DolphinScheduler结缘。我们的平台架构底层基于Hadoop生态体系,负责大数据的开发、调度,并最终输出相关的报表和接口服务。

file

在调度平台方面,我们采用了Apache DolphinScheduler和Airflow,其中Airflow是较早的大数据开源调度平台之一。

为何选择DolphinScheduler

选择Apache DolphinScheduler作为我们的技术平台是在2020年一个医药营销平台项目开始时做出的决策。

我们对Airflow、Azkaban和Apache DolphinScheduler进行了综合比较和验证。考虑到我们的平台主要是基于SQL进行调度,类似于ERP平台的场景,最终选择Apache DolphinScheduler作为我们的统一技术平台。

经过三年的发展,我们再次受到社区的邀请,分享在不同场景下使用Apache DolphinScheduler的经验及相关的优化经验。

升级历程

自2020年开始使用Apache DolphinScheduler以来,太美医疗经历了几个重要的升级阶段:

  • 2020年:正式引入Apache DolphinScheduler,标志着我们开始系统地整合大数据处理流程。
  • 2021年:使用Apache DolphinScheduler 1.3.3版本替代Airflow,成为公司统一的调度平台。
  • 2022年:随着Apache DolphinScheduler 2.0版本的发布,我们引入了钉钉告警等便利性功能,以提升开发团队的工作效率。
  • 2023年:面对庞大的任务量和工作流定义(4000+定义,日调度量2万+),我们从2.0版升级至3.0.1版,并进行了自动化改造,以应对日益增长的维护挑战。

这一升级历程不仅反映了太美医疗对Apache DolphinScheduler技术的深度探索,也体现了我们对开源技术持续优化和改进的承诺。

实现的成果

通过不断的技术升级和改造,我们在Apache DolphinScheduler的应用实践中取得了显著成果:

  • 部署规模:我们在国内外部署了多套DolphinScheduler,覆盖了SQL节点、Spark节点、Shell类型节点等多种作业类型。
  • 调度能力:我们的工作流定义达到了4000+,日调度量超过2万+,展现了强大的调度能力。
  • 自动化与集成:实现了与Git的集成,支持复杂任务的自动创建和快速部署到新集群环境。
  • 环境管理:构建了一套完整的环境管理策略,包括测试(Test)、用户接受测试(UAT)和生产(PROD)环境的同步调度,有效降低成本,提升效率。
  • 稳定性优化:即使在低配的集群环境下,也保证了稳定的调度性能,并通过定期巡检功能维持大数据集群的稳定运行。

稳定性改造详解

在Apache DolphinScheduler的应用过程中,稳定性是我们极为重视的一点。

面对环境和资源的限制,如何通过技术改造提升系统的稳定性,是我们需要解决的关键问题。

稳定性的难点

  • 资源限制与宕机问题:在资源受限的情况下,系统很容易出现宕机,尤其是当集群较小的时候。
  • 任务提交过多导致堵塞:在高并发场景下,大量任务提交可能导致系统无法按时完成调度,特别是对于需要在特定时间完成的任务(如T+1任务)。
  • 偶发性问题:包括主键依赖重复和SQL节点偶发性调度问题,以及开发过程中对Git同步开发的需求。

改造措施

针对上述难点,我们进行了以下几方面的改造:

file

  • 优化配置与资源利用:调整启动参数,将内存配置从4G降低到128M和1G,保证服务稳定运行同时最大化资源利用。
  • 调整masterworker的参数,如拉取命令的数量和准备执行的任务数量,以适应四核8G的小型集群环境。
  • 自动巡检与告警:增加自动巡检功能,及时发现并告警处理问题,减少手动干预,提升稳定性。
  • 调度策略优化:对于核心任务,选择更稳定的调度模式,比如使用shell模式代替SQL节点,确保任务的稳定执行。

  • 内存与CPU参数优化:针对内存和CPU的配置进行优化,确保系统在低资源环境下也能稳定运行。

改造成果

通过上述改造,我们实现了以下成果:

  • 提升系统稳定性:系统在三台4核8G的小型集群环境下能稳定运行,日常稳定调度3000+任务,显著减少了宕机和调度失败的情况。
  • 优化资源使用:服务启动和运行时占用的内存明显降低,提高了资源利用效率。
  • 改善开发体验:针对开发流程,通过自动化和优化调度策略,减少了开发和运维过程中的困难,提高了开发效率。

自动化创建DAG的背景与实践

随着任务量的增长和调度依赖的复杂性提升,手动维护DAG变得越来越困难。我们面临的挑战包括:

任务依赖复杂:高复杂度的依赖关系使得手动配置容易出错。

发布流程繁琐:从测试到生产的发布流程涉及多步骤的人工操作,效率低下且容易出错。

跨环境部署困难:面对医疗行业对本地化部署的需求,传统的导入导出方式不适应快速部署的需求。

代码管理与规范:统一的代码管理和规范审核对于保持代码质量至关重要。

针对以上背景,我们采取了自动化改造,目标是通过自动化工具和流程,简化DAG的创建、管理和发布过程,实现跨环境的快速部署,同时保持代码的统一性和质量。

设计方案与实践

我们的改造方案包括:

file

自动化DAG生成:开发了工具自动根据业务需求生成DAG,减少人工编写和维护的负担。

统一代码管理:通过Git实现代码的版本控制和团队协作,确保代码质量和一致性。

简化发布流程:通过自动化脚本和工具,简化从测试到生产的DAG发布流程,提高效率并减少错误。

file

通过这些措施,我们不仅提升了调度系统的稳定性和资源利用效率,也改善了开发和运维的工作流程,为未来面对更大规模的任务调度和复杂的业务需求提供了坚实的基础。

改造方案与成果

为了提高工作效率,确保与Apache DolphinScheduler社区版本的兼容性,并简化后续的升级过程,我们采取了一种以插件形式进行改造的方法,基于Apache DolphinScheduler 3.0版本进行了自动化任务流创建的实现。

改造方案设计

我们的改造方案核心思路是利用Apache DolphinScheduler提供的API,通过一个外部Java程序,自动读取MySQL中存储的配置信息,进而自动创建工作流所需的所有依赖流。主要步骤包括:

  • 配置信息存储:将所有需要的配置信息存放在MySQL数据库中,这包括工作流名称、节点名称、任务的来源(Git地址)、任务类型(计算任务、同步任务等)以及数据源类型和实例。

  • 简化任务流创建:原计划通过解析SQL创建任务流的方案由于工作量大,后续改为直接在任务中配置前置节点依赖,简化了创建过程。

  • 任务修改类型处理:在上线新任务时选择“新增”,旧任务更新时选择“更新”,并配合全局变量的使用,来管理任务的变更。

  • 工作流与节点依赖关系定义:通过配置文件明确NODE节点的前置依赖关系,实现整个工作流节点的串联。

成果与反馈

改造后的系统实现了通过配置即可自动生成DAG的目标,极大地简化了工作流的创建和管理过程。主要成果包括:

file

快速创建和部署:只需通过配置SQL脚本,就能创建相应的工作流和任务子节点,实现了快速部署的目标。

提高开发效率:开发团队可以更便捷地创建任务和部署到各个环境,无需手动进行复杂的配置和部署流程。

保持与社区同步:采用插件化的改造方式,避免了直接修改源代码的需要,使得系统更容易与Apache DolphinScheduler社区版本保持同步,便于后续的升级和功能获取。

自动化运维巡检

运维工作中存在一系列的挑战,主要包括任务失败的及时告警、多项目任务巡检、以及对任务完成情况的准确把握等问题。

为了应对这些挑战,我们在Apache DolphinScheduler的使用和改造过程中,实施了一系列的自动化运维措施。

自动化运维改造

通过利用Apache DolphinScheduler的元数据信息,我们实现了一个自动推送功能,每天定时将生产调度报告发送到指定的钉钉群中。这个报告包括了所有任务的运行情况,如哪些任务成功,哪些任务失败,极大地方便了运维团队及时掌握任务的执行情况。

对于运维任务失败的情况,我们增强了告警机制,确保在任务出现问题时能够及时通知到运维团队,使他们能够迅速响应和处理问题。

版本选择建议

尽管Apache DolphinScheduler作为一个开源调度工具在市场上表现优异,但像所有开源项目一样,它也存在一些问题和Bug。

我们希望通过与社区的持续沟通和交流,不仅能减轻运维团队的负担,也能贡献我们的经验和改进建议给社区,共同推动Apache DolphinScheduler项目的进步。

我们鼓励所有使用Apache DolphinScheduler的团队积极参与社区活动,共同提升这个强大工具的能力和稳定性。

本文由 白鲸开源科技 提供发布支持!

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

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

相关文章

自动驾驶中的多目标跟踪_第四篇

自动驾驶中的多目标跟踪:第四篇 附赠自动驾驶学习资料和量产经验:链接 在上篇,我们得到了杂波背景下单目标状态的后验概率表达式。在不进行近似的情况下,是无法应用到实际场景中的。因此,在这一节,我们来讨论如何进行…

python课后习题三

题目&#xff1a; 解题过程&#xff1a; 模式A&#xff1a; num int(input("&#xff08;模式A&#xff09;输入数字&#xff1a;")) for i in range(num): for j in range(num): if j < i 1: …

泡泡写作好用吗 #微信#学习方法#媒体

泡泡写作是一款非常好用的论文写作工具&#xff0c;它集成了查重和降重的功能&#xff0c;大大提高了写作效率和质量。对于需要写论文的学生和研究人员来说&#xff0c;泡泡写作是一个靠谱的选择。 首先&#xff0c;泡泡写作提供了强大的查重功能&#xff0c;可以帮助用户快速检…

javaScript常见对象方法总结

1&#xff0c;object.assign() 用于合并对象的属性。它可以将一个或多个源对象的属性复制到目标对象中&#xff0c;实现属性的合并。 语法 Object.assign(target, ...sources); 1,target&#xff1a;目标对象&#xff0c;将属性复制到该对象中。 2,sources&#xff1a;一个…

【JVM】如何解决内存泄漏问题

什么是内存泄漏&#xff0c;如何解决内存泄漏问题&#xff1f; ⚫ 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这 个对象就不会被垃圾回收器回收&#xff0c;这种情况就…

java Web在线考试管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 在线考试管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

华为 2024 届校园招聘-硬件通⽤/单板开发——第一套(部分题目分享,完整版带答案,共十套)

华为 2024 届校园招聘-硬件通⽤/单板开发——第一套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c;加我…

Go —— channel (二)

一个空的 channel 会产生哪些问题 读写nil管道均会阻塞触发死锁。关闭的管道仍然可以读取数据&#xff0c;向关闭的管道写数据会触发panic。 问&#xff1a;如果有多个协程同时读取一个channel&#xff0c;channel会如何选择消费者 channel 会按照维护的 recvq 等待读消息的…

结构体及联合体大小计算

结构体大小计算 结构体大小的计算的依据是结构体内存对齐 对齐规则&#xff1a; 1.结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处 2.其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。 &#xff08;对齐数编译器默认的一个对齐…

云数据库价格一瞥(华为云、百度智能云、腾讯云、阿里云)

最近&#xff0c;大家似乎和价格“磕”上了。本文仅考虑主流产品&#xff08; RDS MySQL、Redis &#xff09;的部分主流规格&#xff0c;对各家厂商的价格做一个对比&#xff0c;供参考。 TL;DR&#xff1a; 总体来看&#xff0c;各家云厂商价格趋于持平&#xff0c;部分主流商…

Android音视频的基础

视频是什么&#xff1f; 视频就是由一系列图片构成的。 视频帧 帧&#xff0c;是视频的一个基本概念&#xff0c;表示一张画面&#xff0c;如上面的翻页动画书中的一页&#xff0c;就是一帧。一个视频就是由许许多多帧组成的。 帧率 帧率&#xff0c;即单位时间内帧的数量&a…

VS Code开发插件使用 pnpm 打包异常的解决姿势

前言 刚刚准备发一个插件&#xff0c;发现用 pnpm 打出一个本地插件包直接扑街了。 这里只聚焦错误问题的解决&#xff0c;不是发插件的教程。。 聊点背景信息&#xff0c;vscode 的插件命令行的是 vsce 这个模块提供的 cli 能力去做的 环境 pnpm : 8.x 错误截图 本地打…

image with CV

""" 视觉&#xff1a;基本API应用&#xff08;OPENCV&#xff09; """ import cv2 import numpy as np"""图像读取方式3. 1.cv2.imread(filename or path, flags)flags0:灰度图像&#xff1b;flags1表示RGB图像&#xff1b;fl…

Apache Incubator Answer 本地开发部署

文章目录 简介Github文档插件部署 Answer开发环境编译项目初始化项目运行项目 简介 一款适合任何团队的问答平台软件。 Apache Incubator Answer是一个开源项目&#xff0c;它是一个用于构建和部署问答系统的框架。该项目是Apache软件基金会的孵化器项目&#xff0c;提供一个…

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑)

引言 在 iOS 开发中&#xff0c;将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下&#xff0c;我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而&#xff0c;如果你没有 Mac 电脑&#xff0c;也没有关系&#xff0c;本文将介绍一…

【图论】Leetcode 994. 腐烂的橘子【中等】

腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单…

运营商名称 是如何显示到 手机通知栏上的?

在我们日常使用手机的过程中&#xff0c;经常会在通知栏或设置菜单中看到特定的运营商名称&#xff0c;例如"中国移动"、"中国联通"或"中国电信"等。 那么&#xff0c;这些运营商的名称是如何出现在我们手机上的呢&#xff1f;手机又是如何区分不…

15. 【Android教程】按钮 Button/ImageButton

在前面两章我们讲了 TextView&#xff0c;它是一个纯输出的控件&#xff1b;而 EditText 在 TextView 基础之上加入了简单的输入功能&#xff1b;今天要讲的 Button 是一个和用户互动感很强的控件&#xff0c;从今往后不再是单纯的文本展示&#xff0c;我们可以通过 TextView、…

汽车4S行业的信息化特点与BI建设挑战

汽车行业也是一个非常大的行业&#xff0c;上下游非常广&#xff0c;像主机厂&#xff0c;上游的零配件&#xff0c;下游的汽车流通&#xff0c;汽车流通之后的汽车后市场&#xff0c;整个链条比较长。今天主要讲的是汽车流通&#xff0c;汽车4S集团。一个汽车4S集团下面授权代…

微信小程序使用iconfont

进入iconfont&#xff0c;添加至项目 进入项目&#xff0c;点击生成代码&#xff0c;或更新代码 点击打开样式 复制内容到小程序的style文件夹下 最后引入到app.wxss