FlinkX 分片读取原理
在数据同步工具中,将数据从源头读取到数据缓存是最重要的一环之一,算是左膀
。所以在整个流程,从技术场景上,一定要支持数据的分片与并行读取、流控,从业务角度上,需要支持脏值处理与增量读取。
而今天重点来探讨一下分片读取的原理。
分片原理
分片是将待读取的数据平均分配,尽量的使各个分片任务均衡,不会让数据倾斜从而导致个别节点的同步压力过大(硬件-网卡、cpu等)。
下面是配置了一个读取通道为3的作业配置示例:
"speed": {
"channel": 3,
"bytes": 0
},
重点类&方法
-
InputSplit
(输入分片类)表示输入的分片,并且会在运行过程中进行传输,所以需要进行序列化,是Flink的数据读取核心类。 -
BaseRichInputFormat#createInputSplits
创建分片,会对错误进行捕获,包装输出,此方法实际是FLink中的InputSplitSource
org.apache.flink.api.common.io.InputFormat.java org.apache.flink.core.io.InputSplitSource.java 由上可以的得知,真实的分片逻辑有具体的实现子类进行提供,将
InputSplit
结果返回给调度系统,而分片的调度由Flink底层进行提供(因为reader读取数据返回的是DataStream)。如下图所示的关系Flink、FlinkX在分片逻辑中的关系 -
BaseRichInputFormat#createInputSplitsInternal
创建实际的分片抽象方法,由实际driver创建
通用JDBC 的分片策略
JDBC分片中的几个概念:
- splitKey
- numPartitions
Math.max(speed.channel,speed.readerChannel)
具体实现逻辑及代码如下:
@Override
public InputSplit[] createInputSplitsInternal(int minPart) throws IOException {
DistributedJdbcInputSplit[] inputSplits = new DistributedJdbcInputSplit[numPartitions];
if(splitKey != null && splitKey.length()> 0){
Object[][] parmeter = DbUtil.getParameterValues(numPartitions);
for (int j = 0; j < numPartitions; j++)</