Flink & Iceberg 系列之 FLink 整库入湖探索

该文详细描述了如何通过Flink的CDC功能从Mysql数据库实现整库同步到Iceberg数据湖的过程,包括创建Catalog、Database和Iceberg表,以及设置CDC读取源。目前的方法是一对一同步,计划改进为单任务整库同步,并自动生成Iceberg表结构。文章提到了使用JDBC获取源库信息和通过StreamAPI订阅BinLog来提升效率。最后列出了相关依赖jar包,并展示了查询结果验证了数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

  • 实现Mysql整库同步入湖, 并自动创建表结构
  • 实现Flink读取Iceberg实现准实时数仓搭建

整库入湖

数据准备

Mysql 数据库表信息如下:

create table cdc_tb_1 (
id int primary key auto_increment,
name varchar(20)
);

create table cdc_tb_3 (
id int primary key auto_increment,
name varchar(20)
);

create table cdc_tb_2 (
id int primary key auto_increment,
age int
);

-- 写入数据 
insert into cdc_tb_3(name) values('z1'),('z2'),('z3');
insert into cdc_tb_2(age) values(11),(22),(33);
insert into cdc_tb_1(name) values('z1'),('z2'),('z3');

写入流程

-- 创建 Catalog 
CREATE CATALOG iceberg WITH (
  'type'='iceberg',
  'catalog-type'='hive',
  'uri'='thrift://xxxxx:9083',
  'clients'='5',
  'property-version'='1',
  'warehouse'='/warehouse/tablespace/managed/iceberg'
)

-- 创建 Database
CREATE DATABASE IF NOT EXISTS iceberg.flink_iceberg

-- 创建 Iceberg 表
CREATE TABLE `iceberg`.`flink_iceberg`.`cdc_test` (
  `id`  INT UNIQUE COMMENT 'unique id',
  `name` STRING NOT NULL,
 PRIMARY KEY(`id`) NOT ENFORCED
) with ('format-version'='2', 'write.upsert.enabled'='true')

-- 使用CDC读取MysqlTable
CREATE TABLE cdc_test (
     id INT,
     name STRING,
     PRIMARY KEY(id) NOT ENFORCED
     ) WITH (
     'connector' = 'mysql-cdc',
     'hostname' = 'xxxxx',
     'port' = '3306',
     'scan.startup.mode' = 'initial',
     'username' = 'root',
     'password' = 'xxxxxx',
     'database-name' = 'xxx',
     'table-name' = 'xxxx')

-- 写入SQL
insert into `iceberg`.`flink_iceberg`.`cdc_test` select * from cdc_test;

该方法只能一对一进行表数据的接入,在实际生产中效率较低;为了提高入湖效率,探索实现整库入湖实现,功能实现规划:

  • 实现单任务整库入湖
  • 实现Iceberg表自动创建(根据源库表结构)

实现:

  • 通过 JDBC 获取源库的表信息:表名,表结构,字段,主键等信息
  • image.png
  • 通过Stream API 实现 CDC 整库BinLog订阅
// 订阅整库 
MySqlSource<RowData> build = MySqlSource.<RowData>builder()
    .hostname("xxx")
    .username("xxx")
    .password("xxxx")
    .startupOptions(StartupOptions.initial())
    .databaseList("flink_iceberg")
    .tableList(list.toArray(new String[]{}))
    .deserializer(new CustomDebeziumDeserializationSchema(schemaHashMap))
    .build();
  • 通过表信息自动创建对应的 Iceberg 表
  • 根据表名分流写入 Iceberg
// 写入 DataStreamApi 写入方式
FlinkSink.forRowData(dataStream)
          .distributionMode(DistributionMode.HASH)
          .upsert(true)
          .tableLoader(tableLoader)
          .append();

最终效果图:
image.png
使用Spark集成查询结果:

  • 查看Iceberg表已成功创建存在

image.png

  • 查询数据 (select * from hive.flink_iceberg.cdc_tb_1;)

image.png

  • 查询数据 (select * from hive.flink_iceberg.cdc_tb_2;)

image.png

  • 查询数据 (select * from hive.flink_iceberg.cdc_tb_3;)

image.png
和Mysql中一至。

集成Jar包

Flink 版本1.17.1 iceberg 1.3.0(基于master分支打包)

connect-api-2.7.0.jar
flink-cep-1.17.1.jar
flink-connector-files-1.17.1.jar
flink-connector-jdbc-3.1.0-1.17.jar
flink-connector-mysql-cdc-2.4.0.jar_bk
flink-csv-1.17.1.jar
flink-dist-1.17.1.jar
flink-json-1.17.1.jar
flink-scala_2.12-1.17.1.jar
flink-shaded-hadoop-3-uber-3.1.1.7.1.1.0-565-9.0.jar
flink-sql-connector-mysql-cdc-2.4.0.jar
flink-table-api-java-uber-1.17.1.jar
flink-table-planner-loader-1.17.1.jar
flink-table-runtime-1.17.1.jar
hive-exec-3.1.0.3.1.0.0-78.jar
iceberg-flink-runtime-1.17-1.3.0-SNAPSHOT.jar
iceberg-flink-runtime-1.17-1.4.0-SNAPSHOT.jar
kafka-clients-2.7.0.jar
libfb303-0.9.3.jar
libthrift-0.13.0.jar
log4j-1.2-api-2.17.1.jar
log4j-api-2.17.1.jar
log4j-core-2.17.1.jar
log4j-slf4j-impl-2.17.1.jar
mysql-connector-java-5.1.47.jar
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值