当前位置:   article > 正文

基于 Flink 实现解决数据库分库分表任务拆分(1)_flink 分库分表

flink 分库分表

1、场景描述


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

在这里插入图片描述

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

2、flinkx 的解决方案详解


2.1 fink Stream API 开发基本流程

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

在这里插入图片描述

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

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

在这里插入图片描述

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

  • InputFormat

flink 核心API,主要是对输入源进行数据切分、读取数据的抽象,其核心接口说明如下:

  • void configure(Configuration parameters)

对输入源进行额外的配置,该方法在 Input 的生命周期中只需调用一次。

  • BaseStatistics getStatistics(BaseStatistics cachedStatistics)

返回 input 的统计数据,如果不需要统计,在实现的时候可以直接返回 null。

  • T[] createInputSplits(int minNumSplits)

对输入数据进行数据切片,使之支持并行处理,数据切片相关类体系见:InputSplit。

  • InputSplitAssigner getInputSplitAssigner(T[] inputSplits)

获取 InputSplit 分配器,主要是在具体执行任务时如何获取下一个 InputSplit,其声明如下图所示:

在这里插入图片描述

  • void open(T split)

根据指定的数据分片 (InputSplit) 打开数据通道。为了加深对该方法的理解,下面看一下 Flinkx 关于 jdbc、es 的写入示例:

在这里插入图片描述

  • boolean reachedEnd()

数据是否已结束,在 Flink 中通常 InputFormat 的数据源通常表示有界数据 (DataSet)。

  • OT nextRecord(OT reuse)

从通道中获取下一条记录。

  • void close()

关闭。

  • InputSplit

数据分片根接口,只定义了如下方法:

  • int getSplitNumber()

获取当前分片所在所有分片中的序号。

本文先简单介绍一下其通用实现子类:GenericInputSplit。

  • int partitionNumber

当前 split 所在的序号

  • int totalNumberOfPartitions

总分片数

为了方便理解我们可以思考一下如下场景,对于一个数据量超过千万级别的表,在进行数据切分时可以考虑使用10个线程,即切割成 10分,那每一个数据线程查询数据时可以 id % totalNumberOfPartitions = partitionNumber,进行数据读取。

  • SourceFunction

Flink 源的抽象定义。

  • RichFunction

富函数,定义了生命周期、可获取运行时环境上下文。

  • ParallelSourceFunction

支持并行的 source function。

  • RichParallelSourceFunction

并行的富函数

  • InputFormatSourceFunction

Flink 默认提供的 RichParallelSourceFunction 实现类,可以当成是RichParallelSourceFunction 的通用写法,其内部的数据读取逻辑由 InputFormat 实现。

  • BaseDataReader

flinkx 数据读取基类,在 flinkx 中将所有的数据读取源封装成 Reader 。

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

拿到字节跳动offer后,简历被阿里捞了起来,二面迎来了P9"盘问"

加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

[外链图片转存中…(img-02bAI7w0-1714651477094)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/779503
推荐阅读
相关标签
  

闽ICP备14008679号