1. DolphinScheduler核心架构解析
DolphinScheduler作为分布式易扩展的可视化DAG工作流任务调度系统,其架构设计充分考虑了高可用和扩展性需求。整个系统采用Master-Worker的分布式架构,核心组件包括:
- MasterServer:负责任务的调度和分发,采用分布式无中心设计,通过Zookeeper实现选主机制。实际生产环境中建议至少部署2个节点以保证高可用。
- WorkerServer:执行具体任务的节点,支持动态扩容。Worker会定期向Master发送心跳包(默认10秒一次),超时未响应(默认30秒)会被判定为宕机。
- AlertServer:告警服务模块,支持邮件、短信等多种通知方式。在2.0版本后支持自定义告警插件开发。
- API Server:提供RESTful接口服务,所有前端操作最终都通过API Server与后端交互。
- UI:基于Vue.js开发的可视化操作界面。
重要提示:在伪集群部署时,所有服务可以安装在同一台机器,但需要修改conf/worker.properties中的worker分组配置,避免任务分配冲突。
1.1 调度引擎实现原理
DolphinScheduler的调度核心采用时间轮算法,相比传统的quartz调度器具有更好的性能表现。其调度流程可分为三个阶段:
-
任务提交阶段:
java复制// 伪代码示例:任务提交核心逻辑 public void submitTask(TaskInstance task) { if (task.getTaskType() == TaskType.DEPENDENT) { checkDependencies(task); // 依赖检查 } taskQueue.add(task); // 加入任务队列 notifyMaster(); // 通知Master节点 } -
任务派发阶段:
MasterServer会定期(默认1秒)扫描任务队列,根据Worker的负载情况(CPU、内存使用率等)进行任务分发。2.0版本引入了弹性资源调度策略,可以根据任务优先级动态调整资源分配。 -
任务执行阶段:
Worker接收到任务后,会创建独立的线程执行。对于Shell任务,会通过ProcessBuilder启动子进程;对于Spark等大数据任务,则通过对应的客户端提交到集群。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高频面试题深度剖析
2.1 基础概念类问题
Q1:DolphinScheduler中的工作流和任务是什么关系?
典型回答应包含以下要点:
- 工作流是由多个任务组成的DAG(有向无环图)
- 任务是最小执行单元,支持Shell、SQL、Spark等20+类型
- 边表示任务间的依赖关系
- 工作流实例是工作流的一次具体执行
Q2:如何保证任务不重复执行?
需要从多个维度说明:
- 数据库层面:使用唯一索引(工作流定义ID+版本号)
- 服务层面:MasterServer使用分布式锁(基于Zookeeper)
- 状态检查:任务开始前会校验当前状态是否为"待运行"
2.2 架构设计类问题
Q3:MasterServer宕机如何处理?
这是考察高可用机制的典型问题,回答要点:
- Zookeeper的Watch机制会检测节点存活状态
- 剩余Master节点会重新选举Leader
- 正在调度的任务会短暂暂停(通常不超过10秒)
- Worker会缓存任务状态,待Master恢复后上报
Q4:Worker负载均衡如何实现?
建议结合源码分析:
java复制// Worker选择策略核心代码片段
public Worker selectWorker(TaskInstance task) {
List<Worker> activeWorkers = getActiveWorkers();
if (task.getWorkerGroup() != null) {
activeWorkers = filterByGroup(activeWorkers, task.getWorkerGroup());
}
return loadBalanceStrategy.select(activeWorkers);
}
实际策略包括:
- 随机选择(默认)
- 轮询选择
- 基于CPU/内存的加权选择
2.3 运维实战类问题
Q5:如何排查任务长时间卡在"提交中"状态?
需要展示系统化的排查思路:
- 检查Master日志:
tail -f logs/master-server.log - 确认Zookeeper连接状态
- 检查Worker资源是否充足(内存、线程数)
- 查看数据库
t_ds_command表是否有堆积 - 网络连通性测试(Master到Worker的IP+端口)
Q6:如何实现跨项目依赖调度?
这是高级使用场景,解决方案包括:
- 使用HTTP任务调用目标项目的API
- 通过事件触发机制(2.0+版本支持)
- 在数据库层面关联
t_ds_process_definition表 - 自定义插件实现跨项目回调
3. 生产环境优化经验
3.1 性能调优参数
关键配置项及推荐值:
| 参数文件 | 配置项 | 默认值 | 生产建议 | 说明 |
|---|---|---|---|---|
| master.properties | master.exec.threads | 100 | CPU核心数*2 | 调度线程数 |
| worker.properties | worker.exec.threads | 100 | 根据任务类型调整 | 执行线程数 |
| common.properties | data.basedir.path | /tmp/dolphinscheduler | 独立SSD磁盘 | 数据存储路径 |
| zookeeper.properties | zookeeper.session.timeout | 60000 | 30000 | 超时时间(ms) |
3.2 常见故障处理手册
问题1:任务状态不同步
- 现象:UI显示运行中,但实际已结束
- 解决方案:
- 检查Worker与Master时钟是否同步
- 验证ZK节点
/nodes/worker是否正常 - 手动修复数据库
t_ds_task_instance表状态
问题2:工作流无法停止
- 快速处理步骤:
sql复制UPDATE t_ds_process_instance SET state='STOP' WHERE id=流程实例ID; UPDATE t_ds_task_instance SET state='KILL' WHERE process_instance_id=流程实例ID;
3.3 安全加固方案
-
认证授权:
- 启用LDAP集成(配置
security.authentication.type=LDAP) - 细粒度权限控制(项目-用户-资源三级授权)
- 启用LDAP集成(配置
-
通信安全:
yaml复制# 在common.properties中配置 server.ssl.enabled=true server.ssl.key-store=conf/keystore.jks server.ssl.key-store-password=yourpassword -
审计日志:
- 开启操作日志(
audit.enable=true) - 定期归档
t_ds_audit_log表
- 开启操作日志(
4. 二次开发指南
4.1 自定义任务类型开发
标准开发流程:
- 继承
org.apache.dolphinscheduler.server.worker.task.AbstractTask - 实现核心方法:
java复制public class CustomTask extends AbstractTask { @Override public void handle() throws Exception { // 业务逻辑实现 logger.info("Start processing custom task..."); exitStatusCode = process(); } private int process() { // 实际任务处理 return ExitStatus.SUCCESS.getCode(); } } - 注册任务插件:
- 在
plugin.properties中添加task.custom.type=CustomTask - 打包时包含到
lib/plugin/task目录
- 在
4.2 API扩展实践
典型场景:通过API动态创建工作流
python复制import requests
def create_workflow(project_name, workflow_json):
auth_token = login() # 获取认证token
headers = {'token': auth_token}
# 创建流程定义
resp = requests.post(
'http://ds-server:12345/dolphinscheduler/projects/{project_name}/process-definition',
json=workflow_json,
headers=headers
)
if resp.status_code == 201:
return resp.json()['data']
else:
raise Exception(f"Create failed: {resp.text}")
# 示例工作流JSON结构
demo_workflow = {
"name": "daily_etl",
"description": "每日数据清洗任务",
"globalParams": {},
"tasks": [
{
"type": "SHELL",
"name": "step1",
"params": {"rawScript": "echo 'Hello World'"}
}
]
}
4.3 监控集成方案
Prometheus监控配置示例:
yaml复制# master/worker的metrics配置
server.metrics.enabled=true
server.metrics.prometheus.enabled=true
server.metrics.prometheus.port=9091
# Grafana看板关键指标
- Master_Active_Threads
- Worker_Running_Tasks
- Zookeeper_Connection_State
- Task_Queue_Size
我在实际企业级部署中发现,合理设置Worker的worker.heartbeat.interval(默认10秒)对大规模集群稳定性至关重要。当Worker节点超过500个时,建议调整为30秒并配合ZK调优,可显著降低Master的负载压力。
