
1. 环境准备从零搭建DolphinScheduler的基石第一次部署DolphinScheduler就像盖房子地基打不好后面全是坑。我见过太多人卡在环境配置这一步折腾半天才发现是JDK版本不对或者数据库没初始化。咱们先搞定这些基础依赖后面才能顺风顺水。JDK安装这个老生常谈的问题其实藏着不少细节。官方要求JDK 1.8但实测OpenJDK 11会有奇怪的兼容性问题。建议直接用Oracle JDK 1.8.0_301这个版本我在三个生产环境验证过最稳定。安装后别忘配置JAVA_HOME有个偷懒但有效的方法echo export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 ~/.bashrc source ~/.bashrc数据库选择上MySQL 5.7和PostgreSQL 9.6都可以但MySQL有个大坑——8.0版本默认的caching_sha2_password认证方式会导致连接失败。解决方法要么降级到5.7要么在MySQL 8.0里新建用户时显式指定认证方式CREATE USER ds_user% IDENTIFIED WITH mysql_native_password BY yourpassword;2. 伪集群部署单机模拟分布式环境的艺术很多新手觉得伪集群部署就是个玩具模式其实它能暴露90%的真实集群问题。我去年给某电商公司做POC时就是在伪集群环境下发现了ZooKeeper连接池泄露的严重问题。SSH免密配置这个经典环节90%的失败案例都是因为sudoers文件没改。除了官方文档说的注释Defaults requiretty还要特别注意权限问题。正确的操作流程应该是# 1. 生成密钥时不要用默认路径 ssh-keygen -t rsa -P -f ~/.ssh/ds_key # 2. 拷贝公钥时要指定端口如果是非标准端口 ssh-copy-id -i ~/.ssh/ds_key.pub -p 2222 dolphinschedulerlocalhost # 3. 测试连接必须带-i参数 ssh -i ~/.ssh/ds_key dolphinschedulerlocalhost资源目录准备经常被忽略。我建议单独创建/data/dolphinscheduler目录结构如下/data/dolphinscheduler ├── exec # 执行日志 ├── logs # 系统日志 └── res # 资源文件然后给这个目录设置777权限生产环境不建议但测试环境省事mkdir -p /data/dolphinscheduler/{exec,logs,res} chmod -R 777 /data/dolphinscheduler3. 服务启动那些藏在日志里的秘密服务起不来是最让人抓狂的但DolphinScheduler的日志体系其实设计得很完善。关键是要知道去哪找线索——不是所有错误都会打印在控制台。端口冲突排查有个骚操作在启动脚本里加个预检查。编辑bin/startup.sh在开头插入# 检查常用端口是否被占用 for port in 12345 5678 9999; do if netstat -tln | grep -q :$port; then echo [ERROR] 端口 $port 已被占用请修改conf/application.properties exit 1 fi done数据库连接失败时先别急着改配置用这个命令测试连通性mysql -h数据库IP -u用户名 -p密码 -e SELECT 1 ds_db /dev/null 21 || echo 连接失败如果报错Public Key Retrieval is not allowed需要在jdbc连接串后加参数jdbc:mysql://localhost:3306/ds_db?allowPublicKeyRetrievaltrueuseSSLfalse4. 版本升级从1.3到3.x的血泪史去年我们团队升级3.1.4版本时花了整整两周处理兼容性问题。最大的教训就是千万别跨大版本升级分步升级路径必须严格遵守1.3.x → 2.0.5最后一个2.0稳定版2.0.5 → 3.0.3注意要先升级元数据库3.0.3 → 3.1.9当前最稳定版本元数据库升级最容易出问题。建议先用mysqldump完整备份然后执行官方提供的升级脚本时加上-v参数看详细执行过程mysql -u root -p ds_db sql/upgrade/2.0.5_schema/mysql/dolphinscheduler_ddl.sql -v如果遇到Unknown column flag in field list这种错误说明跳过了中间版本只能回退重来。5. 资源管理文件存储的十八般武艺用MinIO替代HDFS是最近的新趋势但配置起来坑不少。有次客户反映任务一直报文件不存在最后发现是common.properties里少了个斜杠# 错误配置 resource.storage.typeMINIO resource.storage.upload.base.pathdolphinscheduler # 正确配置注意路径后的/ resource.storage.upload.base.pathdolphinscheduler/S3协议兼容性问题更隐蔽。AWS S3和MinIO的签名算法版本不同需要在common.properties里显式指定# 对于MinIO resource.storage.s3a.aws.credentials.providerorg.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider # 对于AWS S3 resource.storage.s3a.aws.credentials.providercom.amazonaws.auth.InstanceProfileCredentialsProvider6. 排错指南从日志到解决方案的快速通道DolphinScheduler的日志分散在多个地方我整理了个快速定位表问题类型日志路径关键字段服务启动失败logs/dolphinscheduler-server.logERROR, Exception任务执行失败logs/dolphinscheduler-worker.logtask instance id数据库连接问题logs/dolphinscheduler-alert.logConnection refusedZK连接异常logs/dolphinscheduler-api.logSession expired内存溢出是另一个高频问题特别是在处理大工作流时。修改bin/env/dolphinscheduler_env.sh时建议这样配置export SERVER_JAVA_OPTS-Xmx4g -Xms4g -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/data/dolphinscheduler/logs/dump.hprof遇到OOM时用MAT工具分析dump文件经常能发现是工作流定义缓存没清理导致的。7. 性能调优让调度引擎飞起来的秘诀生产环境部署后随着任务量增长会出现各种性能瓶颈。根据我们压测3.1.9版本的经验这几个参数最关键# master.properties master.exec.threads100 # 默认50不够用 master.exec.task.num20 # 单次处理任务数 # worker.properties worker.exec.threads50 # 根据CPU核数调整 worker.heartbeat.interval10 # 心跳间隔(秒)数据库连接池配置不当会导致任务堆积。在conf/application-dao.properties里调整spring.datasource.druid.initial-size5 spring.datasource.druid.max-active50 spring.datasource.druid.validation-querySELECT 1有个客户遇到过任务延迟问题最后发现是没配置ZooKeeper的watch机制# zookeeper.properties zookeeper.session.timeout60000 zookeeper.connection.timeout30000 zookeeper.watcher.enabledtrue8. 安全加固从入门到生产级防护测试环境可以随便玩但上生产必须做好安全措施。我们给金融客户部署时这套组合拳最有效第一招加密敏感参数在conf/application.properties启用加密security.authentication.typePASSWORD security.encrypt.password你的加密密钥然后用bin/tools.sh加密数据库密码sh bin/tools.sh crypto -e 明文密码第二招API访问控制修改conf/application-api.propertiessecurity.authentication.enabletrue security.authentication.identity你的认证标识 security.authentication.secret你的密钥第三招网络隔离Master/Worker分开部署数据库单独安全组只开放必要的12345和5678端口最后提醒一定要定期备份元数据库我们遇到过硬盘损坏导致所有工作流定义丢失的惨剧。建议用crontab设置每天自动备份0 2 * * * mysqldump -h数据库IP -u用户名 -p密码 ds_db /backup/ds_db_$(date %F).sql