🗒️FlinkCDC 全量数据分片过程
2023-10-12
| 2023-10-13
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
FlinkCDC 将数据同步过程分成全量 + 增量两个阶段,而在全量阶段,使用多分片的方式对数据进行读取,用户可以通过设置scan.incremental.snapshot.chunk.size 参数设置每个分片的大小。
用于数据切分的列目前只支持单个列,不支持多个列组合的方式。然后按照这个列的数据类型,可以分成数值型(整型)和非数值型(非整型)两种。Flink CDC 对于整型的判断方法如下,也就是 BIGINT、INTEGER、DECIMAL 三种:

整型字段

查询出切分列的最小值,最大值,按 chunkSize 大小将数据均匀划分成左闭右开的区间,因为切分列为整数类型,根据当前chunk 起始位置、chunkSize 大小,直接计算 chunk 的结束位置。
此时

动态分片

这种分片方式是建立在切分列自增的理想情况,但是在切分列分布比较稀疏的情况下,此时 min、max 间隔较大,会导致分片划分过多。并且,落在每个分片的数据量也会比较少,处理效率变低。
为了适配这种情况,FlinkCDC 设计了动态分片间隔的计算方法,需要再额外获取到全量数据的总数量 count,此时 (max - min) / count 约等于出现一条数据的间隔,因此:
使用 COUNT 的方式获取数据总量比较低效,在 MYSQL 里提供了下面这条 SQL
获取统计数据。
当然,如果数据分布极端不合理,例如 min、max 间隔很大,但是数据却只集中分布在某一段区间,这种动态分片的方式可能会导致 OOM 的问题。
在 FlinkCDC 里,通过设置 chunk-key.even-distribution.factor.upper-boundchunk-key.even-distribution.factor.lower-bound 限制了 chunkSize 相乘系数的上下界。
参数
默认值
chunk-key.even-distribution.factor.upper-bound
100
chunk-key.even-distribution.factor.lower-bound
0.05

非整型字段

切分为非数值类型,同样划分成多个左闭右开的区间。每次划分需要对未划分的数据按主键进行升序排列,取出前一个 chunk 的结束值为当前 chunk 的起始位置,并且通过 limit 限制每次取出的范围。
 
  • FlinkCDC
  • FlinkCDC 如何读取增量数据线程堆溢出会影响其他线程吗
    Loading...
    目录