大家好,我叫杨佳豪,来自于太美医疗。今天我为大家分享的是Apache DolphinScheduler在太美医疗的应用实践。今天的分享主要分为四个部分:
- 使用历程及选择理由
- 稳定性的改造
- 功能定制与自动化部署
- 运维巡检与优化
使用历程及选择理由
公司介绍
我们是一家专注于生命科学产业的运营平台公司,致力于提供医疗行业解决方案。
作为一家基于AI大数据云平台的药品全生命周期解决方案商,我们提供从药物研发到上市的全流程服务。我们的服务范围涵盖医药研发、药物警戒、医药预警等多个领域。
服务与技术平台
在提供服务的过程中,特别是在药物警戒服务方面,我们依赖数据的调度及ETL清洗,这让我们与Apache DolphinScheduler结缘。我们的平台架构底层基于Hadoop生态体系,负责大数据的开发、调度,并最终输出相关的报表和接口服务。
在调度平台方面,我们采用了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同步开发的需求。
改造措施
针对上述难点,我们进行了以下几方面的改造:
- 优化配置与资源利用:调整启动参数,将内存配置从4G降低到128M和1G,保证服务稳定运行同时最大化资源利用。
- 调整
master
和worker
的参数,如拉取命令的数量和准备执行的任务数量,以适应四核8G的小型集群环境。
- 自动巡检与告警:增加自动巡检功能,及时发现并告警处理问题,减少手动干预,提升稳定性。
-
调度策略优化:对于核心任务,选择更稳定的调度模式,比如使用shell模式代替SQL节点,确保任务的稳定执行。
-
内存与CPU参数优化:针对内存和CPU的配置进行优化,确保系统在低资源环境下也能稳定运行。
改造成果
通过上述改造,我们实现了以下成果:
- 提升系统稳定性:系统在三台4核8G的小型集群环境下能稳定运行,日常稳定调度3000+任务,显著减少了宕机和调度失败的情况。
- 优化资源使用:服务启动和运行时占用的内存明显降低,提高了资源利用效率。
- 改善开发体验:针对开发流程,通过自动化和优化调度策略,减少了开发和运维过程中的困难,提高了开发效率。
自动化创建DAG的背景与实践
随着任务量的增长和调度依赖的复杂性提升,手动维护DAG变得越来越困难。我们面临的挑战包括:
任务依赖复杂:高复杂度的依赖关系使得手动配置容易出错。
发布流程繁琐:从测试到生产的发布流程涉及多步骤的人工操作,效率低下且容易出错。
跨环境部署困难:面对医疗行业对本地化部署的需求,传统的导入导出方式不适应快速部署的需求。
代码管理与规范:统一的代码管理和规范审核对于保持代码质量至关重要。
针对以上背景,我们采取了自动化改造,目标是通过自动化工具和流程,简化DAG的创建、管理和发布过程,实现跨环境的快速部署,同时保持代码的统一性和质量。
设计方案与实践
我们的改造方案包括:
自动化DAG生成:开发了工具自动根据业务需求生成DAG,减少人工编写和维护的负担。
统一代码管理:通过Git实现代码的版本控制和团队协作,确保代码质量和一致性。
简化发布流程:通过自动化脚本和工具,简化从测试到生产的DAG发布流程,提高效率并减少错误。
通过这些措施,我们不仅提升了调度系统的稳定性和资源利用效率,也改善了开发和运维的工作流程,为未来面对更大规模的任务调度和复杂的业务需求提供了坚实的基础。
改造方案与成果
为了提高工作效率,确保与Apache DolphinScheduler社区版本的兼容性,并简化后续的升级过程,我们采取了一种以插件形式进行改造的方法,基于Apache DolphinScheduler 3.0版本进行了自动化任务流创建的实现。
改造方案设计
我们的改造方案核心思路是利用Apache DolphinScheduler提供的API,通过一个外部Java程序,自动读取MySQL中存储的配置信息,进而自动创建工作流所需的所有依赖流。主要步骤包括:
-
配置信息存储:将所有需要的配置信息存放在MySQL数据库中,这包括工作流名称、节点名称、任务的来源(Git地址)、任务类型(计算任务、同步任务等)以及数据源类型和实例。
-
简化任务流创建:原计划通过解析SQL创建任务流的方案由于工作量大,后续改为直接在任务中配置前置节点依赖,简化了创建过程。
-
任务修改类型处理:在上线新任务时选择"新增",旧任务更新时选择"更新",并配合全局变量的使用,来管理任务的变更。
-
工作流与节点依赖关系定义:通过配置文件明确NODE节点的前置依赖关系,实现整个工作流节点的串联。
成果与反馈
改造后的系统实现了通过配置即可自动生成DAG的目标,极大地简化了工作流的创建和管理过程。主要成果包括:
快速创建和部署:只需通过配置SQL脚本,就能创建相应的工作流和任务子节点,实现了快速部署的目标。
提高开发效率:开发团队可以更便捷地创建任务和部署到各个环境,无需手动进行复杂的配置和部署流程。
保持与社区同步:采用插件化的改造方式,避免了直接修改源代码的需要,使得系统更容易与Apache DolphinScheduler社区版本保持同步,便于后续的升级和功能获取。
自动化运维巡检
运维工作中存在一系列的挑战,主要包括任务失败的及时告警、多项目任务巡检、以及对任务完成情况的准确把握等问题。
为了应对这些挑战,我们在Apache DolphinScheduler的使用和改造过程中,实施了一系列的自动化运维措施。
自动化运维改造
通过利用Apache DolphinScheduler的元数据信息,我们实现了一个自动推送功能,每天定时将生产调度报告发送到指定的钉钉群中。这个报告包括了所有任务的运行情况,如哪些任务成功,哪些任务失败,极大地方便了运维团队及时掌握任务的执行情况。
对于运维任务失败的情况,我们增强了告警机制,确保在任务出现问题时能够及时通知到运维团队,使他们能够迅速响应和处理问题。
版本选择建议
尽管Apache DolphinScheduler作为一个开源调度工具在市场上表现优异,但像所有开源项目一样,它也存在一些问题和Bug。
我们希望通过与社区的持续沟通和交流,不仅能减轻运维团队的负担,也能贡献我们的经验和改进建议给社区,共同推动Apache DolphinScheduler项目的进步。
我们鼓励所有使用Apache DolphinScheduler的团队积极参与社区活动,共同提升这个强大工具的能力和稳定性。
本文由 白鲸开源科技 提供发布支持!