【实战02】flinksql mysql真正的批量插入

问题由来

这个问题困扰两天了,一个很简单的flink任务,从kafka读出数据,然后开窗计算之后将结果存入mysql.
数据量级:每秒70万条数据,按理说数据量不断太大,但是sink端口一致产生被压问题。经过分析最后发现是往mysql的写入速率太慢,导致checkpoint 超时,甚至任务失败。 那么是怎么发现mysql的写入产生的背压呢? 因为我们之前有一个任务数据量是现在这个任务的100倍左右,但是从来没有出现过背压,理论上当前任务也不应该出现背压。 这两个任务的逻辑极其相似,唯一不同的大方在于之前写入的是kafka, 现在写入的是mysql. 那么就只可能是sink到mysql太慢导致的背压。
于是带着这个问题去官网找mysql sink的批量参数,看下图:
【实战02】flinksql mysql真正的批量插入_第1张图片
加上这两个参数之后,我以为就可以实现批量插入了,但是结果依旧产生背压,也就是说我配置的这两个参数没有真的起作用,那么问题出在哪里呢? 带着这个问题最后看到了一篇文章:https://blog.csdn.net/qq_34283987/article/details/107694587

结果代码

原来是jdbc协议中的参数rewriteBatchedStatements在作祟。 于是最后我的flinksql改成了下面的样子,问题得到解决。

/*
    目标表连接
*/
CREATE TABLE `dwd_pre_distinct_act_user01`
(
    `window_start`     timestamp(0),
    `window_end`       timestamp(0),
	`user_id` 		   BIGINT
) WITH (
      'connector' = 'jdbc',
      'url' = 'jdbc:mysql://am-k1a0pwc6lggw9c43770270.ap-southeast-5.ads.aliyuncs.com:3306/domino_dwd?rewriteBatchedStatements=true',
      'driver' = 'com.mysql.cj.jdbc.Driver',
      'username' = 'root',
      'password' = 'xxx',
      'table-name' = 'user_info_log',
      'sink.buffer-flush.max-rows' = '20000',
      'sink.buffer-flush.interval' = '3000'
);

/*
    源端表连接
*/
CREATE TABLE `app_login_log`
(
	`login_date` TIMESTAMP(3),
	`user_id` BIGINT,
    WATERMARK FOR login_date as login_date - INTERVAL '0.1' SECOND
) WITH (
      'connector' = 'kafka',
      'topic' = 'game_log',
      'properties.group.id' = 'group_01',
      'properties.bootstrap.servers' ='xxx:9092',
	  'scan.startup.mode' = 'latest-offset',
      'format' = 'json'
      );
	  
insert into dwd_pre_distinct_act_user01
(window_start, window_end, user_id)
select
	window_start,
	window_end,
	user_id
from table(
	tumble(table app_login_log, descriptor(login_date), interval '10' seconds))
group by window_start, window_end, user_id

你可能感兴趣的:(Flink实战经验,mysql,kafka,数据库)