【Demo 视频教程】使用SeaTunnel从MySQL同步到Doris

随着数据技术的快速发展,了解并掌握各种工具和技术变得尤为重要。为此,我们准备在Apache SeaTunnel社区发起如何使用连接器的Demo演示计划,邀请所有热爱数据同步技术的同学分享他们的知识和实操经验!

本期我们邀请到了社区PMC高俊老师,参与录制的主题是:如何从MySQL同步到Doris,如果您对此计划感兴趣,也欢迎联系社区运营同学参与Demo录制!无论您是数据工程师、开发者还是技术爱好者,都欢迎您参与并展示您的技术才能。

敲重点敲重点如果你是用户,想看什么同步场景的Demo!请下滑到最底部留言,我们优先出品呼声最高的同步场景Demo!

Demo计划目标

我们的目标是创建一个共享和学习的平台,通过具体的Demo演示和对应的文档帮助社区成员更好地理解和应用各种数据连接器。这些Demo可以帮助新手快速学习,同时也为资深专家提供一个展示创新解决方案的舞台。

MySQL同步到Doris

src="//player.bilibili.com/player.html?aid=1503234572&bvid=BV1dD421n7YU&cid=1507007688&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true">

JDBC MySQL连接器

描述

通过JDBC读取外部数据源数据。

支持的MySQL版本

  • 5.5/5.6/5.7/8.0

支持的引擎

Spark
Flink
SeaTunnel Zeta

使用依赖

Spark/Flink引擎

  1. 您需要确保jdbc驱动jar包已放在${SEATUNNEL_HOME}/plugins/目录下。

SeaTunnel Zeta引擎

  1. 您需要确保jdbc驱动jar包已放在${SEATUNNEL_HOME}/lib/目录下。

MySQL 连接器关键特性

支持查询SQL并可实现投影效果。

支持的数据源信息

数据源支持的版本驱动URLMaven下载
MySQL不同的依赖版本有不同的驱动类。com.mysql.cj.jdbc.Driverjdbc:mysql://localhost:3306:3306/test下载

数据库依赖

请下载与'Maven'对应的支持列表,并复制到'$SEATNUNNEL_HOME/plugins/jdbc/lib/'工作目录
例如MySQL数据源:cp mysql-connector-java-xxx.jar $SEATNUNNEL_HOME/plugins/jdbc/lib/

数据类型映射

MySQL数据类型SeaTunnel数据类型
BIT(1)
INT UNSIGNED
BOOLEAN
TINYINT
TINYINT UNSIGNED
SMALLINT
SMALLINT UNSIGNED
MEDIUMINT
MEDIUMINT UNSIGNED
INT
INTEGER
YEAR
INT
INT UNSIGNED
INTEGER UNSIGNED
BIGINT
BIGINT
BIGINT UNSIGNEDDECIMAL(20,0)
DECIMAL(x,y)(获取指定列的指定列大小.<38)DECIMAL(x,y)
DECIMAL(x,y)(获取指定列的指定列大小.>38)DECIMAL(38,18)
DECIMAL UNSIGNEDDECIMAL(获取指定列的指定列大小+1,
(获取指定列小数点右侧的数字个数.)))
FLOAT
FLOAT UNSIGNED
FLOAT
DOUBLE
DOUBLE UNSIGNED
DOUBLE
CHAR
VARCHAR
TINYTEXT
MEDIUMTEXT
TEXT
LONGTEXT
JSON
STRING
DATEDATE
TIMETIME
DATETIME
TIMESTAMP
TIMESTAMP
TINYBLOB
MEDIUMBLOB
BLOB
LONGBLOB
BINARY
VARBINAR
BIT(n)
BYTES
GEOMETRY
UNKNOWN
尚未支持

数据源选项

名称类型是否必须默认值描述
urlString-JDBC连接的URL。示例: jdbc:mysql://localhost:3306:3306/test
driverString-用于连接远程数据源的jdbc类名, 如果使用MySQL,值为 com.mysql.cj.jdbc.Driver
userString-连接实例的用户名
passwordString-连接实例的密码
queryString-查询语句
connection_check_timeout_secInt30等待用于验证连接的数据库操作完成的时间(秒)
partition_columnString-用于并行处理的分区列,仅支持数字类型主键,且只能配置一个列。
partition_lower_boundBigDecimal-扫描的分区列最小值,如果未设置,SeaTunnel将查询数据库获取最小值。
partition_upper_boundBigDecimal-扫描的分区列最大值,如果未设置,SeaTunnel将查询数据库获取最大值。
partition_numInt任务并行度分区数,仅支持正整数,默认值为任务并行度。
fetch_sizeInt0对于返回大量对象的查询,您可以配置查询中使用的行取回大小以通过减少满足选择条件所需的数据库访问次数来提高性能。
零表示使用jdbc默认值。
propertiesMap-额外的连接配置参数,当properties和URL有相同的参数时,具体优先权由驱动实现决定。例如,在MySQL中,properties优先于URL。
table_pathInt0表的完整路径,您可以使用这个配置替代query。例如:
mysql: "testdb.table1"
oracle: "test_schema.table1"
sqlserver: "testdb.test_schema.table1"
postgresql: "testdb.test_schema.table1"
table_listArray0要读取的表列表,您可以使用这个配置替代table_path示例:[{ table_path = "testdb.table1"}, {table_path = "testdb.table2", query = "select * id, name from testdb.table2"}]
where_conditionString-所有表/查询的通用行过滤条件,必须以where开始。例如where id > 100
split.sizeInt8096表的分割大小(行数),读取表时会将表分割成多个分片。
split.even-distribution.factor.lower-boundDouble0.05分块键分布因子的下界。此因子用于确定表数据是否均匀分布。如果计算出的分布因子大于或等于此下界,则表块将被优化以均匀分布。否则,如果分布因子较小,则表将被视为分布不均,如果估计的分片数超过sample-sharding.threshold指定的值,则会使用基于抽样的分片策略。默认值为0.05。
split.even-distribution.factor.upper-boundDouble100分块键分布因子的上界。此因子用于确定表数据是否均匀分布。如果计算出的分布因子小于或等于此上界,则表块将被优化以均匀分布。否则,如果分布因子较大,则表将被视为分布不均,并且如果估计的分片数超过sample-sharding.threshold指定的值,则会使用基于抽样的分片策略。默认值为100.0。
split.sample-sharding.thresholdInt10000此配置指定触发基于抽样的分片策略的估计分片数阈值。当分布因子超出chunk-key.even-distribution.factor.upper-boundchunk-key.even-distribution.factor.lower-bound指定的范围,并且估计的分片数(计算为近似行数/块大小)超过此阈值时,将使用基于抽样的分片策略。这可以帮助更有效地处理大型数据集。默认值为1000个分片。
split.inverse-sampling.rateInt1000在基于抽样的分片策略中使用的抽样率的倒数。例如,如果此值设置为1000,意味着在抽样过程中应用了1/1000的抽样率。此选项提供了控制抽样粒度的灵活性,从而影响最终分片数。在处理非常大的数据集时尤其有用,此时可能更倾向于较低的抽样率。默认值为1000。
common-options-数据源插件通用参数,请参阅Source Common Options了解详情。

并行读取器

JDBC源连接器支持从表中并行读取数据。SeaTunnel将使用某些规则来分割表中的数据,这些数据将交给读取器进行读取。读取器的数量由parallelism选项决定。

分割键规则:

  1. 如果partition_column不为null,将使用它来计算分割。该列必须在支持分割的数据类型中。
  2. 如果partition_column为null,seatunnel将读取表的架构并获取主键和唯一索引。如果主键和唯一索引中有多于一个列,将使用第一个在支持分割的数据类型中的列来分割数据。例如,表有主键(nn guid, name varchar),因为guid不在支持分割的数据类型中,所以将使用列name来分割数据。

支持分割的数据类型:

  • 字符串
  • 数字(int, bigint, decimal, ...)
  • 日期

与分割相关的选项

split.size

一个分割中的行数,读取表时会将表分割成多个分割。

split.even-distribution.factor.lower-bound

不推荐使用

分块键分布因子的下界。此因子用于确定表数据是否均匀分布。如果计算出的分布因子大于或等于此下界,则表块将被优化以均匀分布。否则,如果分布因子较小,则表将被视为分布不均,并且如果估计的分片数超过sample-sharding.threshold指定的值,则会使用基于抽样的分片策略。默认值为0.05。

split.even-distribution.factor.upper-bound

不推荐使用

分块键分布因子的上界。此因子用于确定表数据是否均匀分布。如果计算出的分布因子小于或等于此上界,则表块将被优化以均匀分布。否则,如果分布因子较大,则表将被视为分布不均,并且如果估计的分片数超过sample-sharding.threshold指定的值,则会使用基于抽样的分片策略。默认值为100.0。

split.sample-sharding.threshold

此配置指定触发基于抽样的分片策略的估计分片数阈值。当分布因子超出chunk-key.even-distribution.factor.upper-boundchunk-key.even-distribution.factor.lower-bound指定的范围,并且估计的分片数(计算为近似行数/块大小)超过此阈值时,将使用基于抽样的分片策略。这可以帮助更有效地处理大型数据集。默认值为1000个分片。

split.inverse-sampling.rate

在基于抽样的分片策略中使用的抽样率的倒数。例如,如果此值设置为1000,意味着在抽样过程中应用了1/1000的抽样率。此选项提供了控制抽样粒度的灵活性,从而影响最终分片数。在处理非常大的数据集时尤其有用,此时可能更倾向于较低的抽样率。默认值为1000。

partition_column [string]

用于分割数据的列名。

partition_upper_bound [BigDecimal]

扫描的分区列最大值,如果未设置,SeaTunnel将查询数据库获取最大值。

partition_lower_bound [BigDecimal]

扫描的分区列最小值,如果未设置,SeaTunnel将查询数据库获取最小值。

partition_num [int]

不推荐使用,正确的做法是通过split.size控制分割数

我们需要将其分割成多少分割,只支持正整数。默认值是任务并行度。

小贴士

如果表不能分割(例如,表没有主键或唯一索引,并且未设置partition_column),它将以单一并发运行。

使用table_path替换query以读取单个表。如果需要读取多个表,请使用table_list

任务示例

此示例查询测试"数据库"中的type_bin 'table' 16数据,并以单一并行方式查询其所有字段。您还可以指定要查询的字段以最终输出到控制台。

定义运行时环境

env {
parallelism = 4
job.mode = "BATCH"
}
source{
Jdbc {
url = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true"
driver = "com.mysql.cj.jdbc.Driver"
connection_check_timeout_sec = 100
user = "root"
password = "123456"
query = "select * from type_bin limit 16"
}
}

transform {
# 如果您想了解更多关于如何配置seatunnel和查看transform插件完整列表的信息,
# 请访问 https://seatunnel.apache.org/docs/transform-v2/sql
}

sink {
Console {}
}

按主键或唯一索引并行

配置table_path将开启自动分割,您可以配置split.*来调整分割策略

env {
  parallelism = 4
  job.mode = "BATCH"
}
source {
    Jdbc {
        url = "jdbc:mysql://localhost/test?serverTimezone=GMT%2b8"
        driver = "com.mysql.cj.jdbc.Driver"
        connection_check_timeout_sec = 100
        user = "root"
        password = "123456"
        query = "select * from type_bin"
        partition_column = "id"
        split.size = 10000
        # Read start boundary
        #partition_lower_bound = ...
        # Read end boundary
        #partition_upper_bound = ...
    }
}

sink {
  Console {}
}

指定查询边界并行

指定查询数据的上下边界更为高效

env {
  parallelism = 4
  job.mode = "BATCH"
}
source {
    Jdbc {
        url = "jdbc:mysql://localhost/test?serverTimezone=GMT%2b8"
        driver = "com.mysql.cj.jdbc.Driver"
        connection_check_timeout_sec = 100
        user = "root"
        password = "123456"
        table_path = "testdb.table1"
        query = "select * from testdb.table1"
        split.size = 10000
    }
}

sink {
  Console {}
}

读取多个表

配置table_list将开启自动分割,您可以配置split.*来调整分割策略

env {
  job.mode = "BATCH"
  parallelism = 4
}
source {
  Jdbc {
    url = "jdbc:mysql://localhost/test?serverTimezone=GMT%2b8"
    driver = "com.mysql.cj.jdbc.Driver"
    connection_check_timeout_sec = 100
    user = "root"
    password = "123456"

    table_list = [
      {
        table_path = "testdb.table1"
      },
      {
        table_path = "testdb.table2"
        # 使用查询文件过滤行和列
        query = "select id, name from testdb.table2 where id > 100"
      }
    ]
    #where_condition= "where id > 100"
    #split.size = 8096
    #split.even-distribution.factor.upper-bound = 100
    #split.even-distribution.factor.lower-bound = 0.05
    #split.sample-sharding.threshold = 1000
    #split.inverse-sampling.rate = 1000
  }
}

sink {
  Console {}
}

多表读取

配置table_list将开启自动分割,您可以配置split.*来调整分割策略

env {
  job.mode = "BATCH"
  parallelism = 4
}
source {
  Jdbc {
    url = "jdbc:mysql://localhost/test?serverTimezone=GMT%2b8"
    driver = "com.mysql.cj.jdbc.Driver"
    connection_check_timeout_sec = 100
    user = "root"
    password = "123456"

    table_list = [
      {
        table_path = "testdb.table1"
      },
      {
        table_path = "testdb.table2"
        # 使用查询文件过滤行和列
        query = "select id, name from testdb.table2 where id > 100"
      }
    ]
    #where_condition= "where id > 100"
    #split.size = 8096
    #split.even-distribution.factor.upper-bound = 100
    #split.even-distribution.factor.lower-bound = 0.05
    #split.sample-sharding.threshold = 1000
    #split.inverse-sampling.rate = 1000
  }
}

sink {
  Console {}
}

以上是视频中出现的代码及文档说明,大家可以结合视频中的讲解进行实操,最后如果您对录制感兴趣,请继续往下阅读

如何参与Demo录制?

提交您的Demo

  1. 准备您的演示:选择一个您熟悉的连接器,准备一个5到10分钟的视频演示。确保视频清晰展示了如何配置和使用该连接器,解决了什么问题,以及可能的最佳实践。
  2. 提交视频:请添加社区同学微信18819063834上传您的视频和相关描述。

本文由 白鲸开源科技 提供发布支持!

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Flink CDC(Change Data Capture)是一种数据同步技术,可以从源数据库中捕获变更数据并将其同步到目标数据库中。DorisDB是一款分布式数据仓库,支持海量数据的存储和查询分析。下面以将数据从DorisDB同步DorisDB为例,介绍如何使用Flink CDC实现数据同步。 1. 准备工作 在开始之前,需要安装好以下工具和环境: - DorisDB - Flink - Flink CDC 2. 创建数据源 首先需要创建一个数据源,用于从DorisDB中读取数据。可以使用Flink的JDBCInputFormat来读取DorisDB中的数据。在Flink中,可以使用以下代码创建一个JDBCInputFormat: ``` JDBCInputFormat jdbcInputFormat = JDBCInputFormat.buildJDBCInputFormat() .setDrivername(driverName) .setDBUrl(dbUrl) .setUsername(username) .setPassword(password) .setQuery("SELECT * FROM table") .finish(); ``` 其中,driverName、dbUrl、username和password是DorisDB的连接信息,"SELECT * FROM table"是要读取的表的SQL语句。 3. 创建数据同步任务 接下来需要创建一个Flink的数据流任务,用于将从DorisDB中读取的数据同步到另一个DorisDB中。可以使用Flink的DataStream API来实现数据同步。以下是一个示例代码: ``` StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Row> sourceStream = env.createInput(jdbcInputFormat); DataStream<Row> sinkStream = sourceStream.map(new MapFunction<Row, Row>() { @Override public Row map(Row value) throws Exception { // 对数据进行转换 return value; } }); DorisDBOutputFormat dorisDBOutputFormat = new DorisDBOutputFormat(); dorisDBOutputFormat.setDrivername(driverName); dorisDBOutputFormat.setDBUrl(dbUrl); dorisDBOutputFormat.setUsername(username); dorisDBOutputFormat.setPassword(password); dorisDBOutputFormat.setTable(table); dorisDBOutputFormat.setBatchSize(batchSize); sinkStream.writeUsingOutputFormat(dorisDBOutputFormat); env.execute(); ``` 其中,sourceStream是从DorisDB中读取的数据流,sinkStream是经过转换后要写入到DorisDB的数据流。可以使用map函数对数据进行转换。DorisDBOutputFormat是一个自定义的输出格式,用于将数据写入到DorisDB中。在这个示例代码中,DorisDBOutputFormat的batchSize属性设置为1000,表示每1000条数据进行一次批量写入。 4. 运行数据同步任务 将上述代码保存为一个Java程序,并使用Flink命令行工具提交任务即可开始数据同步。在执行过程中,Flink CDC会自动监控DorisDB中的数据变更,将新增、修改、删除等操作同步到目标数据库中。 总的来说,使用Flink CDC实现DorisDB数据同步是一种高效、可靠的方式。它不仅可以帮助用户快速实现数据同步,还可以提高数据的实时性和准确性,为企业的数据分析和决策提供有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SeaTunnel

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

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

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

打赏作者

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

抵扣说明:

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

余额充值