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

大家好,我叫杨佳豪,来自于太美医疗。今天我为大家分享的是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.mzph.cn/news/803649.shtml

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

相关文章

.Net <% %>

<% %> 语法 : <% import namespace"system.data"%> 用来导入后台命名空间 指令用于指定当页和用户控件编译器处理 ASP.NET Web 窗体页 (.aspx) 和用户控件 (.ascx) 文件时所使用的设置。<% %> 语法 : <% name %> <% getstr() %&g…

修改el-button按钮背景色后,按钮失去了elementUI原有的hover和active的效果

应完整修改为&#xff1a; <el-button type"primary" icon"el-icon-plus" click"addUser">新增用户</el-button>.el-button--primary:not(.is-disabled) {background-color: #1174de;border-color: #1174de;&:hover {&:not…

尝试在手机上运行google 最新开源的gpt模型 gemma

Gemma介绍 Gemma简介 Gemma是谷歌于2024年2月21日发布的一系列轻量级、最先进的开放语言模型&#xff0c;使用了与创建Gemini模型相同的研究和技术。由Google DeepMind和Google其他团队共同开发。 Gemma提供两种尺寸的模型权重&#xff1a;2B和7B。每种尺寸都带有经过预训练&a…

【iOS ARKit】AR Quick Look 概述

为更好地传播共享 AR 体验&#xff0c;苹果公司引入了 AR Quick Look&#xff0c;并在iOS 12及以上版本系统中深度集成了 AR Quick Look&#xff0c;因此可以通过iMessage、Mail、Notes、 News、 Safari 和 Files 直接体验 AR&#xff0c;AR Quick Look提供了在 iPhone 和iPad …

排序算法,插入排序

插入排序是什么 插入排序&#xff08;Insertion Sort&#xff09;&#xff0c;一般也被称为直接插入排序。对于少量元素的排序&#xff0c;它是一个有效、简单的算法 其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中&#xff0c;最终得到的序列就是已经排…

使用opencv + ffmpeg 开发视频播放器Demo

使用opencv ffmpeg 开发视频播放器Demo #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/videoio.hpp>extern "C" { #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #includ…

【LeetCode热题100】【二叉树】将有序数组转换为二叉搜索树

题目链接&#xff1a;108. 将有序数组转换为二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 取中间的数作为根节点&#xff0c;左边的数递归转换&#xff0c;右边的数递归转换 class Solution { public:TreeNode *sortedArrayToBST(vector<int> &nums) {retur…

通过 Spark SQL 和 DataFrames 与外部数据源交互

文章目录 前言Spark SQL 与 HiveUDF 通过 Spark SQL Shell, Beeline 和 Tableau 查询Spark SQL ShellBeelineTableau 外部数据源通过 JDBC 连接数据库PostgreSQLMySQL 高阶函数Explode 和 CollectUDF内置函数高阶函数 常用 DataFrames 和 Spark SQL 操作总结 前言 Spark 的数据…

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践

隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践 文章目录 隐私计算实训营第九讲-隐语多方安全计算在安全核对的行业实践1.业务背景&#xff1a;安全核对产生的土壤1.1相关政策出台1.2 数据差异的来源 2.产品方案&#xff1a;从试点到规模化的路3.技术共建&#xf…

如何用MATLAB进行核密度估计

核密度估计&#xff08;Kernel Density Estimation&#xff0c;KDE&#xff09;是一种用于估计概率密度函数的非参数方法。以下是核密度估计的基本步骤和公式&#xff1a; 步骤&#xff1a; (1)数据预处理&#xff1a;在进行核密度估计之前&#xff0c;需要对原始数据进行清洗…

微信小程序报错——“errno“: 600001, “errMsg“: “request:fail -2:net::ERR_FAILED“

bug现象 微信小程序体验版和真机调试 进入小程序的时候接口就出现了这个报错 "errno": 600001, "errMsg": "request:fail -2:net::ERR_FAILED" 排查 检查是证书过期还是证书链不完整 证书的信任链完整问题&#xff0c;可以在 亚数信息-SSL/TLS安…

web安全学习笔记(8)

记一下第十二节课的内容。 一、PHP文件包含的四种方式 Include和Include_once 操作系统会读取包含的文件的内容&#xff0c;并将它插入主文件中&#xff0c;include方式的文件包含会在包含失败的情况下输出警告信息&#xff0c;而include_once方式会检查包含的文件是否已经被…

口语教育的黄金时代:AI技术引领教育创新与创业机遇

这些人的赚钱思路是真灵活&#xff01; 这几天刷到艾维奇采访之昊的视频&#xff0c;做口语教育真赚钱&#xff0c;lv的包包随便买&#xff0c;住大房子&#xff0c;三辆车&#xff0c;有评论晒图一个九百的课&#xff0c;卖了1.3万份&#xff0c;直接千万到账。 然后我又想到…

TCP重传机制总结

超时重传概念 超时重传&#xff1a;发送方每发送一个数据包&#xff0c;就会为这个数据包设置一个超时时间&#xff0c;如果在时间内没收到应答这个数据包的ACK包&#xff0c;需要重新发送这个数据包&#xff1b;每次重传后&#xff0c;RTO会成倍增加&#xff0c;且重传次数有…

python-pytorch实现skip-gram 0.5.000【直接可运行】

python-pytorch实现skip-gram 0.5.000【直接可运行】 参考导入包加载数据和切词获取wordList、raw_text获取vocab、vocab_sizeword_to_idx、idx_to_word准备训练数据准备模型和参数训练模型保存模型简单预测获取训练后的词向量画图看下分布利用词向量计算相似度余弦点积 参考 …

Jmeter —— 自动录制脚本

1、Jmeter配置 1.1新增一个线程组 1.2Jmeter中添加HTTP代理 1.3配置HTTP代理服务器 修改端口 修改Target Cintroller(目标控制器) 修改Grouping(分组) 编辑录制中的包含和排除 在“URL Patterns to include包含模式”中填入.*(123456).*用以过滤请求地址中不包含123456的请求…

【K8S:初始化】:执行kubeadm显示:connection refused.

文章目录 [root10 kubernetes]# kubeadm init --kubernetes-versionv1.23.0 --image-repositoryregistry.aliyuncs.com/google_containers --apiserver-advertise-address192.168.56.104 [init] Using Kubernetes version: v1.23.0 [preflight] Running pre-flight checks [pre…

Angular Web项目前端无法正确显示base64类型的图片

昨天在本地环境部署网站时遇见了一个问题&#xff0c;后端接口返回的Base64类型的图片文件&#xff0c;在浏览器页面上无法正常显示&#xff0c;经过一番排查发现&#xff0c;问题出现在了两个方面&#xff1a; 1、网站前端使用了Angular框架&#xff0c;Angular中默认将所有输…

深入浅出 useEffect:React 函数组件中的副作用处理详解

useEffect 是 React 中的一个钩子函数&#xff0c;用于处理函数组件中的副作用操作&#xff0c;如发送网络请求、订阅消息、手动修改 DOM 等。下面是 useEffect 的用法总结&#xff1a; 基本用法 import React, { useState, useEffect } from react;function Example() {cons…

使用UDP完成网络单词查询,利用dict数据库

【注】UDP的优缺点&#xff1a; 1&#xff1a;传输效率高 2&#xff1a;易出现数据丢失 3&#xff1a;以数据报的形式传输 思路&#xff1a; step1&#xff1a;获取客户端请求 step2&#xff1a;查询单词 step3&#xff1a;响应客户端 Client.py from socket import *SERVICE_…