基于Flink如何实现解决数据库分库分表任务拆分

发布时间:2021-12-06 17:33:36 作者:柒染
来源:亿速云 阅读:219

这篇文章将为大家详细讲解有关基于Flink如何实现解决数据库分库分表任务拆分,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

1、场景描述


例如订单库进行了分库分表,其示例如下图所示:

基于Flink如何实现解决数据库分库分表任务拆分  

现在的需求是希望创建一个任务就将数据同步到MQ集群,而不是为每一个数据库实例单独创建一个任务,将其数据导入到MQ集群,因为同步任务除了库不同之外,表的结构、数据映射规则都是一致的。    

2、flinkx 的解决方案详解


 
2.1 fink Stream API 开发基本流程

使用 Flink Stream API 编程的通用步骤如下图所示:

基于Flink如何实现解决数据库分库分表任务拆分  

温馨提示:有关 Stream API 的详细内容将在后续的文章中展开,本文主要是关注 InputFormatSourceFunction,重点关注数据源的拆分。

 
2.2 flinkx Reader(数据源)核心类图

基于Flink如何实现解决数据库分库分表任务拆分


在 flinkx 中将不同的数据源封装成一个个 Reader,其基类为 BaseDataReader,上图中主要罗列了如下几个关键的类体系: 
2.3 flinkx Reader构建 DataStream 流程

经过了上面类图的梳理,大家应该 flink 中提到的上述类的含义有了一个大概的理解,但如何运用呢?接下来将通过查阅 flinkx 的 DistributedJdbcDataReader(BaseDataReader的子类)的 readData 调用流程,体会一下其使用方法。

基于Flink如何实现解决数据库分库分表任务拆分  

基本遵循创建 InputFormat、从而创建对应的 SourceFunction,然后通过 StreamExecutionEnvironment 的 addSource 方法将 SourceFunction 创建对应的 DataStreamSource。    
2.4 flinkx 针对数据库分库分表任务拆分解决方案

正如本文开头部分的场景描述那样,某订单系统被设计成4库8表,每一个库(Schema)中包含2个表,如何提高数据导出的性能呢,如何提高数据的抽取性能呢?通常的解决方案如下:

  1. 首先按库按表进行拆分,即4库8表,可以进行切分8份,每一个数据分配处理一个实例中的1个表。

  2. 单个表的数据抽取再进行拆分,例如按ID进行取模进一步分解。

flinkx 就是采取上面的策略,我们来看一下其具体做法。

基于Flink如何实现解决数据库分库分表任务拆分  

Step1:首先先根据数据库实例、表进行拆分,按表维度组织成一个 DataSource 列表,后续将基于这个原始数据执行拆分算法。

接下来具体的任务拆分在 InputFormat 中实现,本实例在 DistributedJdbcInputFormat 的 createInputSplitsInternal 中。

基于Flink如何实现解决数据库分库分表任务拆分  
DistributedJdbcInputFormat#createInputSplitsInterna l  

Step2:根据分区创建 inputSplit 数组,这里分区的概念就相当于上文提到方案中的第一条。
基于Flink如何实现解决数据库分库分表任务拆分  
DistributedJdbcInputFormat#createInputSplitsInternal  

Step3:如果指定了 splitKey 的任务拆分算法,首先 DistributedJdbcInputSplit 继承自 GenericInputSplit,总分区数为 numPartitions,然后生成数据库的参数,这里主要是生成 SQL Where 语句中的 splitKey mod totalNumberOfPartitions = partitionNumber,其中 splitKey 为分片键,例如 id,而 totalNumberOfPartitions 表示分区总数,partitionNumber 表示当前分片的序号,通过 SQL 取模函数进行数据拆分。
基于Flink如何实现解决数据库分库分表任务拆分  
DistributedJdbcInputFormat#createInputSplitsInternal  

Step4:如果未指定表级别的数据拆分键,则拆分策略是对 sourceList 进行拆分,即一些分区处理其中几个表。

关于 flinkx 中关于任务切分的介绍就到这里了。

 

3、总结


本文主要是基于 flinkx 介绍 MySQL 分库分表情况下如何基于 flink 进行任务切分,简单介绍了 Flink 中关于基本的编程范式、InputFormat、SourceFunction 的基本类体系。

关于基于Flink如何实现解决数据库分库分表任务拆分就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. 数据库中的垂直拆分
  2. 数据库中如何实现分库分表

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

flink 数据库

上一篇:ORA-00205错误的解决方法是什么

下一篇:Hyperledger Fabric中Chaincode的Invoke功能怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》