Dolphin调度系统入门指南从零开始创建你的第一个自动化工作流如果你刚接触数据调度领域面对五花八门的任务依赖、定时触发和失败重试可能会感到无从下手。Dolphin调度系统正是为了解决这些痛点而生的它提供了一个直观、强大的可视化界面让你能像搭积木一样编排复杂的数据处理流程。这篇文章我将以一个数据工程师的视角带你从零开始一步步构建你的第一个自动化工作流。我们不会停留在简单的按钮点击而是深入到每个配置项背后的逻辑让你不仅“知其然”更“知其所以然”。1. 环境准备与初识Dolphin在开始构建工作流之前我们需要确保有一个可以操作的Dolphin环境。通常你可以通过公司内部部署的访问地址进入或者使用官方提供的Docker镜像在本地快速搭建一个测试环境。登录系统后你首先看到的会是项目概览页这里展示了所有工作流的状态统计、近期任务执行情况等关键信息。提示对于本地测试强烈建议使用Docker Compose方式部署这能避免因环境差异导致的依赖问题。官方仓库通常提供了完整的docker-compose.yml文件。Dolphin的核心概念围绕几个关键对象展开理解它们对后续操作至关重要项目 (Project) 这是最高层级的组织单元通常对应一个具体的业务线或数据域例如“用户画像分析项目”或“订单ETL项目”。所有的工作流都在某个项目下创建。工作流定义 (Workflow Definition) 这是我们即将创建的核心蓝图。它定义了一系列任务的执行顺序、依赖关系和参数传递逻辑。你可以把它想象成一个有向无环图DAG的设计稿。工作流实例 (Workflow Instance) 当工作流定义被手动或定时触发一次运行时就会生成一个实例。实例会记录本次运行的具体状态、开始结束时间和详细的日志。任务定义 (Task Definition) 工作流中的每一个具体执行单元比如一个Shell脚本、一个SQL查询或一个数据同步任务。资源 (Resource) 指上传到Dolphin服务器的文件如JAR包、Python脚本、配置文件等任务可以引用这些资源。为了让你对系统能力有个整体印象这里简单对比一下Dolphin中几种常见的任务类型任务类型主要用途适用场景举例Shell执行操作系统命令或脚本调用外部程序、文件处理、简单控制逻辑SQL执行数据库查询或DML操作数据清洗、报表计算、数据质量校验Sub-Process嵌套执行另一个工作流模块化设计复用复杂流程HTTP调用外部HTTP API触发微服务、获取外部数据、发送通知Spark提交Spark应用大规模数据批处理、机器学习任务初次使用建议你先在界面上四处点击熟悉各个菜单的位置特别是“项目管理”、“工作流定义”和“任务实例”这几个核心模块。2. 创建你的第一个工作流定义一切从创建一个项目开始。在Dolphin的顶部导航栏找到“项目管理”点击进入后你会看到一个“创建项目”的按钮。项目名称需要具有唯一性且易于识别例如first_dolphin_project。描述部分可以详细填写这个项目的目的方便日后协作。创建好项目后进入该项目我们的主战场——“工作流定义”页面就出现了。点击“创建工作流”按钮系统会跳转到一个全新的画布界面。这个可视化拖拽画布是Dolphin的灵魂所在左侧是任务类型列表中间是绘图区右侧是选中任务的属性配置面板。让我们来构建一个简单的数据预处理流程。假设我们需要每天凌晨执行以下步骤从源数据库导出前一天的日志数据。对导出的数据进行清洗和格式化。将清洗后的数据加载到目标分析表中。对应到Dolphin中我们需要创建三个任务并设置它们的依赖关系。首先从左侧拖拽一个Shell任务到画布中它代表第一步“数据导出”。松开鼠标后画布上会出现一个节点双击它或点击右侧的“编辑”按钮进入任务详情配置。任务配置是重中之重我们以这个Shell任务为例详细拆解节点名称 起一个见名知意的名字如01_export_log_data。描述 简要说明任务功能如“使用mysqldump命令导出前一日日志表”。运行标志 默认为“正常”。如果暂时不想让这个任务执行可以设置为“禁止执行”这在调试时很有用。任务优先级 当多个任务实例等待执行时调度器会根据优先级分配资源。通常保持默认即可。Worker分组 如果你的Dolphin集群有多个Worker节点并分了组如“上海机房”、“北京机房”可以指定任务在特定分组的机器上运行。默认会随机分配。环境名称 用于配置任务运行时的环境变量如Java路径、Python路径等需要在“环境管理”中预先配置。失败重试次数 设置为3意味着如果任务执行失败系统会自动重试最多3次。失败重试间隔分钟 每次重试之间的等待时间例如设为5分钟。超时告警 勾选后可以设置“超时时长”如30分钟和“超时策略”警告或失败这对于监控长时任务非常必要。脚本 这里是核心。我们编写实际的Shell命令。#!/bin/bash # 定义日期变量默认获取前一天的日期 export_date$(date -d -1 day %Y%m%d) # 使用mysqldump导出数据这里仅为示例实际参数需替换 mysqldump -h [源数据库地址] -u [用户名] -p[密码] [数据库名] [日志表名] --wheredate${export_date} /data/export/log_${export_date}.sql # 检查上一条命令是否执行成功 if [ $? -eq 0 ]; then echo 数据导出成功文件/data/export/log_${export_date}.sql else echo 数据导出失败 exit 1 # 非0退出码会让Dolphin判定任务失败 fi注意在脚本中直接写密码是极不安全的做法。生产环境中应使用Dolphin的“资源中心”上传加密的配置文件或在“环境管理”中设置密文变量脚本中通过变量名引用。配置完成后点击“确认”保存这个任务。用同样的方法再拖拽两个Shell任务节点到画布分别命名为02_clean_data和03_load_to_warehouse并编写相应的清洗和加载脚本。3. 编排任务依赖与参数传递现在画布上有三个独立的节点我们需要定义它们的执行顺序。在Dolphin中依赖关系通过拖拽连接线来建立。点击01_export_log_data节点右下角的小圆点拖出一条线连接到02_clean_data节点的上边缘。这就建立了一个依赖只有01_export_log_data成功执行后02_clean_data才会开始运行。同理将02_clean_data连接到03_load_to_warehouse。你的画布现在应该呈现一个简单的线性流程。Dolphin支持更复杂的依赖比如并行 多个任务同时依赖于同一个父任务。汇聚 一个任务依赖于多个父任务所有父任务成功后才执行。条件分支 基于上游任务的输出状态决定下游执行哪条路径这通常需要结合后续版本更高级的功能或自定义逻辑。接下来解决一个实际问题下游任务如何知道上游任务导出的文件名这就需要用到参数传递。Dolphin提供了强大的参数上下文。我们可以在01_export_log_data任务的脚本最后输出一个特定的格式将关键信息注册为“本地参数”。修改01_export_log_data的脚本结尾... if [ $? -eq 0 ]; then echo 数据导出成功文件/data/export/log_${export_date}.sql # 将文件路径设置为一个输出参数供下游任务引用 echo {\export_file\: \/data/export/log_${export_date}.sql\} else echo 数据导出失败 exit 1 fi然后在02_clean_data任务的脚本中就可以通过Dolphin的内置变量来引用这个值。Dolphin会将上游任务的输出必须是标准的JSON格式解析下游任务可以通过${全局参数}或${上游任务名.局部参数}的方式引用。假设我们使用局部参数配置02_clean_data的脚本#!/bin/bash # 引用上游任务输出的文件路径 input_file${01_export_log_data.export_file} echo 开始清洗文件$input_file # 后续的清洗命令使用$input_file变量 # python clean_script.py $input_file这样数据就在任务间流动起来了。最后别忘了点击画布上方的“保存”按钮为整个工作流定义一个名字比如Daily_Log_ETL并添加描述。4. 上线、运行与监控保存好的工作流定义还只是一个“蓝图”需要“上线”后才能被调度执行。在工作流定义列表页找到你刚创建的Daily_Log_ETL点击操作栏中的“上线”按钮。上线后工作流的状态会变为“已上线”。现在我们可以手动触发一次运行来测试整个流程。点击“运行”按钮会弹出一个参数设置窗口。这里可以覆盖工作流定义中的全局参数或者为本次运行指定特定的业务日期比如补跑历史数据。对于第一次测试我们直接使用默认参数点击“确认”运行。运行后页面会自动跳转到“工作流实例”列表页。在这里你可以看到刚刚生成的实例。它的状态会经历“提交成功”、“正在运行”、“成功”或“失败”等变化。每个状态都有对应的图标表示例如齿轮代表正在执行绿色的对勾代表执行成功红色的叉号代表失败。点击实例名称可以进入DAG有向无环图视图。这个视图实时展示了各个任务的运行状态用不同的颜色高亮显示如蓝色-等待、黄色-运行、绿色-成功、红色-失败。你可以一目了然地看到任务执行到哪里卡在哪个环节。日志是排查问题的生命线。在DAG视图或任务实例列表中点击任意一个任务节点都会在下方或弹出框中显示该任务的详细执行日志。Dolphin的日志查看器功能比较完善实时滚动 对于长时间运行的任务日志会实时刷新。级别筛选 可以过滤只看错误ERROR或警告WARN级别的日志。全局搜索 在日志内容中搜索关键字。下载 可以将完整的日志文件下载到本地进行深度分析。例如如果02_clean_data任务失败了你通过查看日志发现是Python脚本缺少某个依赖库。修复问题后你可以在DAG视图上右键点击该失败任务选择“重跑”系统会仅从该任务开始重新执行其下游流程这比整个工作流重跑要高效得多。5. 配置定时调度与告警手动运行毕竟不是长久之计自动化调度的核心在于“定时”。回到“工作流定义”列表找到已上线的Daily_Log_ETL点击“定时”按钮进入调度配置界面。Dolphin的定时设置非常直观提供了两种方式Crontab表达式 对于熟悉Linux Crontab的用户可以直接输入表达式如0 2 * * *表示每天凌晨2点执行。可视化选择 通过点击选择年、月、周、日、时、分系统会自动生成对应的Crontab表达式对新手更友好。假设我们需要每天凌晨3点15分执行这个工作流可以设置为15 3 * * *。设置好起止时间如果不设置默认永久有效后点击“创建”即可。此时工作流定义后面会显示一个时钟图标表示已开启定时调度。注意定时调度生成的是“工作流实例”它依赖于工作流定义。如果你修改了已设置定时的“工作流定义”必须重新上线但通常不需要修改定时配置除非执行频率需要变化。告警是生产级流程不可或缺的一环。Dolphin支持多种告警方式确保任务失败时相关人员能及时知晓。在项目设置或工作流定义中可以配置“告警组”。告警组需要先在“监控中心”由管理员创建里面包含了需要接收告警的成员邮箱或钉钉、企业微信等Webhook地址。配置好告警组后你可以在工作流定义或每个具体任务中设置失败告警策略。通常我们会为整个工作流设置一个全局告警同时为其中特别关键的任务如最后的数据加载任务再单独设置一次实现双重保障。当任务失败且重试次数用尽后系统会自动向告警组发送通知内容包括失败的任务名、实例ID、失败时间以及关键的日志片段帮助运维人员快速定位问题。走到这一步你已经完成了一个具备生产雏形的自动化工作流从任务设计、依赖编排、参数传递到上线调度、运行监控和失败告警。这只是一个起点Dolphin还有更多高级特性等待探索比如使用“子工作流”模块化复杂流程、利用“条件分支”实现动态路径选择、通过“互补”功能实现周期区间数据处理等。最好的学习方式就是动手尝试为你手头的一个重复性数据任务构建一个Dolphin工作流你会立刻感受到自动化带来的效率提升。