LakeSoul 与 Flink 集成使用指南
前言
LakeSoul 作为新一代湖仓一体框架,与 Flink 的深度集成为实时数据湖场景提供了强大支持。本文将详细介绍如何在 Flink 中使用 LakeSoul,包括环境配置、表操作、数据读写等核心功能。
环境准备
版本兼容性
| LakeSoul 版本 | 兼容 Flink 版本 | |---------------|-----------------| | 3.0.0+ | 1.20 | | 2.4.x+ | 1.17 | | 2.1.x-2.3.x | 1.14 |
PostgreSQL 配置
LakeSoul 依赖 PostgreSQL 作为元数据存储,需要在 Flink 配置文件中添加以下配置:
containerized.master.env.LAKESOUL_PG_DRIVER: com.lakesoul.shaded.org.postgresql.Driver
containerized.master.env.LAKESOUL_PG_USERNAME: root
containerized.master.env.LAKESOUL_PG_PASSWORD: root
containerized.master.env.LAKESOUL_PG_URL: jdbc:postgresql://localhost:5432/test_lakesoul_meta?stringtype=unspecified
containerized.taskmanager.env.LAKESOUL_PG_DRIVER: com.lakesoul.shaded.org.postgresql.Driver
containerized.taskmanager.env.LAKESOUL_PG_USERNAME: root
containerized.taskmanager.env.LAKESOUL_PG_PASSWORD: root
containerized.taskmanager.env.LAKESOUL_PG_URL: jdbc:postgresql://localhost:5432/test_lakesoul_meta?stringtype=unspecified
注意事项:
- 需要根据实际部署修改数据库连接信息
- 在 Session 模式下提交作业时,需要在客户端单独配置环境变量
基础操作
创建表
LakeSoul 表支持主键、分区等特性,以下是创建表的示例:
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'
);
关键参数说明:
PARTITIONED BY
:指定范围分区字段PRIMARY KEY
:定义主键(支持联合主键)hashBucketNum
:哈希分桶数(主键表必须设置)use_cdc
:是否启用CDC格式path
:表数据存储路径
数据操作
插入数据
-- 批量插入
INSERT INTO `lakesoul`.`default`.test_table
VALUES (1, 'AAA', 98, '2023-05-10', 'China');
-- 流式插入(从其他表读取)
INSERT INTO `lakesoul`.`default`.test_table
SELECT * FROM source_table;
更新数据(批模式)
UPDATE `lakesoul`.`default`.test_table
SET score = 100
WHERE id = 1;
删除数据(批模式)
DELETE FROM `lakesoul`.`default`.test_table
WHERE id = 1;
流模式注意事项:
- 需要设置合理的检查点间隔(建议≥1分钟)
- 设置正确的时区:
SET 'table.local-time-zone' = 'Asia/Shanghai'; SET 'execution.checkpointing.interval' = '2min';
数据查询
1. 全量查询
SELECT * FROM `lakesoul`.`default`.test_table
WHERE region='China' AND `date`='2023-05-10';
2. 快照查询
查询指定时间点前的所有数据:
SELECT * FROM `lakesoul`.`default`.test_table
/*+ OPTIONS('readtype'='snapshot', 'readendtime'='2023-05-01 15:20:15', 'timezone'='Asia/Shanghai')*/
WHERE region='China';
3. 增量范围查询
查询指定时间范围内的增量数据:
SELECT * FROM `lakesoul`.`default`.test_table
/*+ OPTIONS('readtype'='incremental', 'readstarttime'='2023-05-01 15:15:15', 'readendtime'='2023-05-01 15:20:15', 'timezone'='Asia/Shanghai')*/
WHERE region='China';
4. 流式查询
持续读取指定时间点后的新数据:
SELECT * FROM `lakesoul`.`default`.test_table
/*+ OPTIONS('timezone'='Asia/Shanghai')*/
WHERE region='China';
5. Lookup Join
LakeSoul 支持 Flink 的 Lookup Join,适合小维度表关联场景:
-- 创建维度表
CREATE TABLE `lakesoul`.`default`.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 `lakesoul`.`default`.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 `lakesoul`.`default`.orders) as o
JOIN `lakesoul`.`default`.customers FOR SYSTEM_TIME AS OF o.proctime
ON c_id = o_cid;
执行模式切换
LakeSoul 支持在 Flink 的批流模式下运行,可通过以下命令切换:
-- 切换为流模式
SET execution.runtime-mode = streaming;
SET 'execution.checkpointing.interval' = '1min';
-- 切换为批模式
SET execution.runtime-mode = batch;
总结
LakeSoul 与 Flink 的深度集成提供了强大的实时数据湖能力,支持:
- 完整的 CRUD 操作
- 多种查询模式(全量/快照/增量/流式)
- 高效的 Lookup Join
- 灵活的批流一体执行
通过合理配置和使用这些功能,可以构建高效的实时数据湖解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考