ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache DolphinScheduler深度解析:从架构原理到生产部署实践

Apache DolphinScheduler深度解析:从架构原理到生产部署实践 聊到大数据的调度工具Apache DolphinScheduler海豚调度一定是个绕不开的名字。从最早接触这个项目到现在我先后在好几套数仓和实时处理平台里落地过它也踩过不少坑。这篇文章我会从实际使用的角度把海豚调度的核心原理、集群规划、部署细节、任务实操和一些排障经验完整梳理一遍希望对正在做大数据平台选型或者准备上手海豚调度的朋友有点帮助。先说说这工具到底是干嘛的。Apache DolphinScheduler是一个分布式、去中心化的工作流任务调度系统定位是解决大数据场景下复杂的任务依赖编排和定时触发问题。你可以把整个数仓的处理链路比如数据采集、清洗、数仓分层加工、指标计算、报表生成全部以DAG有向无环图的方式定义出来由调度系统统一管理和触发。它支持Shell、SQL、Python、Spark、Flink、MapReduce、HTTP等多种任务类型完全可视化操作不用写一行代码就能把一个复杂的依赖链路搭建起来。对于数据开发工程师、平台运维人员和架构师来说这几乎是必备技能。下面我按一个完整的落地路径来展开讲。1. 为什么大数据场景离不开调度系统很多人刚接触大数据时会有个疑问任务定时跑Linux自带的crontab不就够了吗为什么要单独搞一套调度工具这个问题的答案恰恰是理解调度系统价值的入口。1.1 从crontab到分布式调度核心矛盾在哪单机crontab天然存在几个硬伤。任务之间的依赖关系没法描述比如A任务跑完了才能跑BB成功了才能跑C这种先后依赖在crontab里只能靠“把时间错开”来硬凑。时间错开看着简单实际非常脆弱A任务因为数据延迟跑了15分钟后面的B和C就跟着乱套。另一个问题是单点故障跑任务的服务器挂了所有任务全军覆没。还有资源没法横向扩展调度能力被锁死在一台机器上。而分布式调度系统解决的就是这三件事依赖编排、高可用、水平扩展。DolphinScheduler用DAG图来定义任务间的依赖关系调度引擎会根据上下游状态自动决定某个任务能不能开始跑。同时它的Master和Worker节点都是无状态的可以随意扩缩容任何节点挂掉都不会影响整个调度体系的运转。1.2 海豚调度到底解决什么问题用大白话说海豚调度就是把“什么时候跑、跑什么、跑完告诉谁、失败了怎么办”这套逻辑集中管理起来。具体到实际场景它解决的核心问题有三类。第一类是复杂依赖驱动的数据加工。数仓里的任务动辄几十个甚至上百个层与层之间有严格依赖靠人盯着跑根本不现实。DolphinScheduler把依赖画成图之后任意一个环节失败下游自动等待不会“带病执行”。第二类是跨系统、跨语言的流程编排。一个完整的数据管道可能同时包含Shell脚本、SQL脚本、Python处理、Flink实时任务、Spark离线任务海豚调度把它们统统纳管进来对外提供统一入口和统一监控。第三类是故障恢复和告警。调度系统可以设置失败重试次数、超时告警、失败告警任务挂了第一时间通知到人不用等业务方找上门才知道数据没出来。1.3 和其他调度工具对比后的选型理由业界常见的调度工具还有Apache Airflow、XXL-JOB以及各类自研系统。我和团队之前做过一轮选型对比这里说说结论。XXL-JOB更偏向“定时任务执行器”它的定位是轻量级分布式任务调度擅长把某个方法、某个脚本按cron规则触发掉。但在DAG依赖编排、任务间的血缘关系管理上能力比DolphinScheduler弱不少。XXL-JOB确实也支持任务依赖但表达复杂多层依赖时很吃力。而像“同一个任务在多台机器同时执行”这种问题在XXL-JOB里要靠分片广播或阻塞策略去规避海豚调度则从架构上就避免了重复执行后面我会细讲。Apache Airflow的DAG编排能力很强代码表达灵活Python生态完善。但它有几个痛点默认调度器是单点高可用要额外配置安装部署对新手不那么友好需要掌握Python环境、Celery、Redis、RabbitMQ等一系列组件对大数据生态组件如Yarn、HDFS、Hive的原生适配不如海豚简洁海豚是直接面向大数据场景设计的支持原生Shell和SQL任务还能通过数据源中心统一管理连接信息。选海豚最关键的因素还是它对大数据开发习惯的贴合度。界面是中文的Airflow是纯英文自带ZooKeeper做集群协调新版本支持HDFS和普通数据库注册中心安装维护成本对国内团队更友好社区也非常活跃。2. 部署前必须想清楚的架构与集群规划选型定了之后下一步就是部署。很多人在部署阶段就踩坑核心原因是没理解海豚调度的架构设计。架构没搞懂参数就不知道怎么配出了问题也不知道该查哪。2.1 核心组件分工Master、Worker、ApiServer、AlertServerDolphinScheduler的典型架构由以下几个核心组件组成每个角色的职责非常清晰。MasterServer是调度中心的大脑负责任务的拆分、DAG切分、任务实例的提交和监控、工作流实例的持久化。它不直接执行任务内容而是把任务分发给Worker。Master节点可以部署多个彼此之间通过注册中心协调实现故障转移和负载均衡。WorkerServer是真正干活的执行者它负责任务实例的启动和执行。Worker可以按组划分比如把跑Flink任务的Worker单独划成一组把跑Shell的划成另一组任务的执行环境互不干扰。Worker通过心跳向注册中心上报存活状态。ApiServer是面向用户的接口层提供RESTful API给前端界面调用。你所有的可视化操作最终都是通过ApiServer落到后端数据库的。AlertServer负责告警。任务失败、超时、工作流状态变化都会触发告警告警通道支持邮件、企业微信、钉钉、飞书、Webhook等。搞清楚这些角色之后出现问题至少知道该查哪个服务。任务提交了没反应查Master任务提交了不执行查Worker和它的日志界面上不了查ApiServer告警没收到查AlertServer。2.2 集群规模怎么定组件数量与资源估算我见过不少生产集群的部署方式可以给大家一个直观的参考配置。需要注意这只是我的经验值实际要根据任务量来微调。集群规模适用场景组件分布建议最小单机学习、开发测试、日任务量低于100Master Worker ApiServer AlertServer H2/MySQL ZooKeeper 同机部署小规模集群日任务量1000以内2台Master 2~3台Worker ApiServer 外部MySQL 3节点ZooKeeper中大规模集群日任务量3000以上任务类型多3台Master 5~10台Worker按组划分 独立ApiServer集群 外部MySQL(主从) 3~5节点ZooKeeperMaster节点建议至少2个一个挂了另一个能顶上但这不代表Master和Worker不能在同一台机器上。小规模集群里经常混部因为Master本身吃资源不高大概占1~2G内存即可。Worker就比较吃资源了它是真正跑任务的节点内存、CPU都要给足建议物理机或高性能虚拟机单独部署。目前新版本已经推出了基于线程池的任务执行模型稳定性比前代高了不少。资源估算方面我的经验公式是一台Worker节点能同时跑的任务数线程池大小约等于 CPU核数 × 2具体要看任务类型IO密集型的还能往上调计算密集型的则要保守一点。4核8G的机器线程池配置10~15个合理16核32G的机器可以配置30~40个。不要过度堆积线程否则任务是同时跑了底层计算引擎反而先扛不住。2.3 数据库和注册中心的选择DolphinScheduler的元数据默认支持H2、MySQL、PostgreSQL。生产环境千万别用H2那是单机学习用的。我强烈建议直接用MySQL或者PostgreSQL并开启主从备份。海豚的元数据库承担非常高频率的读写每个工作流和任务实例的每一次状态变化都会写库所以数据库性能直接决定整个调度平台的上限。数据库连接池配置也要同步调优默认值通常偏保守。注册中心上旧版本默认依赖ZooKeeper3.x以后增加了HDFS和普通数据库两种新的注册中心实现很多团队也尝试用etcd。但我个人的真实感受是生产环境至今我依然坚持用ZooKeeper3.2.x版本已经兼容纯内网部署稳定性经过大量案例验证。ZooKeeper在这里的作用就是Master选举、Worker心跳注册、任务队列协调它的选主能力非常成熟。HDFS和JDBC注册中心适合一些不强依赖ZK的环境但生态和排查工具少一些不推荐新手生产直接用。3. 核心原理调度任务是怎么被安全执行的这是整个博文的重点之一。理解了调度原理才能在出问题时快速定位。我重点讲两个话题DAG是怎么从定义变成执行的以及为什么这个架构不会出现同一任务被多台机器重复执行的乱子。3.1 DAG定义到执行的全过程解析用户在界面上画好DAG填好任务参数并点击上线后整个执行链路是这样的调度系统根据cron表达式触发生成一个工作流实例。Master从数据库中读取这个工作流对应的DAG结构做DAG切分。所谓切分就是分析哪些任务是根节点没有上游依赖哪些是中间节点哪些是尾节点以及它们之间的依赖关系。根节点对应的任务会生成任务实例放入待执行队列。Worker在注册中心上监听队列发现有待执行的任务就取走执行对应的任务类型比如Shell任务就启动一个Shell进程Spark任务就提交到Yarn。任务执行完毕Worker把结果上报给MasterMaster更新任务实例状态。如果这个任务是下游任务的前置依赖Master会检查其所有上游是否都成功。是则生成下游任务实例继续分发否则标识下游任务处于等待状态。整个工作流实例在所有任务都终态成功、失败、停止等后关闭。注意Master不执行具体任务只负责编排决策这样压力和执行逻辑进行了解耦。3.2 同一个任务为什么不会在多台机器上同时执行这是被问得最多的一个问题尤其是从XXL-JOB转过来的朋友经常对“集群部署会不会同一个任务被多台Worker同时各跑一遍”有疑问。这个担心的本质是任务调度的一致性保障问题。DolphinScheduler在架构设计上从两个层面解决了这个隐患。第一任务实例是唯一且持久化的。一旦工作流被触发Master会立即在工作流实例下生成一批任务实例并写入MySQL数据库。任务实例在整个生命周期里无论被谁处理它的状态只有一条记录。Worker取到任务并执行时会先把该任务实例状态更新为“执行中”这个更新动作是带条件的只有从“提交”状态才能变为“执行中”状态被抢先更新的任务实例其他Worker是拿不到的。第二Worker之间是抢队列而非“各扫门前雪”。所有待执行任务都放在一个全局队列逻辑上由Master协调注册中心做节点感知有执行能力的Worker主动去取。取到算谁的取不到就继续等。这有点像食堂打饭窗口只有一个出餐口谁手快谁端走不存在两个窗口同时炒同一份菜。因此同一种任务在同一个时间点最多只会被一个Worker消费并执行不会出现“两台机器同时跑同一个任务”导致数据重复计算、结果写双份的情况。如果是临时对历史数据补数也最多由手动触发产生新实例和定时实例是两码事。3.3 Master和Worker的容错机制容错是生产环境的另一个核心关注点。Master挂了怎么办Worker执行到一半挂了怎么办海豚调度有对应的处理策略。Master挂了集群里其他Master会通过注册中心的临时节点感知到并立刻接管它的任务任务不会丢只可能出现短暂的调度停顿。Worker挂了在它上面执行的那些任务实例会被标记为“need-fault-tolerant”由Master重新分配给其他健康的Worker。这里有一点要留意任务重跑与否取决于任务实例的运行状态。如果Worker在进程启动前就挂了任务还能重试如果进程跑了一半Worker宕机因为任务没有被判为终态系统会按照容错逻辑去检查处理实际取决于日志和任务类型的实现机制。所以最稳妥的做法是任务本身要对数据写入做幂等控制调度平台只能保证“至少处理一次”不能保证“恰好一次”这是分布式系统的一个共识。之前有读者私信我问“我们Worker机器突然宕机了任务在另一台机器上重跑了一遍数据重复了怎么办”我反问了三个问题这些任务的写入目标是Hive分区还是MySQL是否按天分区的覆盖写写入前有没有清分区搞清这三点就明白做数据任务时把“跑数”设计成“先清后写”的幂等模式大部分重复执行的隐患都能化解。4. 部署实操从零搭建一个可用的集群环境现在进入实操环节。我以一套3节点集群为例1个Master 2个Worker共用一套MySQL和ZooKeeper演示完整的部署流程。这套配置适合中小团队直接参考也适合个人装个虚拟机练手。4.1 环境准备与关键依赖需要提前准备的东西如下3台CentOS 7.x或Ubuntu 20.04服务器推荐配置Master 4C8G、Worker 8C16G、数据库节点4C8G。练习环境则1~2台即可。JDK 1.8推荐OpenJDK 1.8有些发行版自带OpenJDK11也能跑但很多团队还在生产用1.8第一次部署建议1.8。ZooKeeper 3.4.6建议3.6.x或3.7.x稳定版。MySQL 5.7 或 PostgreSQL需提前建好库。如果任务要跑大数据组件还需要提前配置好HDFS、Hive、Spark、Flink这些环境。一个容易被忽略的坑是MySQL驱动。DolphinScheduler连MySQL时需要mysql-connector-java驱动包新版本在下载时已经内置了对应驱动旧版本需要手动放到lib目录下否则启动时日志会报找不到驱动。4.2 安装包的获取与目录规划安装包从Apache官网下载长期支持版目前推荐3.2.x系列。下载下来的tar包解压到规划好的目录例如/opt/dolphinscheduler。目录结构里几个关键目录要知道bin放启动脚本conf是配置文件master-server、worker-server、api-server、alert-server分别对应各服务的部署目录sql里是数据库初始化和升级脚本。搞清楚目录结构后期维护会顺手很多。4.3 初始化数据库与配置文件修改首先在MySQL里创建数据库和用户然后执行初始化脚本CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER dolphinscheduler% IDENTIFIED BY your_password; GRANT ALL PRIVILEGES ON dolphinscheduler.* TO dolphinscheduler%; FLUSH PRIVILEGES;然后执行初始化SQL脚本不同版本脚本路径有所不同一般在sql/dolphinscheduler_mysql.sql或sql/upgrade目录下mysql -h127.0.0.1 -udolphinscheduler -p dolphinscheduler /opt/dolphinscheduler/sql/dolphinscheduler_mysql.sql紧接着修改conf/application.yaml里数据库连接配置还有conf/common.properties里的关键项。我直接把常用配置列在下面spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://192.168.1.10:3306/dolphinscheduler?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai username: dolphinscheduler password: your_passwordcommon.properties里需要关注的参数# 注册中心类型生产建议zookeeper registry.typezookeeper registry.zookeeper.connect.string192.168.1.11:2181,192.168.1.12:2181,192.168.1.13:2181 # 资源存储类型可以是HDFS或本地文件系统 resource.storage.typeHDFS resource.hdfs.root.userhdfs resource.storage.upload.base.path/dolphinscheduler资源存储这里重点提示如果你希望任务里能引用统一管理的资源文件比如Spark任务依赖的jar包、SQL任务里的模板SQL就需要配置HDFS或S3。只用Shell和临时SQL的话配成本地文件目录也行但多节点Worker时本地目录各自独立资源不通所以生产建议直接HDFS。4.4 集群构建与各节点启动配置改完后需要把整个安装目录分发到另外两台机器。保证目录结构一致各节点conf/Master 或 conf/Worker配置分开编辑。注意Master节点头上配置Worker节点头上也要配置但Master和Worker是否在同一台机器上由install.sh里的规划决定。官方提供的集群脚本在bin/install.sh里把每个节点的IP、角色、SSH端口写好一键分发并启动。如果不方便用官方脚本也可以每个节点分别启动# Master节点启动 bin/start-master.sh # Worker节点启动 bin/start-worker.sh # ApiServer节点启动 bin/start-api.sh # AlertServer启动 bin/start-alert.sh启动后建议立刻检查日志路径在logs/下。最常看的日志是master-server和worker-server下的运行日志很多启动失败问题都能在日志里直接看到。4.5 配置租户与队列海豚特有的授权模型DolphinScheduler 有一个非常实用的租户概念。简单理解租户对应Linux下的一个系统用户Worker在执行任务时会以该用户身份运行。这样做的好处是权限隔离——不同的任务组用不同的系统用户不会出现A业务线的脚本把B业务线文件删了的情况。队列参数是配合Yarn使用的指定任务提交到Yarn的哪个队列。没有Yarn的话可以留空。在“安全中心-租户管理”里创建租户填上系统用户名这个用户必须在Worker机器上真实存在再在“用户管理”里给开发人员分配用户和租户。这套模型一旦理解权限体系就清楚了。5. 核心功能实战从建项目到任务跑通的全流程部署好了接下来说说日常用得最多的功能操作。我带着你走一遍完整流程从建项目到成功跑一个任务这中间有几个关键操作点特别重要。5.1 项目、工作流定义与定时配置登录海豚界面后第一步是创建项目。一个项目对应一个业务线或一个数据域比如“用户行为分析”、“实时数仓”等。进入项目后创建工作流定义然后拖拽左侧任务节点到画布。每个任务节点有六个必看配置区节点名称全项目唯一建议用 业务_表名_动作 这种规范比如ods_order_daily_sync。任务类型Shell、SQL、Spark、Flink等选了类型才会出现对应的参数面板。运行参数向脚本内传入的自定义参数用${param_name}引用。这是工作流代码化复用最重要的手段。资源可以挂在资源中心里统一管理的文件。依赖关系在画布上连线。上游节点画到下游节点表示上游成功下游才会启动。失败重试重试次数和重试间隔建议生产环境至少设2次间隔1~2分钟很多问题是临时的网络闪断或资源排队重试可以直接救回来。配置完成后保存、上线。然后在“定时管理”里配置cron表达式。海豚支持标准的cron格式也支持“分钟、小时、天、周、月”的简化配置比如每天凌晨2点跑填0 0 2 * * ? *即可。5.2 多任务类型实操演示我拿一个真实的数仓同步场景演示。假设每天凌晨我们要做三件事把业务库数据同步到ODS层、ODS到DWD层做清洗、DWD到DWS层做汇总。对应三个任务节点。第一个节点ODS层同步Shell#!/bin/bash source /etc/profile sqoop import \ --connect jdbc:mysql://业务库地址:3306/orders \ --username xxx --password xxx \ --table order_info \ --target-dir /user/hive/warehouse/ods.db/order_info/dt${dt} \ --delete-target-dir \ --fields-terminated-by \001 \ --m 4注意${dt}是海豚内置的时间参数默认格式是yyyyMMdd。在任务参数里可以自定义比如补数时可以指定dt20240101。第二个节点ODS到DWD清洗SQL任务类型选“SQL”数据源选择已配置好的Hive数据源SQL语句直接写INSERT OVERWRITE TABLE dwd_order_info PARTITION (dt${dt}) SELECT order_id, user_id, amount, status FROM ods_order_info WHERE dt ${dt} AND order_id IS NOT NULL;SQL任务节点里有个很关键的开关——“SQL类型”。默认是“非查询”适合INSERT、UPDATE、DELETE这类操作如果选了“查询”会把结果回传到前端展示。平时跑脚本千万别选成查询否则结果集很大时容易把ApiServer内存撑爆。第三个节点DWD到DWS汇总Shell汇总任务交给Spark跑比较快spark-submit \ --class com.example.OrderDailySummary \ --master yarn \ --deploy-mode client \ --executor-memory 4g \ --num-executors 8 \ hdfs:///path/to/jar/order-summary.jar \ --dt ${dt}三个节点依次连线1→2→3。上线后测试运行一次观察DAG实例执行情况。5.3 补数功能定时任务之外的救命稻草补数是调度系统里非常高频的操作。业务方常说“上周的数据算错了重跑一下”如果一个个任务手动跑非疯掉不可。海豚的补数功能支持选择时间范围系统会自动在指定日期范围内为每个任务生成对应日期的实例。具体入口在“工作流实例”页面的“补数”按钮。选择起止日期、补数策略串行还是并行、是否覆盖已有实例点击确定即可。这里的经验是并行补数别把时间跨度一下拉到三个月一次性上百个实例涌进去调度压力会非常大建议按天或按周分批补。5.4 数据源中心和资源中心降低重复配置成本安全中心里的“数据源中心”支持管理MySQL、PostgreSQL、Hive/Impala、Spark、ClickHouse、Oracle等数据源。一旦配好SQL任务节点直接下拉选择数据源脚本里不用再写连接信息。而且连接信息集中管理后数据库密码换了一次生效不用再挨个改任务脚本这个功能能省下大量维护成本。资源中心同理所有任务引用的Jar包、SQL模板文件、Shell脚本都集中上传管理供所有工作流引用版本更新只改一处。6. 生产环境常用优化与细节调整部署和基础操作都通了之后再往前一步就是把调度平台调优到能稳定扛住生产压力的状态。这一节分享几个实践经验。6.1 工作流与任务参数的传递技巧海豚支持三种参数类型全局参数工作流级别所有节点可见、局部参数节点级别仅当前节点可见、上游参数由上游节点的输出传递给下游节点使用。实际工作中最常用的是全局参数典型的例子是定义${biz_date}业务日期全局参数创建好整个工作流的后无论是补数还是日常调度只需在运行时传入一个 biz_date整条链路的时间口径就统一了。跨节点参数传递则是上游节点通过输出日志的方式把变量值抛出来下游节点引用的典型玩法常用于从一个SQL里动态取出业务截止日期传给下游做增量同步。命名祖传建议参数名一律小写字母下划线避免中文和驼峰否则在脚本里引用时容易因为大小写写错导致取不到值。6.2 告警规则配置的实践经验告警这块我踩过不少坑。最开始的配置是把所有任务都加上失败告警结果每天半夜都被告警炸醒后来发现有些任务本身就有重试机制第一次失败重试就成功了根本不用惊动人。最终的告警配置原则是重试次数以内的失败不告警重试结束后仍然失败才告警。海豚里每个任务节点的“失败重试次数”配合工作流全局的告警策略可以很好地实现这个效果。另外超时告警很有用针对的是“任务一直卡在运行中不结束”这种状态。给关键任务设定合理的超时时间比如运行超过2小时就视为异常能及时发现那些既不失败也不完成的任务。6.3 资源隔离Worker分组提升稳定性机器多了之后不同业务线的任务挤在同一批Worker上经常互相影响。Flink实时任务吃满了CPU离线批处理的Spark任务排队等资源。解决方案是利用Worker分组功能把不同业务的任务组划分到不同的Worker组实现物理隔离。操作上去Worker机器上修改/新增 Worker 分组配置然后在“工作流定义-运行参数”里指定workerGroup。划组之后实时任务和离线任务互不干扰排查问题时也容易定位Flink任务慢了直接看Flink Worker组的负载即可不用满集群找原因。6.4 性能调优Master线程数、队列长度和数据库参数当工作流和任务量很大特别是补数高峰期调度平台自身可能成为瓶颈。几个关键的调优点如下master.properties里的master.exec-threadsMaster处理任务分发的线程数默认值是可用CPU核数的2倍。如果任务量很大可以适当调大但不要超过CPU核数的4倍。worker.properties里的worker.exec-threadsWorker执行任务的线程数这个参数直接决定一个Worker能同时跑多少个任务建议根据机器规格和任务特性调整为30~50。数据库连接池参数在application.yaml里把hikari连接池最大连接数从默认的50调到100左右避免高并发时任务实例状态更新等待数据库连接。MySQL的max_connections也要同步调大。注册中心ZooKeeper的会话超时时间网络抖动厉害的环境下默认的3秒超时太敏感Master和Worker容易被误判下线建议调到10秒以上。7. 常见问题与排查技巧实录最后这部分我直接把之前帮别人救火时遇到的高频问题整理成速查表每个都是真实案例不是官方文档里的空话。现象排查方向解决方案示例Master启动失败日志报ZooKeeper连接超时注册中心不通或者版本不兼容检查ZooKeeperconnect.string用zkCli.sh -server测试连通性确认ZooKeeper版本3.4.6以上Worker启动成功但不消费任务Worker所在的机器时间与Master不同步所有节点同步ntp时钟时间差太大会被判定为心跳过期任务一直处于“提交”状态迟迟不执行Master和Worker之间的网络不通或者Worker线程池已满检查节点间防火墙和路由登录Worker查看日志确认线程池状态Shell任务报“权限拒绝”租户对应的系统用户不存在或者目录权限不对在所有Worker节点创建租户同名的用户并赋予脚本执行权限SQL任务执行很慢且日志出现连接池耗尽数据源连接池太小或者连接被泄漏了检查并调大数据源连接池最大连接数分析SQL本身是否有锁等待修改了定时配置但任务到点没跑工作流没有上线定时配置没有关联到工作流确认工作流定义状态是“上线”定时管理里的工作流要绑定对应的定义告警重复发送很多次任务失败重试导致多次告警在工作流定义里统一配置重试次数并在告警组里做告警聚合设置界面打不开ApiServer一直报数据库连接失败数据库连接配置错误或驱动包未放确认application.yaml中的URL、账号、密码确认数据库驱动jar已放到对应lib目录再补充几个实践中总结的排查心法。第一遇到任何异常先翻日志。海豚的日志路径很清晰Master日志在logs/master-server/Worker日志在logs/worker-server/任务执行的详细日志在“任务实例”页面直接点“查看日志”即可。绝大多数问题在日志里都有明确线索。第二关注数据库里的任务实例状态。如果怀疑调度异常直接查MySQL里t_ds_task_instance表的状态变化这是判断调度心跳是否正常的金标准。日志可能骗人状态流转不会。第三改配置前先备份。common.properties、application.yaml这种核心配置文件改之前cp一份带日期的备份出问题可以秒回滚。别问我为什么强调都是教训换来的。还有一个经验之谈新版本升级前务必要把sql/upgrade目录下的升级脚本在测试库先跑一遍确认没有破坏性变更再上生产。海豚的升级路径比较规范但也见过跨大版本升级后旧任务实例的某些历史数据读不出来只能做兼容处理的案例。所以在测试环境多跑几轮把核心流程回归一遍再动生产永远值得。我个人在实际操作中的体会是调度平台本身不产生数据价值但它是所有数据价值稳定输出的底盘。架构设计再花哨不如调度稳定可靠来得实在。海豚调度这个项目经过这几年的迭代已经成为大数据领域里非常成熟的开源方案从学习成本到运维成本对国内团队都相当友好。这篇内容里提到的架构理解、部署规划、权限模型、参数传递、告警规则、Worker分组这些点是我认为从“会用”到“用好”最关键的分水岭。如果在搭集群或者写工作流时卡住了优先想想职责分工、状态流转、日志这三个关键词大部分问题都能迎刃而解。最后再分享一个小技巧平时没事多看看调度数据库里任务实例的状态分布早发现早处理比告警响了再去救火要舒服得多。
返回列表