1. 为什么需要离线开发平台?
在数据密集型项目的开发过程中,我们经常遇到这样的困境:生产环境网络隔离严格,无法直接连接外网;测试环境资源有限,多人协作时相互干扰;本地开发环境与线上环境差异导致"在我机器上能跑"的经典问题。这些痛点催生了离线开发平台的诞生。
以我最近参与的某银行数据仓库项目为例,由于安全合规要求,所有开发工作必须在完全离线的环境中进行。传统开发模式下,我们需要手动下载各种依赖包、配置代理、处理环境差异,平均每个新成员的环境搭建就要耗费2-3天。而采用离线开发平台后,这个时间缩短到了30分钟以内。
2. DolphinScheduler离线部署实战
2.1 准备工作:获取安装包
首先需要获取DolphinScheduler的离线安装包。访问Apache官网(https://dolphinscheduler.apache.org/)下载最新稳定版的"Standalone"部署包。这里有个经验之谈:虽然二进制包(.tar.gz)和Docker镜像都可以离线使用,但在完全离线的环境中,二进制包更可靠,因为它不依赖Docker守护进程。
下载完成后,通过安全U盘或内部文件服务器将安装包传输到目标机器。我建议同时下载MySQL JDBC驱动(如mysql-connector-java-8.0.xx.jar),因为后续数据库配置会用到。
2.2 系统环境检查
在解压安装包前,需要确保目标机器满足以下条件:
- 操作系统:CentOS 7+或Ubuntu 18.04+
- Java:JDK 1.8+(建议OpenJDK)
- 内存:≥4GB(Standalone模式)
- 磁盘空间:≥10GB
验证Java环境:
bash复制java -version
如果未安装Java,需要先离线安装。可以从官网下载对应版本的JDK压缩包,解压后配置环境变量:
bash复制export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH
2.3 解压与基础配置
将安装包解压到目标目录:
bash复制tar -zxvf apache-dolphinscheduler-3.2.0-bin.tar.gz -C /opt
cd /opt/apache-dolphinscheduler-3.2.0-bin
修改conf/application.yaml配置文件中的关键参数:
yaml复制server:
port: 12345 # 服务端口
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8
username: ds_user
password: ds_password
注意:如果使用内置的H2数据库(Standalone模式默认),可以跳过数据库配置,但生产环境强烈建议使用MySQL。
2.4 初始化数据库(MySQL方案)
对于生产环境,建议使用MySQL作为元数据库。在已安装MySQL的机器上执行:
sql复制CREATE DATABASE dolphinscheduler DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'ds_user'@'%' IDENTIFIED BY 'ds_password';
GRANT ALL PRIVILEGES ON dolphinscheduler.* TO 'ds_user'@'%';
FLUSH PRIVILEGES;
然后执行初始化脚本:
bash复制mysql -uds_user -pds_password dolphinscheduler < script/sql/dolphinscheduler_mysql.sql
2.5 启动与验证
执行启动脚本:
bash复制bash bin/dolphinscheduler-daemon.sh start standalone-server
启动成功后,访问http://<服务器IP>:12345/dolphinscheduler,使用默认账号admin/dolphinscheduler123登录。
3. 核心功能演示
3.1 项目管理
登录后首先创建项目。点击"项目管理"→"创建项目",填写项目名称和描述。这里有个实用技巧:可以为不同团队或业务线创建独立项目,实现资源隔离。
3.2 工作流定义
进入项目后,点击"工作流定义"→"创建工作流"。以一个典型的数据处理流程为例:
- 拖拽"Shell"节点到画布,配置以下命令:
bash复制#!/bin/bash
echo "Start processing data..."
# 模拟数据处理
sleep 5
echo "Data processed at $(date)" > /tmp/data_process.log
- 添加"SQL"节点,配置MySQL连接信息和执行脚本:
sql复制-- 创建结果表
CREATE TABLE IF NOT EXISTS process_results (
id INT AUTO_INCREMENT PRIMARY KEY,
process_time DATETIME,
status VARCHAR(20)
);
-- 记录处理状态
INSERT INTO process_results (process_time, status)
VALUES (NOW(), 'SUCCESS');
- 连接两个节点形成工作流,保存并上线。
3.3 定时调度
点击"定时"按钮,可以设置调度策略。例如:
- 类型:CRON
- 表达式:0 0 2 * * ? # 每天凌晨2点执行
- 失效策略:结束
- 优先级:中
3.4 全局变量使用
DolphinScheduler支持强大的全局变量功能。在"项目管理"→"全局变量"中添加变量:
- 变量名:process_date
- 变量值:$
在Shell节点中引用:
bash复制#!/bin/bash
echo "Processing date is ${process_date}"
对于需要获取昨天或今天日期的场景,可以使用内置变量:
- ${system.biz.date}: yyyyMMdd格式的当天日期
- ${system.biz.curdate}: yyyy-MM-dd格式的当天日期
- ${system.biz.date.yyyyMMdd}: 同system.biz.date
4. 常见问题排查
4.1 任务实例host为空报错
这是Standalone模式下常见的问题,通常有以下几种原因和解决方案:
- Worker未启动:
bash复制# 检查worker状态
bash bin/dolphinscheduler-daemon.sh status standalone-server
# 如果worker未运行,手动启动
bash bin/dolphinscheduler-daemon.sh start standalone-server
- 网络配置问题:
检查conf/worker.properties中的配置:
properties复制worker.groups=default
worker.heartbeat.interval=10
worker.max.cpuload.avg=100
worker.reserved.memory=0.3
- 资源不足:
Standalone模式至少需要4GB内存。可以通过以下命令检查资源:
bash复制free -h
df -h
4.2 任务依赖问题
当工作流中多个任务存在依赖关系时,可能会遇到执行顺序不符合预期的情况。建议:
- 明确设置任务依赖:在界面中拖动任务间的连线
- 检查任务状态:确保前置任务状态为"成功"
- 查看日志:点击任务实例→"查看日志",定位具体错误
4.3 时间变量不生效
使用时间变量时,需要注意:
- 变量作用域:全局变量需要在项目设置中定义
- 变量格式:${var}而不是$var
- 调度时间与变量值的关系:system.biz.date取的是调度时间,不是执行时间
5. 高级技巧与优化
5.1 资源隔离配置
虽然Standalone模式资源有限,但仍可以通过以下方式优化:
- 限制并行任务数:
修改conf/standalone-server.properties:
properties复制standalone.server.max.running.tasks=10
- 设置任务资源限制:
在工作流定义中,可以设置任务的CPU和内存限制。
5.2 自定义告警
DolphinScheduler支持多种告警方式。配置conf/alert.properties:
properties复制# 邮件告警示例
alert.type=email
mail.protocol=smtp
mail.server.host=smtp.example.com
mail.server.port=25
mail.sender=sender@example.com
mail.user=sender@example.com
mail.passwd=password
mail.smtp.starttls.enable=true
mail.smtp.ssl.trust=*
5.3 备份与恢复
定期备份以下内容:
- 元数据库:使用mysqldump备份dolphinscheduler库
- 资源文件:备份resource目录
- 工作流定义:使用"导出"功能备份工作流JSON
恢复时,先还原数据库,再导入工作流定义,最后恢复资源文件。
6. 离线环境下的依赖管理
在完全离线的环境中,管理Python/Java依赖是个挑战。我的经验是:
- 创建本地Maven仓库:
bash复制mkdir -p /opt/local_repo
- 在有网环境下载所有依赖:
bash复制mvn dependency:go-offline -Dmaven.repo.local=/opt/local_repo
-
将整个仓库打包转移到离线环境
-
配置DolphinScheduler使用本地仓库:
修改conf/common.properties:
properties复制resource.storage.type=HDFS
resource.storage.upload.base.path=/dolphinscheduler
resource.hdfs.fs.defaultFS=hdfs://namenode:8020
对于Python依赖,可以创建离线的wheelhouse:
bash复制pip download -r requirements.txt --dest /opt/python_deps
然后在任务中通过以下方式引用:
bash复制#!/bin/bash
export PYTHONPATH=/opt/python_deps
python your_script.py
经过多个离线项目的实践验证,这套方案能够稳定支持数据开发团队的日常协作需求。特别是在金融、政务等对网络安全要求严格的领域,离线开发平台已经成为不可或缺的基础设施。
