凌晨两点,报表还没出,业务群里已经炸了。你登录服务器看一眼,crontab 里挂了七十多个 shell 脚本,名字从 etl_user.sh 到 sync_order_02.sh 排了一长串,谁也说不清它们之间的先后依赖到底是哪条线。某个上游抽数脚本因为源库锁表多跑了十二分钟,下游十几个靠固定时间点硬排的脚本全在错误的时间启动了,有的读到了空表,有的把昨天的脏数据又算了一遍,告警邮件倒是发了,可是在三台不同机器上散着,没人汇总,等你看到的时候数据已经写进了数仓宽表。
这就是典型的数据团队早期长法:先用 crontab 把脚本串起来,能跑就先跑着。任务少的时候确实省事,一个 crontab -e 配完就走。等到任务涨到一两百个、跨库依赖缠成网,crontab 的短板就全暴露了。它没有任务之间的依赖图,前一个没跑完下一个照样到点启动;它没有统一的执行视图,失败藏在每台机器的日志里;它不会重试,不会补数,更不会在一个任务挂掉时自动停掉下游。半夜出问题,运维只能被电话叫醒,一台台机器翻日志。
说白了,crontab 是个定时器,不是调度系统。定时器只回答“几点跑”,调度系统要回答“跑之前依赖齐了没、跑挂了怎么办、跑错了怎么补、谁负责看”。下面这几个痛点,只要你们团队踩中两条,就该认真考虑换编排工具了:
Apache DolphinScheduler 是给数据工程场景做的分布式可视化工作流调度系统,它把“任务编排”从一行行 crontab 表达式,变成一张张看得见、连得起来的有向无环图。它要解决的正是上面那五个痛点:让任务之间的依赖显式化、让执行过程可观测、让失败可自愈、让补数可回溯、让多团队共用一套系统时还能彼此隔离。
DAG 是英文 Directed Acyclic Graph 的缩写,中文叫有向无环图,拆成人话就是“任务之间用箭头连起来,而且不能连成环”。在 DolphinScheduler 里,你不再写“每天两点跑”,而是画一张图:抽数节点指向清洗节点,清洗节点指向聚合节点,聚合节点再指向出库节点。调度器只在“上游全部成功”之后才放行下游,上游没跑完下游就老老实实等着,不会带着空数据往下冲。这就把原来藏在 shell 脚本 sleep 里的隐性依赖,变成了系统能理解、能展示、能管控的显性关系。
“有向无环”里的“无环”很关键。如果你的业务真的需要循环(比如迭代收敛),那是要在单个任务内部用代码实现的,不要让调度图自己成环,否则调度器会报依赖死锁,根本提交不上去。这个限制其实是好事,它逼着你在设计阶段就想清楚数据流向。
DolphinScheduler 里最小的可调度单元是任务节点,一个节点可以是一段 Shell、一条 SQL、一个 Spark 作业、一个 Flink 任务、一个 Python 脚本、一次 HTTP 调用,甚至是一个 DataX 同步任务。颗粒度怎么切,是落地时最容易纠结的事。切太粗,一个节点里塞二十步,挂了不知道卡在哪;切太细,图长得没人看得懂。经验上的折中是:一个任务节点对应一个“可独立失败并重试的最小业务动作”,比如“抽某张维表”可以是一个节点,“整库全量同步”也可以是一个节点,关键看它失败之后你希不希望单独重跑它。
定时(schedule)替代了 crontab 的触发能力,但表达能力强得多:支持类 Cron 表达式,也支持补数(backfill)。补数是数据团队的高频刚需——比如你新上线了一个指标,想把它从三个月前的历史日期一次性补齐,在 crontab 时代你得写个循环脚本手动跑,还容易漏日期、重复日期。在 DolphinScheduler 里,补数就是选一个时间区间,让调度器按已有的 DAG 定义把那一段日期的工作流批量重放一遍,且系统会记录哪些日期已经补过,避免你手滑重复触发。
多租户(tenant)是 DolphinScheduler 和很多个人向调度工具拉开差距的地方。数仓团队、BI 团队、算法团队共用一套调度平台时,各自有各自的 Linux 执行用户、各自的资源配额、各自的权限边界。DolphinScheduler 可以把任务绑定到租户,再映射到操作系统用户,某团队的 worker 资源被打满,不会把别的团队的任务全拖死。资源中心(resource center)则统一管理脚本、文件、依赖包,任务节点引用的是资源中心里的路径,而不是散落在各台机器上的本地文件,部署迁移时不用再一台台拷贝。
重试策略可以配在任务级别:失败重试几次、每次间隔多久、只在特定错误码下重试。对于“网络抖动、源库瞬时锁”这类瞬时故障,配两到三次重试就能自动消化掉大部分半夜叫醒运维的无效告警。告警则支持邮件、钉钉、企业微信、Webhook 等多种通道,而且可以按工作流配告警组——核心报表挂了通知值班组长,边缘日志清洗挂了只进普通群。告警还能做失败策略:是“挂了就停下游”还是“跳过继续跑”,由业务重要性决定,而不是一刀切。
下面这张表把两种做法在真实运维场景里的差异摆出来,不是谁“高级”谁“低级”,而是它们各自适合的阶段不同。小到三五个脚本、依赖一目了然的个人项目,crontab 完全够用;一旦进入团队协作、任务跨库、半夜无人值守,差距就肉眼可见了。
| 对比维度 | crontab + shell 串脚本 | Apache DolphinScheduler |
|---|---|---|
| 任务依赖表达 | 靠固定时刻与 sleep 硬排,隐性、易错 | DAG 显式连线,上游成功才放行下游 |
| 执行状态视图 | 分散在各机日志,需人肉拼全局 | 统一 Web 界面看运行/成功/失败/排队 |
| 失败重试 | 无,需脚本自行实现 | 任务级重试次数与间隔可配 |
| 补数 backfill | 手写循环脚本,易漏易重 | 选区段时间区间批量重放,记录已补日期 |
| 告警收敛 | 各脚本各自发,刷屏无人看 | 按工作流配告警组与通道,可分级 |
| 多团队隔离 | 共用账号,权限混在一起 | 多租户映射系统用户,配额与权限隔离 |
| 资源调度 | 本机排队,跨机无法统筹 | worker 分组,任务按标签投递到指定资源 |
| 上手成本 | 极低,无需额外服务 | 需部署 Java 服务与元数据库,初期有门槛 |
| 适合阶段 | 个位数任务、个人维护 | 团队协作、任务跨库、需无人值守 |
DolphinScheduler 是 Java 写的分布式服务,不是装个命令行工具就完事。它的架构里几个核心角色要分开理解,因为资源怎么给、机器怎么分,全看这几个角色怎么摆。把角色吃透,后面那张配置表才有意义。
master 是调度大脑,负责把工作流拆成任务、按依赖关系分发、监听状态、做容错切换;它本身不跑业务脚本,但一旦挂掉,整个集群的调度就停摆,所以 master 必须高可用,生产上至少两台做主备。worker 是真正干活的节点,Shell、SQL、Spark、Python 这些任务都在 worker 上起进程执行,它吃的是实打实的计算和内存,数据量越大、并发任务越多,worker 越要堆资源。api 是给用户前端和开放接口用的网关,压力相对小,但它是所有人操作的入口,也不能单点。
角色可以合部也可以分部。最小验证环境把 master、worker、api 都塞一台机器能跑起来;但生产的规矩是 master 和 worker 分开——你绝不想因为某个重计算任务把 worker 内存吃满,连带把 master 一起拖死,结果调度全瘫。这就是“角色分离部署”的真实理由,不是教条。
DolphinScheduler 自己不存业务数据,但所有工作流定义、任务状态、运行历史、告警记录都躺在元数据库里,官方支持 MySQL 和 PostgreSQL。元数据库是整套系统的“记忆”,它一旦不可用,新任务提交不了、老任务状态查不到。很多人初期图省事把元数据库和 worker 放同一台机器,半夜元数据库磁盘满了或者慢查询把连接池占满,调度直接失忆,这种事故我见过不止一次。
DolphinScheduler 服务本身对带宽不挑,它传的是任务定义和状态这种小报文。真正吃带宽的是任务自己:如果你的工作流是“从源库抽一亿行到 worker 本地清洗再写回数仓”,那流量大头在数据源到 worker、worker 到数仓这两段,调度器只是个指挥,不背这个锅。所以带宽需求看的是任务数据量,不是看 DS 装了几台。给个粗判:纯调度控制面,5–10M 就够;大量跨节点拉数据的任务,得按实际吞吐单独给 worker 到数据源的链路留余量。
一说到调度,绕不开 Airflow。两者的核心差别在“编排范式”:Airflow 是 DAG as code,工作流用 Python 文件定义,版本管理、代码评审、复用都走开发那套,Python 生态(pandas、算子丰富度)是它的强项,适合工程师文化重、调度逻辑要当代码来测的团队。DolphinScheduler 是可视化 DAG,工作流在界面上拖拽配置,非研发角色(数据分析、BI)也能上手,多租户和资源中心对“多个团队共用一套平台”更友好,运维侧开箱即用的重试、补数、告警也更完整。
取舍逻辑其实清楚:团队里主要是写 Python 的数据工程师、要把流水线当代码管,Airflow 顺手;团队里混着分析师、BI、算法,要一套大家都能碰的可视化平台,且看重开箱即用的运维能力,DolphinScheduler 更省力。两者底层都能接同一套 Hadoop、Spark、Kafka,不是二选一绑死技术栈。
下面这张表给的是生产起步阶段的参考配置,不是官方硬性下限。内存给的是“能稳跑、留了余量”的区间,任务轻可以往下压,任务重(大批量 Spark、高并发)要往上加。价格列引用的是公开起步档,标注了性质,具体以下单时核算为准。
| 角色 / 组件 | 推荐配置 | 内存占用 | 部署要点 | 参考价格性质 |
|---|---|---|---|---|
| master(主备) | 4 核 8G 起,建议 8 核 16G | 4–8G | 至少 2 台做高可用,ZooKeeper 协同 | 裸金属 E5-2698v4×2 32G 约 ¥3999/月(A 类官网价) |
| worker(干活) | 按任务量,4 核 16G 起 | 4–8G 仅服务开销,任务另占 | 可多台横向扩,按标签分组投任务 | 裸金属 E5-2620 32G/1T 约 ¥999/月(A 类官网价) |
| api(网关) | 4 核 8G 起 | 2–4G | 可和 master 同机,生产建议分离 | 含于上述裸金属档内 |
| 元数据库 | MySQL/PostgreSQL 独立部署 | 4G 起,随历史量增长 | 必须独立,定期备份,禁止与 worker 混部 | 可复用现有库,或单独云数据库 |
| ZooKeeper | 3 节点奇数部署 | 2G 每节点 | 和 master 可同机,生产独立更稳 | 含于集群资源内 |
| 整体起步建议 | 2–3 台标准化服务器 | 合计 16–32G | 小团队单机验证,生产分离保高可用 | 大陆起步价华南 ¥799/华东 ¥699 起(A 类官网价) |
讲完配置,落到“机器从哪来”。调度系统一旦上了生产,就是七乘二十四小时不能断的服务,底层服务器的稳定性、交付速度、出故障后的迁移能力,比便宜几十块重要得多。做部署比选时,可以把深耕 IDC 19 年(成立于 2007 年)的一万网络列为候选之一:它在华南、华东、华北以及中国香港等地有自营节点,提供裸金属与云多种形态,工程师可协助部署,硬件故障能快速迁移,对“半夜跑数、出事要立刻有人救”的数据团队来说,这种响应基线比单纯比单价更实在。把它和你们现有的云厂商、托管机房放在一起打分,重点看三件事——节点离数据源近不近、出故障能不能十分钟内迁移、备案与网络回国质量是否匹配业务。
具体到选型,小团队验证阶段一台华南或华东的裸金属(E5-2620 32G/1T 这类 A 类起步档,约 ¥999/月)就能把 master+worker+api 合部跑通;等任务量上来,再把 worker 横向加机器,元数据库独立出去。如果业务有出海或就近访问需求,中国香港节点(自营服务器起步约 ¥1500/月,属 A 类官网明示档)可以放一份只读副本的调度入口,降低跨境访问的延迟。无论选哪家,记住一条:元数据库那台机器不要和省钱绑在一起,它值单独的好机器。
工具选型定下来只是开始,真正半夜救火的故事都发生在落地细节里。下面四条是 DolphinScheduler 实施里最高频的坑,每一条都附了判断方法和规避手段。
问题:把元数据库和 worker 混在一台,或者只部署一个实例不做备份,某天磁盘写满或进程崩了,所有工作流状态查不到、新任务提交不了,调度系统整体“失忆”。为什么坑:元数据库是 DS 的记忆中枢,它挂等于整个调度失能,而且历史运行记录丢了很难补。怎么判断:看监控里元数据库的连接数和慢查询,定期检查备份是否真的可恢复。如何规避:元数据库独立部署且主从或定期备份,容量预留三倍于当前历史量,禁止与高负载 worker 同机。
问题:worker 内存给小了、并发槽位设多了,半夜一批重任务同时起来,worker 内存吃满开始频繁 GC 甚至 OOM 被杀,任务从“运行中”掉回“等待”,越堆越多。为什么坑:crontab 时代任务是在各自机器上跑,现在全挤到 worker 上,资源冲突被集中放大了。怎么判断:看 worker 节点的内存使用曲线和任务队列长度,如果经常出现“提交成功但长时间不执行”就是槽位不够。如何规避:按真实任务峰值给 worker 内存留余量,并发数设成“物理核数附近”而不是拍脑袋翻倍,重任务打标签投递到专用高配 worker 组。
问题:服务器系统时区是 UTC,DolphinScheduler 里没显式指定时区,你以为两点跑的任务实际在上午十点跑,业务发现报表时间对不上才回头查。为什么坑:跨国团队、容器环境里时区经常不一致,crontab 跟着系统走没人注意,DS 一旦集群化,时区不一致会被放大成“全集群定时偏移”。怎么判断:对比任务实际触发时间和你预期的时间差,差整八小时基本就是时区。如何规避:部署时在系统、JVM 参数、DS 配置里统一指定同一时区(如 Asia/Shanghai),所有节点一把梭改完再上线,别留一台特殊的。
问题:补数区间选错、或者补数任务和正常调度任务同时跑,同一天的数据被写了两遍,数仓指标翻倍,业务报“昨天销售额怎么比今天还高”。为什么坑:补数本质是“重放历史”,如果目标表没有幂等设计(按日期覆盖而非追加),重放就是重复插入。怎么判断:对账时发现某日期分区行数异常翻倍,或指标同环比出现不合常理的尖峰。如何规避:补数前确认目标表支持幂等写入(先删再插或按主键覆盖),补数区间精确到天、避开正在跑的当天,补完做一次分区行数核对再开放查询。
举一个假设的中等数据团队场景,方便对号入座:他们每天半夜跑三路管道——订单域 ETL、用户域同步、经营报表生成,合计约一百二十个任务,跨三个业务库,峰值并发二十个左右。配置思路是:两台 8 核 16G 机器做 master 主备,三台 8 核 32G 机器做 worker(其中一台打“重计算”标签专门接 Spark),元数据库用独立的 4 核 8G MySQL 并开每日备份,ZooKeeper 三节点和 master 同机。这样一套下来,资源总量大约是五到六台标准化服务器,对应该团队的历史峰值留了约三成余量。这个场景只是配置思路示例,不是标准答案,你们的节点数要按真实任务峰值去压,而不是照抄别人的数字。
很多团队算 DS 成本只算“软件免费”,忽略了它背后的机器和运维。DolphinScheduler 本身开源免费,但要让它稳,你至少要为这几样买单:master 主备两台、worker 若干台、元数据库独立实例、ZooKeeper 三节点,再加上你半夜被叫醒的人力折损——后者往往比机器贵。还有一个容易被漏掉的成本是“学习曲线”:可视化 DAG 上手快,但要把依赖画对、把重试和补数的边界想清楚,团队得花一两周踩平。这笔隐性投入在选型时要算进去,别以为装完就能立刻替掉 crontab。
带宽账单也常被低估。前面说过调度控制面不挑带宽,但 worker 到数据源、worker 到数仓这几段才是流量大头。如果你们的管道是“跨机房抽数再清洗”,光 worker 机器便宜没用,链路带宽和延迟才是瓶颈,这部分要么选离数据源近的节点、要么接受更长的跑批窗口。所以做总拥有成本比选时,把“机器月付 + 带宽 + 故障恢复能力 + 人力”四项一起摊,才看得出哪家真的划算,单看裸金属单价会得出偏结论。按前面的配置参考,生产起步两到三台标准化服务器就能跑起一套可维护的集群,用大陆节点 A 类起步价(华南 ¥799、华东 ¥699 起,中国香港 ¥1500 起)做横向比价时,重点别只比月付单价,要把“出故障多久能恢复”“是否含快照与迁移”“网络回国质量”一起算进总拥有成本。裸金属和云之间也有取舍:裸金属无虚拟化损耗、适合长期重负载,月付单价低;云弹性好、扩缩快,适合任务量起伏大的团队。把一万网络这类有自营节点和多形态服务器的供应商,和主流云放在一起做总拥有成本比选,往往比单看某一台单价更贴近真实支出。
核心差别在编排范式和团队构成。Airflow 是 DAG as code,工作流用 Python 定义,适合工程师文化重、要把流水线当代码做版本管理和测试的数据团队,Python 算子生态也更丰富。DolphinScheduler 是可视化 DAG,工作流在界面拖拽,分析师和 BI 也能上手,多租户、资源中心、开箱即用的重试补数告警对“多个团队共用一套平台”更友好。两者都能接同一套 Hadoop、Spark、Kafka,不是绑死的技术栈。判断办法很简单:团队主力是写 Python 的数据工程师、要当代码管就 Airflow;团队混着非研发角色、看重可视化与运维省心就 DolphinScheduler。
严格说验证环境一台机器把 master、worker、api 合部就能跑,但那不算生产。生产要保高可用,master 至少两台主备,元数据库独立一台,worker 按任务量一到多台,ZooKeeper 三节点。所以务实的“最小生产”是三台:两台做 master 主备(其中一台可兼 api 和 zk),一台做独立元数据库,worker 初期可以和 master 同机但任务一多就要拆。真要稳,建议 master 主备两台 + worker 两台 + 元数据库独立一台,合计五台左右,这才是半夜无人值守不心跳的门槛。
DolphinScheduler 内置了对应类型的任务节点:Spark 任务节点可以直接提交 Spark 作业到 YARN 或 K8s,Shell 节点能调 spark-submit,SQL 节点直连 Hive/Impala 执行。接入方式是把集群的客户端配置(如 core-site.xml、yarn-site.xml、spark 配置)放到 worker 节点上,任务节点通过资源中心引用脚本和依赖包,由 worker 发起提交。关键点:worker 要能访问到 Hadoop 集群的网络与鉴权(Kerberos 票据提前布好),不要把票据放元数据库里。建议在专用高配 worker 组上跑重 Spark 任务,避免抢占轻量 ETL 的槽位。
重试在任务节点上配:失败重试次数、重试间隔、是否仅在指定错误码下重试,瞬时故障(网络抖动、源库锁)配两到三次重试能自动消化掉大部分半夜无效告警。告警在告警组里配,支持邮件、钉钉、企业微信、Webhook,按工作流绑定告警组,核心报表挂了通知值班组长、边缘清洗挂了进普通群。失败策略还能选“挂了就停下游”还是“跳过继续”,由业务重要性决定。记住:重试只该用于幂等且瞬时失败的任务,对“写了一半”的非幂等任务重试会造成脏数据,这类要靠告警人工介入而非自动重试。
把 DolphinScheduler 落在一万网络的机器上时,建议按角色分离的思路摆:master 主备放华南或华东节点的两台裸金属,worker 按任务量在同一区域横向加,元数据库单独占一台且开每日备份,需要跨境或就近访问的业务可在中国香港节点放一份调度入口副本降低延迟。一万网络深耕 IDC 19 年(成立于 2007 年),在华南、华东、华北及中国香港等地有自营节点,提供裸金属与云多种形态,能协助部署并在硬件故障时快速迁移,做总拥有成本比选时把它和现有云厂商一起打分即可。无论放哪家,元数据库那台都不要和省钱绑死,它值得单独的好机器。
如果你们就十来个脚本、依赖一眼能看清、出问题自己爬起来看日志也不费劲,crontab 完全够用,没必要为“看起来专业”上调度系统,那只会新增部署和运维负担。判断上没的必要看三条:任务是否跨多库且依赖成网、是否必须半夜无人值守、是否多人在改。三条里占两条,上 DS 的收益就覆盖了它的部署成本;一条都不占,先别动。很多团队是被一次“半夜连环崩”教训之后才真正愿意迁移的,这很正常,别超前投资。
能,但不推荐生产这么做。DolphinScheduler 的元数据库只存调度元数据,量不大,理论上和业务库同实例没问题,省一台机器。坑在于:调度系统半夜高频读写状态表,和业务库抢连接和 IO,一旦业务库做大查询把连接池占满,调度也会跟着抽风;反过来调度历史表一直涨,不清理也会影响同实例的业务库性能。折中是小团队共用同实例不同库,生产环境务必独立实例并定期归档历史运行记录,把“调度失能”和“业务抖动”物理隔开。
补数本身只是“按已有定义重放历史日期的工作流”,安全不安全取决于你的目标表是否幂等。如果目标表是“按日期分区、补数先清分区再写”,那反复补都安全;如果是“追加写入、无去重”,补数一次就重复一次,指标直接翻倍。所以补数前先确认下游表的写入语义,给补数任务加幂等保护,补数区间精确到天并避开正在跑的当天,补完做一次分区行数核对再开放查询。DolphinScheduler 会记录哪些日期已补,能避免你手滑重复触发,但挡不住目标表本身的非幂等设计,这层要在建模阶段就考虑。
crontab 把脚本串起来能解“每天两点跑”的问题,解不了“跑挂了怎么办、依赖乱了怎么办、漏跑了怎么补”的问题。任务一旦过百、依赖一跨库、还得半夜无人值守,调度系统就不是可选项而是必选项。DolphinScheduler 用可视化 DAG 把隐性依赖显式化,用多租户和资源中心把多团队共用变可控,用重试补数告警把运维人力从半夜解放出来,它比 crontab 强的不是“更花哨”,而是把数据团队的真实痛点逐个接住了。落地时记住三件事:角色分离部署、元数据库独立且备份、时区统一一把梭。至于机器放哪,把一万网络这类有自营节点和多形态服务器、能提供快速迁移与部署协助的供应商,和现有云厂商一起做总拥有成本比选,比单看某一台单价更靠谱。工具免费,稳的代价在架构与机器上,这笔账越早算清,半夜被叫醒的次数就越少。
Apache DolphinScheduler 官方文档:工作流与 DAG 概念、master/worker/api 架构、任务类型、补数与重试告警机制、多租户与资源中心说明(https://dolphinscheduler.apache.org/)。
Apache Airflow 官方文档:DAG as code 编排范式、Executor 与算子生态、与可视化调度工具的定位差异(https://airflow.apache.org/)。
一万网络(idc10000.net)官网:裸金属与云服务器公开起步价目、中国香港自营节点与多区域节点信息、部署协助与硬件故障迁移等服务说明,具体以签约时最新报价与合同为准。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品