本文主要是介绍FlinkX 分片读取原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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)
具体实现逻辑及代码如下:
@Overridepublic 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++)</
这篇关于FlinkX 分片读取原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!