《Flink 詳解》系列(已完結(jié)),共包含以下 10 10 10 篇文章:
- 【大數(shù)據(jù)】Flink 詳解(一):基礎(chǔ)篇(架構(gòu)、并行度、算子)
- 【大數(shù)據(jù)】Flink 詳解(二):核心篇 Ⅰ(窗口、WaterMark)
- 【大數(shù)據(jù)】Flink 詳解(三):核心篇 Ⅱ(狀態(tài) State)
- 【大數(shù)據(jù)】Flink 詳解(四):核心篇 Ⅲ(Checkpoint、Savepoint、Exactly-Once)
- 【大數(shù)據(jù)】Flink 詳解(五):核心篇 Ⅳ(反壓、序列化、內(nèi)存模型)
- 【大數(shù)據(jù)】Flink 詳解(六):源碼篇 Ⅰ(作業(yè)提交、Local 方式、YARN 方式、K8s 方式)
- 【大數(shù)據(jù)】Flink 詳解(七):源碼篇 Ⅱ(作業(yè)圖、執(zhí)行圖、調(diào)度、作業(yè)生命周期、Task Slot)
- 【大數(shù)據(jù)】Flink 詳解(八):SQL 篇 Ⅰ(Flink SQL)
- 【大數(shù)據(jù)】Flink 詳解(九):SQL 篇 Ⅱ(Flink SQL CEP)
- 【大數(shù)據(jù)】Flink 詳解(十):SQL 篇 Ⅲ(Flink SQL CDC)
?? 如果您覺得這篇文章有用 ?? 的話,請給博主一個(gè)一鍵三連 ?????? 吧 (點(diǎn)贊 ??、關(guān)注 ??、收藏 ??)?。?!您的支持 ?????? 將激勵(lì) ?? 博主輸出更多優(yōu)質(zhì)內(nèi)容?。?!
102.Flink CDC 了解嗎?什么是 Flink SQL CDC Connectors?
在 Flink 1.11
引入了 CDC 機(jī)制,CDC 的全稱是 Change Data Capture
,用于捕捉數(shù)據(jù)庫表的增刪改查操作,是目前非常成熟的同步數(shù)據(jù)庫變更方案。
Flink CDC Connectors 是 Apache Flink 的一組源連接器,是可以從 MySQL、PostgreSQL 數(shù)據(jù)直接讀取全量數(shù)據(jù)和增量數(shù)據(jù)的 Source Connectors,開源地址:https://github.com/ververica/flink-cdc-connectors。
目前(1.13
版本)支持的 Connectors 如下:
另外支持解析 Kafka 中 debezium-json
和 canal-json
格式的 Change Log,通過 Flink 進(jìn)行計(jì)算或者直接寫入到其他外部數(shù)據(jù)存儲(chǔ)系統(tǒng)(比如 Elasticsearch),或者將 Changelog Json 格式的 Flink 數(shù)據(jù)寫入到 Kafka。
Flink CDC Connectors 和 Flink 之間的版本映射:
103.Flink CDC 原理介紹一下
在最新 CDC 調(diào)研報(bào)告中,Debezium
和 Canal
是目前最流行使用的 CDC 工具,這些 CDC 工具的核心原理是 抽取數(shù)據(jù)庫日志 獲取變更。在經(jīng)過一系列調(diào)研后,目前 Debezium(支持全量、增量同步,同時(shí)支持 MySQL、PostgreSQL、Oracle 等數(shù)據(jù)庫),使用較為廣泛。
Flink SQL CDC 內(nèi)置了 Debezium 引擎,利用其抽取日志獲取變更的能力,將 changelog
轉(zhuǎn)換為 Flink SQL 認(rèn)識的 RowData 數(shù)據(jù)。(以下右側(cè)是 Debezium 的數(shù)據(jù)格式,左側(cè)是 Flink 的 RowData 數(shù)據(jù)格式)。
RowData 代表了一行的數(shù)據(jù),在 RowData 上面會(huì)有一個(gè)元數(shù)據(jù)的信息 RowKind,RowKind 里面包括了 插入(+I
)、更新前(-U
)、更新后(+U
)、刪除(-D
),這樣和數(shù)據(jù)庫里面的 binlog
概念十分類似。
通過 Debezium 采集的數(shù)據(jù),包含了舊數(shù)據(jù)(before
)和新數(shù)據(jù)行(after
)以及元數(shù)據(jù)信息(source
),op
的 u
表示是 update
更新操作標(biāo)識符(op
字段的值 c
,u
,d
,r
分別對應(yīng) create
,update
,delete
,read
),ts_ms
表示同步的時(shí)間戳。
104.通過 CDC 設(shè)計(jì)一種 Flink SQL 的 ETL 一體化的實(shí)時(shí)數(shù)倉
設(shè)計(jì)圖如下:
通過 Flink CDC Connectors 替換 Debezium + Kafka
的數(shù)據(jù)采集模塊,實(shí)現(xiàn) Flink SQL 的 ETL 一體化,以 MySQL 為 Source 源,F(xiàn)link CDC 中間件為插件,ES、Kafka 或者其他為 Sink,這樣設(shè)計(jì)的優(yōu)點(diǎn)如下:
- 開箱即用,簡單易上手。
- 減少維護(hù)的組件,簡化實(shí)時(shí)鏈路,減輕部署成本。
- 減小端到端延遲。
- Flink 自身支持
Exactly Once
的讀取和計(jì)算。 - 數(shù)據(jù)不落地,減少存儲(chǔ)成本。
- 支持全量和增量流式讀取。
-
binlog
采集位點(diǎn)可回溯。
105.Flink SQL CDC 如何實(shí)現(xiàn)一致性保障(源碼分析)
Flink SQL CDC 用于獲取數(shù)據(jù)庫變更日志的 Source 函數(shù)是 DebeziumSourceFunction
,且最終返回的類型是 RowData,該函數(shù)實(shí)現(xiàn)了 CheckpointedFunction
,即通過 Checkpoint 機(jī)制來保證發(fā)生 failure
時(shí)不會(huì)丟數(shù),實(shí)現(xiàn) exactly once
語義,這部分在函數(shù)的注釋中有明確的解釋。
/**
* The {@link DebeziumSourceFunction} is a streaming data source that pulls captured change data
* from databases into Flink.
* 通過Checkpoint機(jī)制來保證發(fā)生failure時(shí)不會(huì)丟數(shù),實(shí)現(xiàn)exactly once語義
* <p>The source function participates in checkpointing and guarantees that no data is lost
* during a failure, and that the computation processes elements "exactly once".
* 注意:這個(gè)Source Function不能同時(shí)運(yùn)行多個(gè)實(shí)例
* <p>Note: currently, the source function can't run in multiple parallel instances.
*
* <p>Please refer to Debezium's documentation for the available configuration properties:
* https://debezium.io/documentation/reference/1.2/development/engine.html#engine-properties</p>
*/
@PublicEvolving
public class DebeziumSourceFunction<T> extends RichSourceFunction<T> implements
CheckpointedFunction,
ResultTypeQueryable<T> {}
為實(shí)現(xiàn) CheckpointedFunction
,需要實(shí)現(xiàn)以下兩個(gè)方法:
public interface CheckpointedFunction {
// 做快照,把內(nèi)存中的數(shù)據(jù)保存在checkpoint狀態(tài)中
void snapshotState(FunctionSnapshotContext var1) throws Exception;
// 程序異?;謴?fù)后從checkpoint狀態(tài)中恢復(fù)數(shù)據(jù)
void initializeState(FunctionInitializationContext var1) throws Exception;
}
接下來我們看看 DebeziumSourceFunction
中都記錄了哪些狀態(tài)。
/** Accessor for state in the operator state backend.
offsetState中記錄了讀取的binlog文件和位移信息等,對應(yīng)Debezium中的
*/
private transient ListState<byte[]> offsetState;
/**
* State to store the history records, i.e. schema changes.
* historyRecordsState記錄了schema的變化等信息
* @see FlinkDatabaseHistory
*/
private transient ListState<String> historyRecordsState;
我們發(fā)現(xiàn)在 Flink SQL CDC 是一個(gè)相對簡易的場景,沒有中間算子,是通過 Checkpoint 持久化 binglog
消費(fèi)位移和 schema
變化信息的快照,來實(shí)現(xiàn) Exactly Once。
106.Flink SQL GateWay 了解嗎?
Flink SQL Gateway 是 Flink 集群的 任務(wù)網(wǎng)關(guān),支持以 RestAPI 的形式提交查詢、插入、刪除等任務(wù),如下圖所示:
總體架構(gòu)如下圖所示:
107.Flink SQL GateWay 創(chuàng)建會(huì)話講解一下?
創(chuàng)建會(huì)話流程圖如下:
- 傳入?yún)?shù)包含
name
名稱、planner
執(zhí)行引擎(Blink 或原生的 Flink)、executetype
(streaming
或者batch
)、properties
(配置參數(shù),如并發(fā)度等)。 - 在 SessionMnager 中,會(huì)根據(jù)這些參數(shù)創(chuàng)建對應(yīng)的 SessionContext。
SessionContext sessionContext = new SessionContext(sessionName, sessionId, sessionEnv, defaultContext);
- 將創(chuàng)建 Session 放入 Map 集合中,最后返回對應(yīng)的 SessionId,方便后續(xù)使用。
sessions.put(sessionId,session); return sessionId;
108.Flink SQL GateWay 如何處理并發(fā)請求?多個(gè)提交怎么處理?
SQL GateWay 內(nèi)部維護(hù) SessionManager,里面通過 Map 維護(hù)了各個(gè) Session,每個(gè) Session 的任務(wù)執(zhí)行是獨(dú)立的。同一個(gè) Session 通過 ExecuteContext 內(nèi)部的 tEnv
(TableEnvironment
)按順序提交。
109.如何維護(hù)多個(gè) SQL 之間的關(guān)聯(lián)性?
在每個(gè) Session 中單獨(dú)維護(hù)了 tEnv
,同一個(gè) Session 中的操作其實(shí)是在一個(gè) env
中執(zhí)行的。因此只要是同一個(gè) Session 中的任務(wù),內(nèi)部使用的 tEnv
就是同一個(gè)。這樣就可以實(shí)現(xiàn)在一個(gè) Session 中,先創(chuàng)建一個(gè) view
,然后執(zhí)行一個(gè) select
,最后執(zhí)行一個(gè) insert
。文章來源:http://www.zghlxwxcb.cn/news/detail-823376.html
110.SQL 字符串如何提交到集群成為代碼?
Session 中維護(hù)了 tEnv
,SQL 會(huì)通過 tEnv
編譯生成 Pipeline(即 DAG 圖),在 batch
模式下是 Plan 執(zhí)行計(jì)劃;在 stream
模式下是 StreamGraph。然后 Session 內(nèi)部會(huì)創(chuàng)建一個(gè) ProgramDeployer 代碼發(fā)布器,根據(jù) Flink 中配置的 target
創(chuàng)建不同的 excutor
。最后調(diào)用 executor.execute
方法提交 Pipeline 和 Config 執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-823376.html
到了這里,關(guān)于【大數(shù)據(jù)】Flink 詳解(十):SQL 篇 Ⅲ(Flink SQL CDC)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!