LakeSoul Flink Connector 使用指南
LakeSoul 是一个高性能的湖仓一体存储框架,其 Flink Connector 实现了 Flink 的动态表接口,开发者可以通过 Flink 的 DataStream API、Table API 或 SQL 来读写 LakeSoul 数据,同时支持流式和批处理模式。本文将详细介绍如何使用 LakeSoul Flink Connector 进行数据操作。
1. 环境准备
1.1 版本兼容性
- LakeSoul 2.3.0 版本对应 Flink 1.14
- LakeSoul 2.4.0 及以上版本对应 Flink 1.17
- LakeSoul 3.0.0 及以上版本对应 Flink 1.20
1.2 依赖配置
下载 lakesoul-flink-1.20-VAR::VERSION.jar 文件作为依赖。
1.3 启动 Flink SQL Client
bin/sql-client.sh embedded -j lakesoul-flink-1.20-VAR::VERSION.jar
2. 表操作
2.1 创建 Catalog
LakeSoul 提供了专门的 Catalog 实现,用于管理 LakeSoul 表。
2.1.1 使用 Flink SQL
CREATE CATALOG lakesoul WITH('type'='lakesoul');
USE CATALOG lakesoul;
SHOW DATABASES;
USE `default`;
SHOW TABLES;
2.1.2 使用 Table API
TableEnvironment tEnv = TableEnvironment.create(EnvironmentSettings.inBatchMode());
Catalog lakesoulCatalog = new LakeSoulCatalog();
tEnv.registerCatalog("lakeSoul", lakesoulCatalog);
tEnv.useCatalog("lakeSoul");
tEnv.useDatabase("default");
2.2 创建表
LakeSoul 支持创建多种类型的表,包括带主键表、不带主键表、带分区表以及 CDC 格式表。
2.2.1 关键参数说明
| 参数 | 说明 | 示例 | |------|------|------| | PARTITIONED BY | 指定分区字段 | PARTITIONED BY (date
) | | PRIMARY KEY | 指定主键 | PRIMARY KEY (id
, name
) NOT ENFORCED | | connector | 数据源类型 | 'connector'='lakesoul' | | hashBucketNum | 主键表必须设置的哈希桶数量 | 'hashBucketNum'='4' | | path | 表存储路径 | 'path'='file:///tmp/lakesoul/flink/sink/test' | | use_cdc | 是否为 CDC 格式表 | 'use_cdc'='true' |
2.2.2 创建表示例
CREATE TABLE `lakesoul`.`default`.test_table (
`id` INT,
name STRING,
score INT,
`date` STRING,
region STRING,
PRIMARY KEY (`id`,`name`) NOT ENFORCED
) PARTITIONED BY (`region`,`date`)
WITH (
'connector'='lakesoul',
'hashBucketNum'='4',
'use_cdc'='true',
'path'='file:///tmp/lakesoul/flink/sink/test'
);
2.3 删除表
DROP TABLE IF EXISTS test_table;
3. 数据写入
3.1 必要配置
- 必须开启检查点配置:
SET 'execution.checkpointing.checkpoints-after-tasks-finish.enabled' = 'true';
- 流式写入需设置检查点间隔(建议大于1分钟):
SET 'execution.checkpointing.interval' = '2min';
- 设置时区:
SET 'table.local-time-zone' = 'Asia/Shanghai';
3.2 写入方式
3.2.1 批处理写入
INSERT INTO `lakesoul`.`default`.test_table
VALUES (1, 'AAA', 98, '2023-05-10', 'China');
3.2.2 流式写入
INSERT INTO `lakesoul`.`default`.test_table
SELECT * FROM `lakesoul`.`cdcsink`.source_table;
3.3 批量更新与删除
LakeSoul 2.4+ 版本支持 Flink 批处理模式的更新和删除操作:
-- 更新操作
UPDATE test_table SET score = 100 WHERE id = 1;
-- 删除操作
DELETE FROM test_table WHERE id = 2;
注意:更新操作不允许修改主键和分区列的值。
4. 数据查询
4.1 执行模式设置
-- 流模式
SET execution.runtime-mode = streaming;
-- 批模式
SET execution.runtime-mode = batch;
4.2 查询选项
查询时可通过 /*+ OPTIONS() */
指定查询参数:
| 参数 | 说明 | 示例 | |------|------|------| | readtype | 读取类型:增量(incremental)或快照(snapshot) | 'readtype'='incremental' | | discoveryinterval | 流式增量读取发现新数据间隔(ms) | 'discoveryinterval'='10000' | | readstarttime | 开始读取时间戳 | 'readstarttime'='2023-05-01 15:15:15' | | readendtime | 结束读取时间戳 | 'readendtime'='2023-05-01 15:20:15' | | timezone | 时间戳时区 | 'timezone'='Asia/Shanghai' |
4.3 查询示例
4.3.1 全量读取
-- 批模式
SET execution.runtime-mode = batch;
SELECT * FROM test_table WHERE region='China' AND `date`='2023-05-10';
-- 流模式
SET execution.runtime-mode = streaming;
SELECT * FROM test_table WHERE id > 3;
4.3.2 快照读取
SELECT * FROM test_table /*+ OPTIONS('readtype'='snapshot', 'readendtime'='2023-05-01 15:20:15')*/
WHERE region='China';
4.3.3 增量范围读取
SELECT * FROM test_table /*+ OPTIONS('readtype'='incremental', 'readstarttime'='2023-05-01 15:15:15', 'readendtime'='2023-05-01 15:20:15')*/
WHERE region='China';
4.3.4 流式读取
SELECT * FROM test_table /*+ OPTIONS('readstarttime'='2023-05-01 15:15:15')*/
WHERE region='China';
4.4 Lookup Join
LakeSoul 支持 Flink 的 Lookup Join,适用于小维度表关联场景:
-- 创建维度表
CREATE TABLE customers (
`c_id` INT,
`name` STRING,
PRIMARY KEY (`c_id`) NOT ENFORCED
) WITH (
'connector'='lakesoul',
'hashBucketNum'='1',
'path'='file:///tmp/lakesoul/flink/sink/customers'
);
-- 创建事实表
CREATE TABLE orders (
`o_id` INT,
`o_c_id` INT,
PRIMARY KEY (`o_id`) NOT ENFORCED
) WITH (
'connector'='lakesoul',
'hashBucketNum'='1',
'path'='file:///tmp/lakesoul/flink/sink/orders',
'lookup.join.cache.ttl'='60s'
);
-- Lookup Join 查询
SELECT `o_id`, `c_id`, `name`
FROM (SELECT *, proctime() as proctime FROM orders) as o
JOIN customers FOR SYSTEM_TIME AS OF o.proctime
ON c_id = o_c_id;
5. 配置参数
可在 flink-conf.yaml
中配置以下参数,或在建表时指定:
| 配置项 | 默认值 | 说明 | |-------|-------|------| | lakesoul.file.rolling.rows | 5000000 | 单个文件最大行数 | | lakesoul.file.rolling.time.ms | 300000 | 创建新文件间隔(ms) | | lakesoul.rolling.check.interval | 60000 | 检查间隔(ms) |
通过本文介绍,开发者可以充分利用 LakeSoul Flink Connector 实现高效的数据湖操作,满足批处理和流处理的各种场景需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考