HTTP接口数据也能定时同步入湖?用DolphinScheduler×SeaTunnel快速搞定!

背景与目标

我们之前曾评估使用过SeaTunnel做CDC入湖验证:SeaTunnel-CDC入湖实践,这些场景都是能直连数据库的场景,业务需求中经常会出现无法直连数据库做CDC进行数据同步的场景,而这些场景就需要使用API进行数据对接,用Apache DolphinScheduler定时同步数据。

举个实际中的例子:

  • ERP(SAP)的库存数据进行同步入湖仓做库存分析

同时,本次目标希望其他同事能依样画葫芦,在以后的对接http接口到湖仓的时候能够自行完成,而非每遇到一个对接需求,就需要通过代码方式进行对接。

准备工作

  • seatunnel 2.3.10

首先,您需要在${SEATUNNEL_HOME}/config/plugin_config文件中加入连接器名称,然后,执行命令来安装连接器,确认连接器在${SEATUNNEL_HOME}/connectors/目录下即可。

本例中我们会用到:connector-jdbcconnector-paimon

写入StarRocks也可以使用connector-starrocks,本例中的场景比较适合用connector-jdbc,所以使用connector-jdbc

# 配置连接器名称
--connectors-v2--
connector-jdbc
connector-starrocks
connector-paimon
--end--
# 安装连接器
sh bin/install-plugin.sh 2.3.10

SeaTunnel任务

我们先至少保证能在本地完成SeaTunnel任务,再完成对Apache DolphinScheduler的对接。

  • http to starRocks
    example/http2starrocks
env {
  parallelism = 1
  job.mode = "BATCH"
}

source {
  Http {
    plugin_output = "stock"
    url = "https://ip/http/prd/query_sap_stock"
    method = "POST"
    headers {
      Authorization = "Basic XXX"
      Content-Type = "application/json"
    }
    body = """{"IT_WERKS": [{"VALUE": "1080"}]}"""
    format = "json"
    content_field = "$.ET_RETURN.*"
    schema {
      fields {
        MATNR = "string"
        MAKTX = "string"
        WERKS = "string"
        NAME1 = "string"
        LGORT = "string"
        LGOBE = "string"
        CHARG = "string"
        MEINS = "string"
        LABST = "double"
        UMLME = "double"
        INSME = "double"
        EINME = "double"
        SPEME = "double"
        RETME = "double"
      }
    }
  }
}

# 此转换操作主要用于字段从命名等方便用途
transform {
  Sql {
    plugin_input = "stock"
    plugin_output = "stock-tf-out"
    query = "select MATNR, MAKTX, WERKS,NAME1,LGORT,LGOBE,CHARG,MEINS,LABST,UMLME,INSME,EINME,SPEME,RETME from stock"
  }
}

# 连接starRocks 进行数据分区覆写,本例适用starRocks建表,按照分区insert overwrite 覆写
sink {
    jdbc {
        plugin_input = "stock-tf-out"
        url = "jdbc:mysql://XXX:9030/scm?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"
        driver = "com.mysql.cj.jdbc.Driver"
        user = "lab"
        password = "XXX"
        compatible_mode="starrocks"
        query = """insert overwrite ods_sap_stock PARTITION (WERKS='1080') (MATNR, MAKTX, WERKS,NAME1,LGORT,LGOBE,CHARG,MEINS,LABST,UMLME,INSME,EINME,SPEME,RETME) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"""
        }
}

# connector-starrocks进行对接 (未看到支持sql语句进行数据insert overwrite,本例子场景不适合),比较适合表数据全部删除重建场景
// sink {
//   StarRocks {
//     plugin_input = "stock-tf-out"
//     nodeUrls = ["ip:8030"]
//     base-url = "jdbc:mysql://ip:9030/"
//     username = "lab"
//     password = "XXX"
//     database = "scm"
//     table = "ods_sap_stock"
//     batch_max_rows = 1000
//     data_save_mode="DROP_DATA"
//     starrocks.config = {
//       format = "JSON"
//       strip_outer_array = true
//     }
//     schema_save_mode = "RECREATE_SCHEMA"
//     save_mode_create_template="""
//       CREATE TABLE IF NOT EXISTS `scm`.`ods_sap_stock` (
//         MATNR STRING COMMENT '物料',
//         WERKS STRING COMMENT '工厂',
//         LGORT STRING COMMENT '库存地点',
//         MAKTX STRING COMMENT '物料描述',
//         NAME1 STRING COMMENT '工厂名称',
//         LGOBE STRING COMMENT '地点描述',
//         CHARG STRING COMMENT '批次编号',
//         MEINS STRING COMMENT '单位',
//         LABST DOUBLE COMMENT '非限制使用库存',
//         UMLME DOUBLE COMMENT '在途库存',
//         INSME DOUBLE COMMENT '质检库存',
//         EINME DOUBLE COMMENT '受限制使用的库存',
//         SPEME DOUBLE COMMENT '已冻结的库存',
//         RETME DOUBLE COMMENT '退货'
//       ) ENGINE=OLAP
//       PRIMARY KEY ( MATNR,WERKS,LGORT)
//       COMMENT 'sap库存'
//       DISTRIBUTED BY HASH (WERKS) PROPERTIES (
//       "replication_num" = "1"
//       )
//     """
//   }
// }
  • http to paimon
    example/http2paimon
env {
  parallelism = 1
  job.mode = "BATCH"
}

source {
  Http {
    plugin_output = "stock"
    url = "https://ip/http/prd/query_sap_stock"
    method = "POST"
    headers {
      Authorization = "Basic XXX"
      Content-Type = "application/json"
    }
    body = """{"IT_WERKS": [{"VALUE": "1080"}]}"""
    format = "json"
    content_field = "$.ET_RETURN.*"
    schema {
      fields {
        MATNR = "string"
        MAKTX = "string"
        WERKS = "string"
        NAME1 = "string"
        LGORT = "string"
        LGOBE = "string"
        CHARG = "string"
        MEINS = "string"
        LABST = "double"
        UMLME = "double"
        INSME = "double"
        EINME = "double"
        SPEME = "double"
        RETME = "double"
      }
    }
  }
}
# 此转换操作主要用于字段从命名等方便用途
transform {
  Sql {
    plugin_input = "stock"
    plugin_output = "stock-tf-out"
    query = "select MATNR, MAKTX, WERKS,NAME1,LGORT,LGOBE,CHARG,MEINS,LABST,UMLME,INSME,EINME,SPEME,RETME from stock"
  }
}

# 连接paimon进行数据同步,paimon 暂时 未看到有支持 insert overwrite 分区覆写,此例仅作为参考,不适用本此例子需求
sink {
  Paimon {
    warehouse = "s3a://test/"
    database = "sap"
    table = "ods_sap_stock"
    paimon.hadoop.conf = {
        fs.s3a.access-key=XXX
        fs.s3a.secret-key=XXX
        fs.s3a.endpoint="http://minio:9000"
        fs.s3a.path.style.access=true
        fs.s3a.aws.credentials.provider=org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider
    }
  }
}

DolphinScheduler集成SeaTunnel

  • 制作worker镜像
FROM dolphinscheduler.docker.scarf.sh/apache/dolphinscheduler-worker:3.2.2
RUN mkdir /opt/seatunnel
RUN mkdir /opt/seatunnel/apache-seatunnel-2.3.10
# 容器集成seatunnel
COPY apache-seatunnel-2.3.10/ /opt/seatunnel/apache-seatunnel-2.3.10/

打包镜像,推送到镜像仓库

docker build --platform=linux/amd64 -t apache/dolphinscheduler-worker:3.2.2-seatunnel .
  • 使用新镜像部署一个worker,此处修改docker-compose.yaml,增加一个dolphinscheduler-worker-seatunnel节点。
...
  dolphinscheduler-worker-seatunnel:
    image: xxx/dolphinscheduler-worker:3.2.2-seatunnel
    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-seatunnel-data:/tmp/dolphinscheduler
      - ./dolphinscheduler-logs:/opt/dolphinscheduler/logs
      - ./dolphinscheduler-shared-local:/opt/soft
      - ./dolphinscheduler-resource-local:/dolphinscheduler
    networks:
      dolphinscheduler:
        ipv4_address: 172.15.0.18
...
  • DolphinScheduler配置SeaTunnel分组及环境配置
    • 安全中心-Worker分组管理,创建一个这个节点ip的分组,用于以后需要seatunnel的任务跑该分组
      请添加图片描述

    • 环境管理-创建环境,增加一个用于执行seatunnel的环境,同时需要绑定Worker分组为上一步创建的seatunnel分组
      请添加图片描述

    • 创建工作流定义,把上面的seatunnel任务配置填写上
      请添加图片描述

    • 运行时候,选择seatunnel的worker分组和环境即可跑在这个集成了seatunnel的环境上
      请添加图片描述

转载自俊瑶先森
原文链接:https://junyao.tech/posts/9c6867c5.html

<think>我们之前讨论了在K8s中部署DolphinScheduler并配置DataX环境,现在用户的新问题是关于使用DolphinSchedulerSeaTunnel将MySQL数据同步到Doris的详细步骤。 根据用户提供的引用,我们知道: 引用[1]提到:DolphinScheduler结合SeaTunnel实现异构数据同步,再通过Superset进行可视化。 引用[2]提到:SeaTunnel同步MySQL到Doris的优化策略,包括环境配置优化(如并行度设置)和配置文件细节。 因此,我们需要提供: 1. 部署和配置SeaTunnel环境的步骤(特别是在K8s环境中,但用户没有明确说环境,所以可以通用说明,同时兼顾K8s)。 2. 编写SeaTunnel的配置文件(config)来同步MySQL到Doris。 3. 在DolphinScheduler中创建任务调度这个SeaTunnel作业。 步骤分解: 一、准备SeaTunnel环境 - 在DolphinScheduler的Worker节点(或Pod)上安装SeaTunnel。 - 可以选择将SeaTunnel打包进Worker镜像,或者通过共享存储挂载。 二、编写SeaTunnel配置文件(config) - 配置文件包括source(MySQL)和sink(Doris)的配置。 - 根据引用[2],注意优化设置(如并行度、批量写参数等)。 三、在DolphinScheduler中创建任务 - 使用Shell任务调用SeaTunnel命令行执行配置文件。 - 或者使用SeaTunnel任务类型(如果DolphinScheduler支持的话,但通常需要插件,目前可能还是用Shell任务)。 四、测试和优化 详细步骤: ### 1. 部署SeaTunnel环境 - 下载SeaTunnel发行版(例如:2.3.0版本)并解压到DolphinScheduler Worker节点(或Pod)的指定路径,如`/opt/seatunnel`。 - 安装必要的连接器: - MySQL连接器(JDBC驱动) - Doris连接器(Doris-Sink) - 将MySQL的JDBC驱动(如mysql-connector-java-8.0.xx.jar)放SeaTunnel的libs目录(`/opt/seatunnel/lib`)中。 - 同样,确保Doris连接器的jar包也在libs目录(SeaTunnel已经内置了Doris连接器?或者需要额外下载?根据SeaTunnel文档,可能需要指定正确的连接器名称)。 如果是K8s环境,可以通过以下方式整合: - 构建包含SeaTunnel的自定义Worker镜像(基于官方DolphinScheduler Worker镜像): ```dockerfile FROM apache/dolphinscheduler-worker:3.2.2 # 安装SeaTunnel RUN wget https://dlcdn.apache.org/seatunnel/2.3.0/apache-seatunnel-2.3.0-bin.tar.gz && \ tar -zxvf apache-seatunnel-2.3.0-bin.tar.gz -C /opt/ && \ mv /opt/apache-seatunnel-2.3.0 /opt/seatunnel && \ rm apache-seatunnel-2.3.0-bin.tar.gz # 添加MySQL驱动 COPY mysql-connector-java-8.0.28.jar /opt/seatunnel/lib/ ``` 或者通过共享卷挂载SeaTunnel目录(避免每个Worker镜像都包含,节省空间)。 ### 2. 编写SeaTunnel配置文件 创建一个配置文件(如`mysql_to_doris.conf`),内容如下: ```hocon env { # 设置并行度,根据资源情况调整 parallelism = 4 } source { jdbc { driver = "com.mysql.cj.jdbc.Driver" url = "jdbc:mysql://mysql_host:3306/database" username = "your_username" password = "your_password" # 查询语句,或者表名 query = "SELECT * FROM table_to_sync" # 或者使用 table = "table_to_sync" # 增量同步可配置where条件,如更新时间大于上次同步时间 } } transform { # 可以添加转换操作,例如字段映射、重命名等 # 如果不需要转换,可以省略 } sink { doris { fenodes = "doris_fe_host:8030" # Doris FE地址 username = "doris_username" password = "doris_password" database = "doris_db" table = "doris_table" # 批量写参数 batch_size = 1000 interval = "10s" } } ``` 注意:根据引用[2],优化点包括: - 调整`parallelism`(并行度)以充分利用资源。 - 调整`batch_size`和`interval`来控制写Doris的频率。 - 如果数据量大,可考虑分片查询(在source中配置分区键)。 ### 3. 在DolphinScheduler中创建任务 - 登录DolphinScheduler UI。 - 创建一个工作流,然后在该工作流中添加一个Shell任务节点。 - 在Shell任务中填写命令: ```shell /opt/seatunnel/bin/seatunnel.sh --config /path/to/mysql_to_doris.conf ``` - 注意:确保Worker节点上有SeaTunnel的执行权限,并且配置文件路径正确。 如果SeaTunnel配置了环境变量,也可以直接使用`seatunnel.sh`命令。 ### 4. 测试和优化 - 运行工作流,查看任务日志,确保同步成功。 - 根据日志和性能情况调整参数(如并行度、批量大小等)。 引用说明: - 关于SeaTunnelDolphinScheduler的结合,参考引用[1]提到的高效数据同步功能[^1]。 - 关于SeaTunnel同步MySQL到Doris的优化策略,参考引用[2]的环境配置优化[^2]。 相关问题: 1. 如何实现增量同步(只同步新增或更新的数据)? 2. SeaTunnel任务执行失败如何排查? 3. 如何提高SeaTunnel同步MySQL到Doris的性能? 4. DolphinScheduler中如何设置任务依赖关系(如前置任务、后置任务)? 回答中,我们按照步骤详细说明了配置和部署,并提供了配置文件示例。此外,我们引用了用户提供的两个引用,并在相关位置添加了引用标识。 </think>### 使用 DolphinSchedulerSeaTunnel 实现 MySQL 到 Doris 的数据同步 #### 一、环境准备阶段 1. **部署 SeaTunnel** - 在 DolphinScheduler Worker 节点安装 SeaTunnel(集群部署需所有 Worker 安装): ```bash # 下载 SeaTunnel wget https://dlcdn.apache.org/seatunnel/2.3.4/apache-seatunnel-2.3.4-bin.tar.gz tar -zxvf apache-seatunnel-2.3.4-bin.tar.gz -C /opt/ mv /opt/apache-seatunnel-2.3.4 /opt/seatunnel # 安装 MySQL 和 Doris 连接器 cp mysql-connector-java-8.0.28.jar /opt/seatunnel/lib/ cp doris-fe-jdbc-driver-1.2.77.jar /opt/seatunnel/lib/ ``` - **K8s 场景**:将 SeaTunnel 添加到 Worker 镜像或通过 PVC 挂载共享存储[^1]。 2. **配置环境变量** 在 DolphinScheduler 的 `env` 文件中添加: ```bash # 配置 SeaTunnel 路径 export SEATUNNEL_HOME=/opt/seatunnel ``` #### 二、SeaTunnel 配置文件 (`mysql_to_doris.conf`) ```hocon env { execution.parallelism = 4 # 并行度优化[^2] } source { Jdbc { driver = "com.mysql.cj.jdbc.Driver" url = "jdbc:mysql://mysql_host:3306/source_db" username = "root" password = "mysql_password" query = "SELECT id, name, create_time FROM user_table WHERE update_time > '${last_sync_time}'" # 增量同步参数 increment_column = "update_time" start_time = "2023-01-01 00:00:00" } } transform { # 数据清洗(可选) Replace { source_field = "name" pattern = "test_" replacement = "" } } sink { Doris { fenodes = "doris_fe:8030" username = "admin" password = "doris_password" database = "target_db" table = "user_table" # 批量写优化[^2] batch_size = 5000 batch_interval_ms = 60000 } } ``` > **关键参数说明**: > - `execution.parallelism`:根据 Worker 资源调整并行度 > - `increment_column`:实现增量同步 > - `batch_size`:控制 Doris 写批次大小 #### 三、DolphinScheduler 任务配置 1. **创建工作流** - 新建 Shell 任务节点 ```shell # 命令行执行同步 $SEATUNNEL_HOME/bin/seatunnel.sh --config /path/to/mysql_to_doris.conf ``` 2. **设置调度参数** ```yaml strategy: type: Cron # 定时调度 cron: "0 0 2 * * ?" # 每天凌晨2点执行 failure_strategy: CONTINUE # 失败处理策略 ``` 3. **增量同步实现** - 通过 SQL 语句动态传递参数: ```sql SELECT MAX(update_time) FROM doris_target_table ``` - 将结果存储为 `${last_sync_time}` 变量供下一次任务使用 #### 四、验证与优化 1. **日志检查** - 在 DolphinScheduler UI 查看任务日志: ```log [INFO] 2023-10-01 02:00:03 - Sink DorisWriter[4] write 12456 records [INFO] 2023-10-01 02:05:17 - Job execution finished ``` 2. **性能优化建议**[^2] - **并行度调整**:Worker 资源充足时增加 `execution.parallelism` - **批量参数**: - Doris Sink 的 `batch_size` 建议 5000-10000 - 网络延迟高时增大 `batch_interval_ms` - **索引优化**:在 Doris 表上为查询字段创建 Bloom Filter 索引 #### 五、常见问题解决 | 问题现象 | 解决方案 | |---------|---------| | `ClassNotFoundException: com.mysql.cj.jdbc.Driver` | 检查 JAR 是否在 `$SEATUNNEL_HOME/lib` 目录 | | Doris 写超时 | 增加 `sink.doris.request.timeout=3600000` | | 增量同步时间断裂 | 使用 DolphinScheduler 的全局变量存储最后更新时间 | > **提示**:首次执行建议全量同步(移除 `WHERE` 条件),后续切换为增量同步。 --- ### 相关问题 1. 如何实现 DolphinSchedulerSeaTunnel 任务的失败重试机制? 2. SeaTunnel 同步 MySQL 到 Doris 时如何保证数据一致性? 3. 如何监控 SeaTunnel 数据同步任务的性能指标? 4. Doris 写性能瓶颈有哪些优化手段? [^1]: 异构数据同步场景需要 SeaTunnel 在 Worker 节点可用 [^2]: 并行度和批量写是 MySQL 到 Doris 同步的核心优化点
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DolphinScheduler社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值