基于Paimon的StarRocks"增量"按天分区刷新验证
背景
注意:此处的增量指的T+1天的增量刷新,并非paimon数据湖中有增量数据,物化视图只刷新增量数据。
StarRocks并未支持到能增量物化视图刷新,仅支持按照该分区定时刷新该分区数据,这是极为遗憾的,因为按照该分区每一次都全量刷新,是及其损耗性能的。
举个例子:订单表今天有1W条数据,按照天刷新,也就是每一次都要刷新1W条数据。
但是该种刷新方式,对于T+1天的场景还是基本能满足要求的,毕竟BI场景中,T+1天的场景非常常见。
paimon 1.0
StarRocks 3.3.8
flink 1.20
paimon-s3-1.0.0.jar
放入lib目录paimon-flink-action-1.0.0.jar
放入lib目录paimon-flink-1.20-1.0.0.jar
放入lib目录
目标:
- 将mysql表同步到paimon
使用paimon cdc同步mysql源数据orders表到数据湖作为我们数仓的贴源层ods_orders,并且设置paimon表分区按天。
- 通过paimon catalog,创建按天分区增量刷新的物化视图
在Starrocks创建基于paimon分区表的物化视图dwd_orders_mv,验证StarRocks是否能够按照Paimon的分区进行按天增量刷新。
实践
mysql表准备
mysql准备一张orders表,字段有一个创建时间
created
,后续同步到paimon将使用该字段进行按天分区1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17-- 创建orders表
CREATE TABLE `orders` (
`id` int NOT NULL AUTO_INCREMENT,
`created` datetime DEFAULT NULL,
`type` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`k1` int DEFAULT NULL,
`v2` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 造数据
INSERT INTO `orders` VALUES(1,'2024-11-01 11:17:41',"1",1,1),(2,'2024-11-02 22:17:41',"1",1,1),(3,'2024-11-02 22:17:41',"1",1,1);
-- 查询数据
SELECT * FROM orders;
id created type k1 v2
1 2024-11-01 11:17:41 1 1 1
2 2024-11-02 22:17:41 1 1 1
3 2024-11-02 22:17:41 1 1 1paimon cdc 设置分区键进行同步 (ods_orders)
partition_keys 设置按天分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20./bin/flink run -d \
./lib/paimon-flink-action-1.0.0.jar \
mysql_sync_table \
--warehouse s3://lakehouse/paimon-dev \
--database test \
--table ods_orders \
--primary_keys id,pt \
--partition_keys pt \
--computed_column 'pt=date_format(created, yyyyMMdd)' \
--mysql_conf hostname=192.168.103.113 \
--mysql_conf username=root \
--mysql_conf password=XXX \
--mysql_conf database-name=test \
--mysql_conf table-name='orders' \
--catalog_conf s3.endpoint=http://192.168.103.113:9010 \
--catalog_conf s3.path.style.access=true \
--catalog_conf s3.access-key=yTaSTipLTvJY86qkJGEO \
--catalog_conf s3.secret-key=SisnaqWR0uMxa52PjeZGq5HilQA1a3PRXDz4R8v4 \
--table_conf bucket=1 \
--table_conf changelog-producer=inputStarRocks创建按天分区的物化视图 (dwd_orders_mv)
- 创建物化视图
1
2
3
4
5
6
7
8
9
10
11DROP MATERIALIZED VIEW `test`.`dwd_orders_mv`;
CREATE MATERIALIZED VIEW `test`.`dwd_orders_mv`
COMMENT "dwd-order"
REFRESH ASYNC START('2024-01-01 10:00:00') EVERY (interval 3 MINUTE)
PARTITION BY pt
ORDER BY( created )
PROPERTIES ( "partition_refresh_number" = "30" )
AS
SELECT
*
FROM paimon.test.ods_orders so - 查询物化视图
1
2
3
4
5
6SELECT * FROM `test`.`dwd_orders_mv`
created id type k1 v2 pt
2024-11-01 11:17:41 1 1 1 1 20241101
2024-11-02 22:17:41 3 1 1 1 20241102
2024-11-02 22:17:41 2 1 1 1 20241102
- 创建物化视图
mysql更新数据
1
insert into orders values(4,'2024-11-03 11:17:41',"1",1,1)
查询分区刷新情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16SELECT
*
FROM
information_schema.task_runs
WHERE
task_name IN (
SELECT
TASK_NAME
FROM
information_schema.materialized_views
WHERE
TABLE_NAME IN ( "dwd_orders_mv" ))
ORDER BY
TASK_NAME ASC,
CREATE_TIME DESC
LIMIT 10
结论
mysql新增2024-11-03这一天的数据后,paimon cdc同步到paimon表,存入20241103分区,starrocks正常按天分区刷新2024-11-03号的数据。