基于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 1
  • paimon 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=input
  • StarRocks创建按天分区的物化视图 (dwd_orders_mv)

    • 创建物化视图
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      DROP 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
      6
      SELECT * 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
    16
    SELECT
    *
    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

    NIrRU2

结论

MFk96Z
mysql新增2024-11-03这一天的数据后,paimon cdc同步到paimon表,存入20241103分区,starrocks正常按天分区刷新2024-11-03号的数据。

参考

mysql到paimon并基于starrocks做异步分区物化视图全流程