凯发k8国际首页 电批,自动机用电批,无铅焊台,自动机焊台,防静手腕带电报警器,电批计数电源,防漏打计数电源

凯发k8国际首页

首页 > 客户案例

大数据训练:Flink CDC 高频面试题

发布时间:2022-05-11 17:36:21 来源:凯发k8国际首页 阅读 1

  的技能,Flink 从 1.11 版别开端原生支撑 CDC 数据(changelog)的处理,现在现已是非常老练的改动数据处理计划。

  Flink CDC Connectors 是 Flink 的一组 Source 联接器,是 Flink CDC 的中心组件,这些联接器担任从MySQL、PostgreSQL、Oracle、MongoDB等数据库读取存量前史数据和增量改动数据。在 2020 年 7 月开源,社区坚持了适当高速的开展,均匀两个月一个版别,在开源社区的重视度持续走高,也逐步有越来越多的用户运用 Flink CDC 来快速构建实时数仓和数据湖。

  (1)MySQL CDC 支撑百亿级数据的超大表,支撑 MySQL 悉数数据类型,经过联接池复用等优化大幅提高稳定性。一起供给支撑无锁算法,并发读取的 DataStream API,用户能够借此建立整库同步链路;

  (2)新增 Oracle CDC 联接器, 支撑从 Oracle 数据库获取全量前史数据和增量改动数据;

  (3)新增 MongoDB CDC 联接器,支撑从 MongoDB 数据库获取全量前史数据和增量改动数据;

  (4)一切联接器均支撑metadata column 功用, 用户经过 SQL 就能够拜访库名,表名,数据改动时间等 meta 信息,这对分库分表场景的数据集成非常有用;

  在 Flink CDC 2.0 版别里,MySQL CDC 联接器供给了无锁算法,并发读取,断点续传等高档特性, 一起处理了许多出产实践上的痛点,随后许多用户开端投入运用并大规划上线。

  对主键对错数值、Snowflake ID、稀少主键、联合主键等场景,经过动态剖析源表的主键散布的均匀程度,依据散布的均匀程度自动地核算分片巨细,让切片愈加合理,让分片核算更快。

  动态分片算法能够很好地处理稀少主键场景下 分片过多 的,联合主键分片过大 等问题,让每个分片包括的行【重视尚硅谷,轻松学IT】数尽量维持在用户指定的 chunk size,这样用户经过 chunk size 就能操控分片巨细和分片数量,无需关怀主键类型。

  经过引进联接池办理数据库联接,一方面降低了数据库联接数,别的也避免了极点场景导致的联接走漏。

  在 2.0 版别中,无锁算法,并发读取等功用只在 SQL API 上透出给用户,而 DataStream API 未透出给用户。

  这些目标遵从 FLIP-33 的联接器目标标准,能够检查 FLIP-33 获取每个目标的意义。其间,currentEmitEventTimeLag 目符号载的是 Source 发送一条记载到下流节点的时间点和该记载在 DB 里产生时间点差值,用于衡量数据从 DB 产生到脱离 Source 节点的推迟。用户能够经过该目标判别 source 是否进入了 binlog 读取阶段:

  即当该目标为 0 时,代表还在全量前史读取阶段;当大于 0 时,则代表进入了 binlog 读取阶段。

  Oracle 也是运用很广泛的数据库, Oracle CDC 联接器支撑捕获并记载 Oracle 数据库服务器中产生的行级改动。

  LogMiner 是 Oracle 数据库供给的一个剖析东西,该东西能够解析 Oracle Redo 日志文件,然后将数据库的数据改动日志解析成改动事情输出。经过 LogMiner 方法时,Oracle 服务器对解析日志文件的进程做了严厉的资源约束,所以对规划特别大的表,数据解析会比较慢,长处是 LogMiner 是能够免费运用的。

  Oracle CDC 联接器现已将底层的 CDC 细节屏蔽,整个实时同步链路,用户只需求几行 Flink SQL,不必开发任何 Java 代码,就能够将 Oracle 的数据改动实时捕获并发送。

  此外,Oracle CDC 联接器也供给两种作业方式,即读取全量数据 + 增量改动数据,和只读取增量改动数据。Flink CDC 结构均确保一条不多一条不少的 exactly-once 语义。

  运用 MongoDB CDC 联接器,用户只需求声明如下 Flink SQL 就能实时捕获 MongoDB 数据库中的全量和增量改动数据,凭借 Flink 强壮的集成才干,用户能够非常方便地将 MongoDB 中的数据实时同步到 Flink 支撑的一切下流存储。

  整个数据捕获进程,用户不需求学习 MongoDB 的副本机制和原理,极大地简化了流程,降低了运用门槛。MongoDB CDC 也支撑两种发动方式:

  此外,MongoDB CDC 还供给了丰厚的装备和优化参数,关于出产环境来说,这些装备和参数能够极大地提高实时链路的功用和稳定性。

  在 Flink cdc 1.x 全量 + 增量读取的版别规划中, flink cdc 底层选用 debezium 作为收集东西,Debezium 为确保数据一致性,经过对读取的数据库或许表进行加锁,而加锁是产生在全量阶段。

  这样做的意图是确保 binlog 的开端方位和读取到的当时 schema 能够一一对应,由于表的 schema 是会改动的,比方删去列或许添加列。

  在读取这两个信息后,SnapshotReader 会在可重复读业务里读取全量数据,在全量数据读取完结后,会发动 BinlogReader 从读取的 binlog 开端方位开端增量读取,然后确保全量数据 + 增量数据的无缝联接。

  (2) 该指令履行前有必要等候一切正在运转的 select 完结,一切等候履行的 update 会等候更久。更坏的状况是,在等候正在运转 select 完结时,DB 实际上处于不可用状况,即使是新参加的 SELECT 也会被阻挠,这是Mysql Query Cache机制。

  假定每个 Chunk 的步长为 10,依照这个规矩进行切分,只需求把这些 Chunk 的区间做成左开右闭或许左闭右开的区间,确保联接后的区间能够等于表的主键区间即可。

  由于每个 chunk 只担任自己主键范围内的数据,不难推导,只需能够确保每个 Chunk 读取的一致性,就能确保整张表读取的一致性,这便是无锁算法的基本原理。

  Chunk 读取算法是经过在 DB 保护一张信号表,再经过信号表在 binlog 文件中打点,记载每个 chunk 读取前的 Low Position (低位点) 和读取完毕之后 High Position (高位点) ,在低位点和高位点之间去查询该 Chunk 的全量数据。在读取出这一部分 Chunk 的数据之后,再将这 2 个位点之间的 binlog 增量数据合并到 chunk 所属的全量数据,然后得到高位点时间,该 chunk 对应的全量数据。

  Flink CDC 2.x 结合本身的状况,在 Chunk 读取算法上做了去信号表的改善,不需求额定保护信号表,经过直接读取 binlog 位点代替在 binlog 中做符号的功用,全体的 chunk 读算法描绘如下图所示:

  调查图片中右下角终究的输出,会发现在消费该 chunk 的 binlog 时,呈现的 key 是 k2、k3、k5,咱们前往 buffer 将这些 key 做符号。

  关于 k1、k4、k6、k7 来说,在高位点读取完毕之后,这些【重视尚硅谷,轻松学IT】记载没有改动过,所以这些数据是能够直接输出的;

  例如,k2 终究的成果是 119,那么只需求输出 +(k2,119),而不需求中心产生过改动的数据。

  (1)在快照阶段,依据表的主键和表行的巨细将 快照(Snapshot) 切割成多个 快照块(Snapshot Chunk) ,然后将 快照块 被分配给多个 快照读取器(SourceReader)。

  (2)每个 快照读取器 运用 块读取算法(单个 Chunk 的一致性读)读取其接收到的块,并将读取的数据发送到下流。源办理块的进程状况改动为(已完结或未完结),因而 快照阶段的源能够支撑块等级的检查点。假如产生毛病,能够康复源并持续从最终完结的块中读取块。

  (3)在一切快照块完结后,源将持续在单个使命(task)中读取 binlog。为了确保快照记载和 binlog 记载的大局数据次序,binlog reader 会开端读取数据,直到 snapshot chunks 完结后有一个完好的 checkpoint,以确保一切的快照数据都被下流消费了。

  Flink 定时为源履行检查点,在毛病搬运的状况下,作业将从前次成功的检查点状况重新发动并康复,并确保刚好一次语义。

  Dynamic Table 是 Flink SQL 界说的动态表,动态表和流的概念是对等的参照上图,流能够转换成动态表,动态表也能够转换成流。

  在 Flink SQL 中,数据从一个算子以 Changelog Stream 的方式流向别的一个算子时,恣意时间的 Changelog Stream 能够翻译为一个表,也能够翻译为一个流。

  MySQL 数据库的一张表一切的改动都记载在 binlog 日志中,假如一向对表进行更新,binlog 日志流也一向会追加,数据库中的表就适当于 binlog 日志流在某个时间点物化的成果;日志流便是将表的改动数据持续捕获的成果。

  挑选 Debezium 作为 Flink CDC 的底层收集东西,原因是 debezium 支撑全量同步,也支撑增量同步,一起也支撑全量 + 增量的同步,非常灵敏,一起依据日志的 CDC 技能使得供给 Exactly-Once 成为或许。

  经过对 Flink SQL 的内部数据结构 RowData 和 Debezium 的数据结构进行比照,能够发现两者非常相似。

  (2)Debezium 的数据结构,也有一个相似的元数据 op 字段, op 字段的取值也有四种,分别是 c、u、d、r,各自对应 create、update、delete、read。关于代表更新操作的 u,其数据部分一起包括了前镜像 (before) 和后镜像 (after)。

  由于 flink cdc 底层选用 debezium 作为收集东西,在 flink cdc 1.x 全量 + 增量读取的版别规划中,Debezium 为确保数据一致性,经过对读取的数据库或许表进行加锁,可是加锁在数据库层面上是一个非常高危的操作。大局锁或许导致数据库锁住,表级锁会锁住表的读,DBA 一般不给锁权限。

  在全量读取阶段,假如表非常大 (亿等级),读取时间在小时乃至天等级,用户不能经过添加资源去提高作业速度。

  Flink CDC 读取分为两个阶段,全量读取和增量读取,现在全量读取阶段是不支撑 checkpoint 的;

  因而会存在一个问题:当咱们同步全量数据时,假定需求 5 个小时,当咱们同步了 4 小时的时分作业失利,这时分就需求重新开端,再读取 5 个小时。

  大部分用户运用的场景都是全量 + 增量同步,加锁是产生在全量阶段,意图是为了确认全量阶段的初始位点,确保增量 + 全量完结一条不多,一条不少,然后确保数据一致性。

  从下图中咱们能够剖析大局锁和表锁的一些加锁流程,左面赤色线条是锁的生命周期,右边是 MySQL 敞开可重复读业务的生命周期。

  这样做的意图是确保 binlog 的开端方位和读取到的当时 schema 能够一一对应,由于表的 schema 是会改动的,比方删去列或许添加列。

  在读取这两个信息后,SnapshotReader 会在可重复读业务里读取全量数据,在全量数据读取完结后,会发动 BinlogReader 从读取的 binlog 开端方位开端增量读取,然后确保全量数据 + 增量数据的无缝联接。

  表级锁有个特征:锁提早开释了可重复读的业务默许会提交,所以锁需求比及全量数据读完后才干开释。

  (2) 该指令履行前有必要等候一切正在运转的 select 完结,一切等候履行的 update 会等候更久。更坏的状况是,在等候正在运转 select 完结时,DB 实际上处于不可用状况,即使是新参加的 SELECT 也会被阻挠,这是Mysql Query Cache机制。

  Chunk 读取算法是经过在 DB 保护一张信号表,再经过信号表在 binlog 文件中打点,记载每个 chunk 读取前的 Low Position (低位点) 和读取完毕之后 High Position (高位点) ,在低位点和高位点之间去查询该 Chunk 的全量数据。在读取出这一部分 Chunk 的数据之后,再将这 2 个位点之间的 binlog 增量数据合并到 chunk 所属的全量数据,然后得到高位点时间,该 chunk 对应的全量数据。

  Flink CDC 2.x 结合本身的状况,在 Chunk 读取算法上做了去信号表的改善,不需求额定保护信号表,经过直接读取 binlog 位点代替在 binlog 中做符号的功用,全体的 chunk 读算法描绘如下图所示:

  11 假如有多个表分了许多不同的 Chunk,且这些 Chunk 分发到了不同的 task 中,那么怎么分发 Chunk 并确保大局一致性读呢?

  在快照阶段,依据表的主键和表行的巨细将 快照(Snapshot) 切割成多个 快照块(Snapshot Chunk) 。快照块 被分配给多个 快照读取器(SourceReader)。每个 快照读取器 运用 块读取算法(单个 Chunk 的一致性读) 读取其接收到的块,并将读取的数据发送到下流。源办理块的进程状况(已完结或未完结),因而 快照阶段的源能够支撑块等级的检查点。假如产生毛病,能够康复源并持续从最终完结的块中读取块。

  Flink 定时为源履行检查点,在毛病搬运的状况下,作业将从前次成功的检查点状况重新发动并康复,并确保刚好一次语义。

上一篇:螺丝锁附-螺丝锁附批发、促销价格、产地货源 - 阿里巴巴 下一篇:钣金规划20年规划经验总结实打实的干货不看就亏大了!

Powered by MetInfo 5.3.18 ©2008-2020 www.metinfo.cn