本文介绍如何利用 Dolphinscheduler(海豚调度)与 SeaTunnel 实现异构数据源之间的高效数据同步功能,再通过 Apache Superset 进行深入的数据分析和可视化展示。
Dolphinscheduler 是一个分布式易扩展的工作流调度系统,用于管理和自动化任务流程。SeaTunnel 作为一个数据集成平台,其核心功能是依托丰富的连接器进行数据同步,使得不同来源的数据能够被有效地整合和处理。Superset 是一个开源的现代数据分析与 BI Web平台,它提供了直观的界面来探索、分析。
环境准备工作:
Java version: 1.8.0_432
Apache Maven 3.6.3
Docker version 24.0.7
docker-compose version 1.29.2
文章目录
一、Dolphinscheduler Docker Compose 部署
官方提供了3种部署方式,轻量化快速部署选择 docker compose 的原因是,直接使用官方 docker 镜像的话无法使用户数据持久化,该镜像默认使用 h2 内存数据库,每次更新配置重启 docker 数据会丢失。使用 docker compose 就能用 postgresql (要记得在 docker-compose.yml 修改自己的账号密码)。
部署步骤
下载地址:https://dolphinscheduler.apache.org/en-us/download/3.2.0
参考地址:https://dolphinscheduler.apache.org/zh-cn/docs/3.2.0/guide/start/docker
$ DOLPHINSCHEDULER_VERSION=3.2.0
$ tar -zxf apache-dolphinscheduler-"${DOLPHINSCHEDULER_VERSION}"-src.tar.gz
# Going to docker-compose's location
# For Mac or Linux users
$ cd apache-dolphinscheduler-"${DOLPHINSCHEDULER_VERSION}"-src/deploy/docker
# For Windows users, you should run command `cd apache-dolphinscheduler-"${DOLPHINSCHEDULER_VERSION}"-src\deploy\docker`
## 进入网站:https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/
## 下载对应版本的jar包:https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar
## 将下载下来的驱动放到:/opt/dolphinscheduler/libs/api-server 和 /opt/dolphinscheduler/libs/worker-server
# Initialize the database, use profile schema
$ docker-compose --profile schema up -d
# start all dolphinscheduler server, use profile all
$ docker-compose --profile all up -d
至此,docker ps 可以看到有6个容器被创建。浏览器访问http://localhost:12345/dolphinscheduler/ui ,初始账号密码: admin/dolphinscheduler123 (登陆后可修改)
二、Seatuennl 部署
官网教程分为本地模式和集群模式,选择本地模式部署比较快,因此使用下载到本地的二进制压缩包的方式部署。基本原理:
1)程序解析应用配置,并创建环境。
2)配置里source{},transform{},sink{} 三个块中的插件最终在程序中以List集合的方式存在。
3)由 Excution 对象来拼接各个插件,这涉及到选择 source_table,注册 result_table 等流程,注册 udf 等流程。并最终触发执行。
部署步骤
下载地址:https://seatunnel.apache.org/download/
参考地址:https://seatunnel.incubator.apache.org/docs/2.3.8/start-v2/locally/deployment
- 解压
export version="2.3.8"
tar -xzvf "apache-seatunnel-${version}-bin.tar.gz"
- 配置环境变量
vim /etc/profile
export SEATUNNEL_HOME=/data/seatunnel/backend/apache-seatunnel-2.3.8
export PATH=$SEATUNNEL_HOME/bin:$PATH
source /etc/profile
- 修改 maven 镜像源
## /.mvn/wrapper/maven-wrapper.properties
## 在配置文件中修改成阿里云镜像
distributionUrl=https://maven.aliyun.com/repository/public/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
wrapperUrl=https://maven.aliyun.com/repository/public/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
- 修改下载连接器的脚本,选择要下载的连接器,无用的可以注释掉。可以将 ${SEATUNNEL_HOME}/mvnw 替换为 mvn,可以使用本地mvn。
## 备份文件
cp install-plugin.sh install-plugin.sh.bak
## 下载连接器的 jar 包
sh install-plugin.sh
- 在config/目录中有一个seatunnel-env.sh脚本,可以查机器上环境变量有没有 flink 或者 spark 引擎,没有就直接使用 seatunnel 引擎。start-seatunnel-flink.sh 是用来提交 flink 任务的。start-seatunnel-spark.sh 是用来提交 Spark 任务的。用 seatunnel.sh 测试 v2.batch.config.template 中的脚本,判断服务是否运行。
cd "apache-seatunnel-${version}"
./bin/seatunnel.sh --config ./config/v2.batch.config.template -m local
至此,就跑完了一个官方案例。如果所连接的数据源失败,要具体查看 /connectors 和 /lib 中是否已有该数据源的 jar 包,一般需要额外下载 mysql-connector-java-8.0.20.jar。
从 SeaTunnel 的 app 配置文件开始,一个完整的 SeaTunnel 配置文件应包含四个配置组件。分别是:
env {}
source{}
transform {}
sink {}
在 Source 和 Sink 数据同构时,如果业务上也不需要对数据进行转换,那么 transform 中的内容可以为空。具体需根据业务情况来定。
三、Dolphinscheduler 与 Seatunnel 的集成
Dolphinscheduler 是自带 seatunnel 任务节点模块的,可以在 [工作流定义] 定义一个 seatunnel 工作流测试运行,在 [任务实例] 中查看日志,发现任务是会被分配到 master 或某个 worker 节点上执行的。因此,需要保证在这些节点有 Seatunnel 环境。
因为我的 seatunnel 和 Dolphinscheduler 是部署在同一台宿主机上的,基于seatunnel 的基本原理,我可以直接挂载 seatunnel 到 Dolphinscheduler 上提供服务。
步骤
- 在 dolphinscheduler-src/deploy/docker/docker-compose.yml 中的 dolphinscheduler-api、dolphinscheduler-master、dolphinscheduler-worker,将宿主机的 /data/seatunnel/backend/apache-seatunnel-2.3.8 挂载到容器的 /opt/seatunnel,使容器的环境变量可以找到 seatunnel/bin 下的 seatunnel.sh
dolphinscheduler-worker:
image: ${HUB}/dolphinscheduler-worker:${TAG}
profiles: ["all"]
env_file: .env
healthcheck:
test: [ "CMD", "curl", "http://localhost:1235/actuator/health" ]
interval: 30s
timeout: 5s
retries: 3
depends_on:
dolphinscheduler-zookeeper:
condition: service_healthy
volumes:
- dolphinscheduler-worker-data:/tmp/dolphinscheduler
- dolphinscheduler-logs:/opt/dolphinscheduler/logs
- dolphinscheduler-shared-local:/opt/soft
- dolphinscheduler-resource-local:/dolphinscheduler
- /data/seatunnel/backend/apache-seatunnel-2.3.8:/opt/seatunnel ⬅ 添加
networks:
- dolphinscheduler
environment: ⬅ 添加
- SEATUNNEL=/opt/seatunnel ⬅ 添加
- 重启相关容器
cd /data/dolphinscheduler/apache-dolphinscheduler-3.2.0-src/deploy/docker/
docker-compose restart dolphinscheduler-master dolphinscheduler-api dolphinscheduler-worker
docker-compose ps
## 或者直接
# start all dolphinscheduler server, use profile all
docker-compose --profile all up -d
# 检查是否挂载成功
docker inspect docker_dolphinscheduler-api_1
- 进到容器里,在各容器里配置 java 环境变量
docker exec -it docker_dolphinscheduler-api_1 /bin/bash
export SEATUNNEL_HOME=/opt/seatunnel
echo $SEATUNNEL_HOME
java -version
which java
export JAVA_HOME=/opt/java/openjdk
export PATH=$JAVA_HOME/bin:$PATH
echo $JAVA_HOME
echo $PATH
- 验证,选择启动脚本:seatunnel.sh,部署方式:local
脚本:(Doris 是如果库里没有表需要用 save_mode_create_template 先建表)
env {
execution.parallelism = 2
job.mode = "BATCH"
checkpoint.interval = 10000
}
source{
Jdbc {
url = "jdbc:mysql://ip:port/db?useUnicode=true&characterEncoding=utf8"
driver = "com.mysql.cj.jdbc.Driver"
connection_check_timeout_sec = 100
user = ""
password = ""
query = "select * from 源表;"
table = "源表"
result_table_name = "目标表"
}
}
sink {
Doris {
fenodes="ip:port"
username =""
password=""
table.identifier = "testdb.目标表"
sink.enable-2pc = "true"
sink.label-prefix = "test-cdc"
doris.config = {
format="json"
read_json_by_line="true"
}
save_mode_create_template = """
CREATE TABLE IF NOT EXISTS `${database}`.`${table}` (
id BIGINT COMMENT '主键',
project_code STRING COMMENT '项目编码',
project_name STRING COMMENT '项目名称',
total_contract
)
ENGINE=OLAP
UNIQUE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"in_memory" = "false",
"storage_format" = "V2",
"disable_auto_compaction" = "false"
);
"""
}
}
四、Superset docker 部署
步骤
参考地址:https://superset.apache.org/docs/quickstart
- docker 配国内镜像源后,直接拉镜像。
docker pull apache/superset
docker images
- 创建密钥,进入容器
## 使用命令“openssl rand -base64 42”创建SECRET_KEY填写到下面
## 运行容器
docker run -d --name superset-server -p 8088:8088 -e SUPERSET_SECRET_KEY="" apache/superset
docker exec -it superset-server superset-init
## 进入后,数据库初始化
export SUPERSET_SECRET_KEY=""
superset db upgrade
## 初始化应用
superset init
## 设置管理员账户
export FLASK_APP=superset
flask fab create-admin
## 汉化
sed -i "s/BABEL_DEFAULT_LOCALE = \"en/BABEL_DEFAULT_LOCALE = \"zh/g" superset/config.py
sed -i "s/LANGUAGES = {}/# LANGUAGES = {}/g" superset/config.py
- 在容器中下载 mysql 等依赖,说是通过 pip install 安装的驱动仅在当前容器中有效,如果容器重启或重新部署,更改会丢失(但是目前重启后安装的依赖并没有失效)。如果要安装其他数据源的依赖也是找到那个数据源 pip install 就行。
docker exec -it superset-server /bin/bash
pip install mysqlclient
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
docker restart superset-server
至此,我们已成功构建了一个基于开源技术——DolphinScheduler、SeaTunnel 和 Superset 的数据采集、同步与分析平台。