使用seatunnel在mysql和http之间同步数据

使用Seatunnel进行mysql到http、mysql到mysql、http到mysql以及mysql-cdc到HTTP的数据同步示例。

官方文档:https://seatunnel.apache.org/zh-CN/docs/2.3.7/connector-v2/source/Jdbc

在操作mysql同步之前,需要先下载对应版本的jdbc驱动jar包mysql-connector-java-xxx.jar(https://mvnrepository.com/artifact/mysql/mysql-connector-java)然后放到Seatunnel安装路径下的lib文件夹下。对于Spark/Flink,也应该将jar包复制到 S P A R K H O M E / j a r s / 或 SPARK_HOME/jars/或 SPARKHOME/jars/FLINK_HOME/lib/。

1,mysql同步到http接口

env {
  execution.parallelism = 2
  job.mode = "BATCH" #mysql作为数据源,只支持批量同步
}

source {
   jdbc {
     url =  "jdbc:mysql://172.27.10.22:6033/test"
     driver = "com.mysql.cj.jdbc.Driver"
     connection_check_timeout_sec = 100
     user = "root"
     password = "root"
     query = "SELECT * FROM user_info ORDER BY create_time LIMIT 1"
     result_table_name = "user_info_out"
  }
}

transform {
    Sql {
      source_table_name = "user_info_out"
      result_table_name = "user_info_sink"
      query = "select info, user_name, age  from user_info_out"
    }
}

sink {
  Console {
    source_table_name = "user_info_sink"
  }

  http{
    source_table_name = "user_info_sink"
    url = "https://test.test.com:8080/api/user/test"
    method = "POST"
    headers = {Accept="application/json",Content-Type="application/json;charset=utf-8"}
  }

}

2,mysql同步到mysql

env {
  execution.parallelism = 2
  job.mode = "BATCH"
}
source{
    Jdbc {
        url =  "jdbc:mysql://172.27.10.22:6033/test"
        driver = "com.mysql.cj.jdbc.Driver"
        connection_check_timeout_sec = 10
        user = "root"
        password = "root"
        query = "SELECT `name`,`score` FROM `user`"
        result_table_name = "user_info"
    }
}

transform {
    
}

sink {
  Jdbc {
        source_table_name = "user_info"
        url =  "jdbc:mysql://192.27.10.22:16033/temp_user"
        driver = "com.mysql.cj.jdbc.Driver"
        connection_check_timeout_sec = 100
        user = "root"
        password = "root"
        query = "INSERT INTO `student`(`name`,`score`) VALUES(?,?)"
  }
}

3,http接口同步到mysql

env {
  execution.parallelism = 2
  job.mode = "STREAMING" #http作为数据源,支持批量模式和流式模式
  checkpoint.interval = 10000 #执行间隔/毫秒
}

source {
  Http {
    url = "https://test.test.com:8080/api/test"
    method = "GET"
    format = "json"
    headers = {Authorization="Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiI1Zjc1NzVjMjI4NDQ0OTFmOTQ1ZWY1ZjI5NzlmMDRiNyIsInN1YiI6InpqdCJ9.49bfdthmvGs2DWKJxvrlz6vtEGckVDfBtKIvFfN1UzHJ-LHboZ2NpPj5bX6XZ1lk7l-O-jh_PnfQ7LLZvCFVc",language="zh"}
    params = {userId="fa438165b2c84d8dbe9175d152718437"}
    content_field = "$.content.*"
    schema = {
      fields {
        userId= string
	    age= int
	    phone= string
	    name=string
      }
    }
    result_table_name = "user_info"
  }
}

transform {
    Sql {
    source_table_name = "user_info"
    result_table_name = "user_info_out"
    query = "SELECT name as userName,userId,age,phone FROM user_info"
    }

}

sink {
  Console {
    source_table_name = "user_info_out"
  }
   Jdbc {
     url =  "jdbc:mysql://172.27.10.22:26033/test"
     driver = "com.mysql.cj.jdbc.Driver"
     connection_check_timeout_sec = 100
     user = "root"
     password = "root"
     source_table_name = "user_info_out"
     query = "INSERT INTO `user_bak`(`userName`, `userId`, `age`, `phone`) VALUES (?,? ,?,?)"
  }
}


4,mysql-cdc同步到http接口

env {
  execution.parallelism = 2
  job.mode = "STREAMING" #mysql-cdc作为数据源,支持批量模式和流式模式
  checkpoint.interval = 10000 #执行间隔/毫秒
}

source {
    MySQL-CDC {
      catalog = {
        factory = MySQL
      }
      base-url = "jdbc:mysql://"${mysql_ip_port}"/test?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false"
      username = ${mysql_username}
      password = ${mysql_pass}
      table-names = ["test.user"]
      startup.mode = "initial"
      result_table_name = "user_info_out"
      table-names-config = [
        {
          table = "test.user"
          primaryKeys = ["user_id"]
        }
      ]
    }

}

transform {
    FilterRowKind {
      source_table_name = "user_info_out"
      result_table_name = "user_info_sink"
      include_kinds = ["UPDATE_AFTER","INSERT"]
    }

}

sink {
  Console {
    source_table_name = "user_info_sink"
  }

  http{
    source_table_name = "user_info_sink"
    url = "https://test.test.com:28080/api/user/test"
    method = "POST"
    headers = {Accept="application/json",Content-Type="application/json;charset=utf-8"}
  }

}

### SeaTunnel MySQL 到 Elasticsearch 的数据同步配置 SeaTunnel 是一个高性能的分布式数据集成平台,能够支持多种异构数据之间的实时数据同步[^1]。为了实现从 MySQL 到 Elasticsearch 的数据同步,可以通过以下方式完成配置。 #### 配置文件说明 以下是基于 SeaTunnel 的 `Flink` 运行模式下的 MySQL 至 Elasticsearch 数据同步的核心配置示例: ```yaml env: execution.parallelism: 1 source: plugin_name: jdbc result_table_name: mysql_source_data parameters: drivername: com.mysql.cj.jdbc.Driver url: jdbc:mysql://<mysql_host>:3306/<database>?useSSL=false&serverTimezone=UTC username: <username> password: <password> table-name: <table> transform: - plugin_name: filter input_table_names: mysql_source_data output_table_name: filtered_data condition: "id > 0" sink: plugin_name: elasticsearch7 input_table_name: filtered_data host: - http://<elasticsearch_host>:9200 index: <index_name> bulk.flush.max.actions: 1000 bulk.flush.max.size.mb: 5 ``` #### 参数解释 - **execution.parallelism**: 设置作业并行度,默认为 1。 - **jdbc source**: - `drivername`: 使用的 JDBC 驱动名称。 - `url`: MySQL 数据库连接 URL。 - `username/password`: 登录数据库所需的用户名密码。 - `table-name`: 要读取的表名。 - **filter transform** (可选): 对数据进行过滤操作,仅保留符合条件的数据记录。 - **elasticsearch sink**: - `host`: Elasticsearch 实例地址列表。 - `index`: 数据写入的目标索引名称。 - `bulk.flush.max.actions/size.mb`: 批量写入的最大动作数或大小限制。 #### 示例代码运行流程 通过上述 YAML 文件定义的任务流,SeaTunnel 将按照如下逻辑执行: 1. 从指定的 MySQL 表中提取数据。 2. 可选地应用过滤条件筛选目标数据。 3. 将处理后的数据批量写入至 Elasticsearch 中设定的索引下。 #### 注意事项 - 确保 MySQL Elasticsearch 的服务正常启动,并且网络连通性良好。 - 如果使用的是较新的 SeaTunnel 版本,请确认所依赖插件已正确加载。 - 测试阶段建议降低并发级别以便于调试错误日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值