实践数据湖iceberg 第四十一课 测试维表更新场景

本文详述了在Flink SQL中测试维表(如MySQL表)更新的场景,包括不同checkpoint策略、lookup join的正确配置与语法,以及数据湖表(如Iceberg)作为驱动表时的proctime属性测试。测试结论表明,使用lookup join能感知到维表的变化。

系列文章目录

实践数据湖iceberg 第一课 入门
实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式
实践数据湖iceberg 第三课 在sqlclient中,以sql方式从kafka读数据到iceberg
实践数据湖iceberg 第四课 在sqlclient中,以sql方式从kafka读数据到iceberg(升级版本到flink1.12.7)
实践数据湖iceberg 第五课 hive catalog特点
实践数据湖iceberg 第六课 从kafka写入到iceberg失败问题 解决
实践数据湖iceberg 第七课 实时写入到iceberg
实践数据湖iceberg 第八课 hive与iceberg集成
实践数据湖iceberg 第九课 合并小文件
实践数据湖iceberg 第十课 快照删除
实践数据湖iceberg 第十一课 测试分区表完整流程(造数、建表、合并、删快照)
实践数据湖iceberg 第十二课 catalog是什么
实践数据湖iceberg 第十三课 metadata比数据文件大很多倍的问题
实践数据湖iceberg 第十四课 元数据合并(解决元数据随时间增加而元数据膨胀的问题)
实践数据湖iceberg 第十五课 spark安装与集成iceberg(jersey包冲突)
实践数据湖iceberg 第十六课 通过spark3打开iceberg的认知之门
实践数据湖iceberg 第十七课 hadoop2.7,spark3 on yarn运行iceberg配置
实践数据湖iceberg 第十八课 多种客户端与iceberg交互启动命令(常用命令)
实践数据湖iceberg 第十九课 flink count iceberg,无结果问题
实践数据湖iceberg 第二十课 flink + iceberg CDC场景(版本问题,测试失败)
实践数据湖iceberg 第二十一课 flink1.13.5 + iceberg0.131 CDC(测试成功INSERT,变更操作失败)
实践数据湖iceberg 第二十二课 flink1.13.5 + iceberg0.131 CDC(CRUD测试成功)
实践数据湖iceberg 第二十三课 flink-sql从checkpoint重启
实践数据湖iceberg 第二十四课 iceberg元数据详细解析
实践数据湖iceberg 第二十五课 后台运行flink sql 增删改的效果
实践数据湖iceberg 第二十六课 checkpoint设置方法
实践数据湖iceberg 第二十七课 flink cdc 测试程序故障重启:能从上次checkpoint点继续工作
实践数据湖iceberg 第二十八课 把公有仓库上不存在的包部署到本地仓库
实践数据湖iceberg 第二十九课 如何优雅高效获取flink的jobId
实践数据湖iceberg 第三十课 mysql->iceberg,不同客户端有时区问题
实践数据湖iceberg 第三十一课 使用github的flink-streaming-platform-web工具,管理flink任务流,测试cdc重启场景
实践数据湖iceberg 第三十二课 DDL语句通过hive catalog持久化方法
实践数据湖iceberg 第三十三课 升级flink到1.14,自带functioin支持json函数
实践数据湖iceberg 第三十四课 基于数据湖icerberg的流批一体架构-流架构测试
实践数据湖iceberg 第三十五课 基于数据湖icerberg的流批一体架构–测试增量读是读全量还是仅读增量
实践数据湖iceberg 第三十六课 基于数据湖icerberg的流批一体架构–update mysql select from icberg语法是增量更新测试
实践数据湖iceberg 第三十七课 kakfa写入iceberg的 icberg表的 enfource ,not enfource测试
实践数据湖iceberg 第三十八课 spark sql, Procedures语法进行数据治理(小文件合并,清理快照)
实践数据湖iceberg 第三十九课 清理快照前后数据文件变化分析
实践数据湖iceberg 第四十课 iceberg的运维(合并文件、合并元数据、清理历史快照)
实践数据湖iceberg 第四十一课 测试维表更新场景
实践数据湖iceberg 更多的内容目录



前言

flink sql 中kafka 表join mysql表,发现无法检测到mysql表到新增、update, 百度多篇文章,写得好像可以解决问题,但又没有详细的解决方法步骤,故而写本人,期后来者以填坑。本文记录测试思路、流程与结论。
测试结论:1.kaka做为驱动表源,可以通过lookup的方式,感知mysql维表的变化 2.iceberg表可以使用lookup方式,感知mysql维表的变化


一、测试场景描述

测试目的: 测试flink维表新增数据的影响
测试场景: 维度退化
kafka流读mysql维表,关联mysql维表信息, 对维表进行新增,观察flink是否能发现新增的维表信息。

构造测试场景:

kafka表: 用户ID,产品id
产品维表:产品id, 产品名称
sql查询: 用户ID,产品id, 产品名称

测试mysql中增加维度信息,kafka表能否关联上。

二、测试flink维表新增数据的影响

2.1 execution.checkpointing.checkpoints-after-tasks-finish.enabled: true 进行测试

测试代码如下:


create table t_order(
    user_id int,
    product_id int
) WITH (
      'connector' = 'kafka',
      'topic' = 't_order',
      'properties.bootstrap.servers' = 'hadoop201:9092,hadoop203:9092,hadoop204:9092',
      'properties.group.id' = 'sourceGroup6',
      'scan.startup.mode' = 'earliest-offset',
      'csv.field-delimiter' =',',
      'csv.ignore-parse-errors' = 'true',
      'format' = 'csv'
);

create table dim_product(
    product_id int,
    product_name varchar(30),
    PRIMARY KEY(product_id) NOT ENFORCED
 ) with(
 'connector' = 'jdbc',
 'url' = 'jdbc:mysql://hadoop201:3306/db_xxzh',
 'username' = 'db_xxzh',
 'password' = '123456',
 'table-name' = 'dim_product',
  'lookup.cache.ttl'='120s',
  'lookup.cache.max-rows' = '1000000'
 );




CREATE TABLE print_table (
  user_id int,
  product_id int,
  product_name varchar(30)
) WITH (
      'connector' = 'print'
);

insert into print_table
    select user_id,t.product_id,product_name from t_order  t left join dim_product for system_time as of t.proctime AS d   on t.product_id=d.product_id;

Checkpoints With Finished Tasks 的介绍:
https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=184615159

Checkpoints With Finished Tasks 开启:
${FLINK_HOME}/conf/flink-conf.yaml 配置
execution.checkpointing.checkpoints-after-tasks-finish.enabled: true

测试流程记录:

kafka生成:

1,1
1,3

查看flink的日志:

+I[1, 1, productNam101]
+I[1, 3, null]

数据库中增加一条3:
mysql> insert into dim_product values(3,‘productName03’);
Query OK, 1 row affected (0.01 sec)

kafka生产:
1,3

日志结果:
+I[5, 3, null]

结果: 维度表的新数据,没有被查询到!


2.2 同样的场景测试 execution.checkpointing.checkpoints-after-tasks-finish.enabled: false

kafka生产:

6,6

结果:

+I[6, 6, null]

mysql增加6的维度
kafka生产:

7,6

结果如下:

+I[7, 6, null]

测试结果: 维度表的新数据,没有被查询到!


2.3 把mysql维表改为lookup表,直接join

百度一些文章,说可以用lookup 表来感知mysql表的变化,测试一下:

本人使用flink1.14版本,lookup 只需要增加如下属性。 (不同版本,属性不一样)
增加如下两个属性
‘lookup.cache.ttl’=‘120s’,
‘lookup.cache.max-rows’ = ‘1000000’
···

create table dim_product(
product_id int,
product_name varchar(30),
PRIMARY KEY(product_id) NOT ENFORCED
) with(
‘connector’ = ‘jdbc’,
‘url’ = ‘jdbc:mysql://hadoop201:3306/db_xxzh’,
‘username’ = ‘db_xxzh’,
‘password’ = ‘123456’,
‘table-name’ = ‘dim_product’,
‘lookup.cache.ttl’=‘120s’,
‘lookup.cache.max-rows’ = ‘1000000’
);
重复以上测试,结果没什么区别。

···

2.4 使用lookup join 正确的语法,感知维表到变化

mysql表到数据:

在这里插入图片描述
kafka输入:

1,3
3,9

观察flink结果如下;

+I[1, 3, productName03]
+I[3, 9, null]

往mysql增加一条数据:

 mysql> insert into dim_product values(9,'productName09');
Query OK, 1 row affected (0.01 sec)

kafka生产

4,9

观察结果:

+I[4, 9, productName09]

测试结论: 使用lookup up表,并且使用正确的lookup 的select 语法,才能产生loop up的效果

2.5 looup up 表正确的语法

步骤2.4 中的测试代码如下:


create table t_order(
    user_id int,
    product_id int,
    proctime as PROCTIME()
) WITH (
      'connector' = 'kafka',
      'topic' = 't_order',
      'properties.bootstrap.servers' = 'hadoop201:9092,hadoop203:9092,hadoop204:9092',
      'properties.group.id' = 'sourceGroup6',
      'scan.startup.mode' = 'earliest-offset',
      'csv.field-delimiter' =',',
      'csv.ignore-parse-errors' = 'true',
      'format' = 'csv'
);

create table dim_product(
    product_id int,
    product_name varchar(30),
    PRIMARY KEY(product_id) NOT ENFORCED
 ) with(
 'connector' = 'jdbc',
 'url' = 'jdbc:mysql://hadoop201:3306/db_xxzh',
 'username' = 'db_xxzh',
 'password' = '123456',
 'table-name' = 'dim_product',
  'lookup.cache.ttl'='120s',
  'lookup.cache.max-rows' = '1000000'
 );




CREATE TABLE print_table (
  user_id int,
  product_id int,
  product_name varchar(30)
) WITH (
      'connector' = 'print'
);

insert into print_table
    select user_id,t.product_id,product_name from t_order  t left join dim_product for system_time as of t.proctime AS d   on t.product_id=d.product_id;





代码特点:

  1. 驱动表增加 proctime as PROCTIME() 属性
  2. 维表增加 ‘lookup.cache.ttl’=‘120s’,
    ‘lookup.cache.max-rows’ = ‘1000000’ 的定义。
  3. insert 语句中,需要在维表后面增加 for system_time as of t.proctime AS 。

本解决方案来源于:源码的lookup test case. 具体名称:LookupJoinJsonPlanITCase。

测试维表数据更新的,look up 表是否能感知到

在这里插入图片描述

测试结果

+I[11, 9, ????09]9的productName是产品名称09, 中文乱码
+I[2, 9, ????09]。    把9productName改为newProductName09, 立即往kafka发数据,说明缓存起作用

过2分钟再往kafka发送,结果如下

+I[3, 9, newProductName09]

测试结果: 说明缓存失效,重新发起查询数据

三、 lookup表与非look up维表的在dag上的不同

1.look up 表是产生一个source任务

在这里插入图片描述

2. 非look up 表

在这里插入图片描述
维表的任务状态是fininshed.

四、数据湖表能否作为驱动表,增加 proctime as PROCTIME() 属性?

测试目的: 驱动表是数据湖表,能否join mysql 并感知数据的变化。
测试思路: 把kafka表转为iceberg表,再使用iceberg表join 维表进行测试。

4.1 测试步骤1:构建一个带proctime的iceberg表, 失败

在这里插入图片描述
没有这个proctime属性,无法使用look up 功能。。。

4.2 动态构建proctime属性

insert into print_table
    select user_id,t.product_id,product_name
    from 
    (select *,    proctime() as proctime from hive_iceberg_catalog.ods_base.t_order_ib    
     /*+ OPTIONS('streaming'='true', 'monitor-interval'='10s')*/ )  t 
    left join dim_product for system_time as of t.proctime AS d   on t.product_id=d.product_id;


proctime() 是flink的一个内部函数,可以直接调用这个function,生产当前时间。

4.3 FOR SYSTEM_TIME AS OF table1.proctime​​ 语法介绍

目前,仅支持INNER JOIN与LEFT JOIN。在join的时候需要使用 ​​FOR SYSTEM_TIME AS OF​​ ,其中table1.proctime表示table1的proctime处理时间属性(计算列)。使用​​FOR SYSTEM_TIME AS OF table1.proctime​​表示当左边表的记录与右边的维表join时,只匹配当前处理时间维表所对应的的快照数据。

五.维表作为 view进行测试

5.1.维表需要经过加工得到,经过测试,不支持 (select * from dim_product where match=1 类似这种语法构建维表)

5.2 测试基于view实现

创建一个view的维表:
create view if not exists v_dim_product as select * from dim_product where match_flag=1;

测试是否支持,发现不支持。

Flink SQL> insert into print_table
>     select user_id,t.product_id,product_name
>     from 
>     (select *,    proctime() as proctime from hive_iceberg_catalog.ods_base.t_order_ib     /*+ OPTIONS('streaming'='true', 'monitor-interval'='10s')*/ )  t 
>     left join  hive_catalog.mysql.v_dim_product for system_time as of t.proctime AS d   on t.product_id=d.product_id;
> 
[INFO] Submitting SQL update statement to the cluster...
[ERROR] Could not execute SQL statement. Reason:
org.apache.flink.table.planner.codegen.CodeGenException: Unsupported call: __TEMPORAL_JOIN_CONDITION_PRIMARY_KEY(INT NOT NULL) 
If you think this function should be supported, you can create an issue and start a discussion for it.

在这里插入图片描述

总结

1.kaka做为驱动表源,可以通过lookup的方式,感知mysql维表的变化
2.iceberg表可以使用lookup方式,感知mysql维表的变化

要想在百度八亿网页的数据海洋中找到你所要的信息, 人工方式需要1200 多人年,而百度搜索技术不到1 秒钟。人 们被数据淹没,却渴望知识。商务智能技术已成为当今企业 获取竞争优势的源泉之一。商务智能通常被理解为将企业中 现有的数据转化为知识,帮助企业做出明智决策的IT工具集。 其中数据仓库、OLAP和数据挖掘技术是商务智能的重要组成 部分。商务智能的关键在于如何从众多来自不同企业运作系 统的数据中,提取有用数据,进行清理以保证数据的正确性, 然后经过抽取、转换、装载合并到一个企业级的数据仓库里, 从而得到企业数据的一个全局视图,并在此基础上利用适当 的查询分析、数据挖掘、OLAP等技术工具对其进行分析处理, 最终将知识呈现给管理者,为管理者的决策过程提供支持。 可见,数据仓库技术是商业智能系统的基础,在智能系统开 发过程中,星型模式设计又是数据仓库设计的基本概念之一。 星型模式是由位于中央的事实和环绕在四周的 组成的,事实中的每一行与每个的多行建立关系, 查询结果是通过将一个或者多个与事实结合之后产 生的,因此每一个和事实都有一个“一对多”的连 接关系,的主键是事实中的外键。随着企业交易量 的越来越多,星型模式中的事实数据记录行数会不断增加, 而且交易数据一旦生成历史是不能改变的,即便不得不变动, 如对发现以前的错误数字做修改,这些修改后的数据也会作 为一行新纪录添加到事实中。与事实总是不断增加记录 的行数不同,的变化不仅是增加记录的行数,而且据 需求不同属性本身也会发生变化。本文着重讨论数据 仓库的变化类型及其更新技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值