成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

今天就跟大家聊聊有關(guān)Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

專注于為中小企業(yè)提供做網(wǎng)站、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)鼓樓免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

一、常見的 CDC 分析方案

我們先看一下今天的 topic 需要設(shè)計(jì)的是什么?輸入是一個(gè) CDC 或者 upsert 的數(shù)據(jù),輸出是 Database 或者是用于大數(shù)據(jù) OLAP 分析的存儲。

我們常見的輸入主要有兩種數(shù)據(jù),第一種數(shù)據(jù)是數(shù)據(jù)庫的 CDC 數(shù)據(jù),不斷的產(chǎn)生 changeLog;另一種場景是流計(jì)算產(chǎn)生的 upsert 數(shù)據(jù),在最新的 Flink 1.12 版本已經(jīng)支持了 upsert 數(shù)據(jù)。

1.1 離線 HBase 集群分析 CDC 數(shù)據(jù)

我們通常想到的第一個(gè)方案,就是把 CDC upsert 的數(shù)據(jù)通過 Flink 進(jìn)行一些處理之后,實(shí)時(shí)的寫到 HBase 當(dāng)中。HBase 是一個(gè)在線的、能提供在線點(diǎn)查能力的一種數(shù)據(jù)庫,具有非常高的實(shí)時(shí)性,對寫入操作是非常友好的,也可以支持一些小范圍的查詢,而且集群可擴(kuò)展。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

這種方案其實(shí)跟普通的點(diǎn)查實(shí)時(shí)鏈路是同一套,那么用 HBase 來做大數(shù)據(jù)的 OLAP 的查詢分析有什么問題呢?

首先,HBase 是一個(gè)面向點(diǎn)查設(shè)計(jì)的一種數(shù)據(jù)庫,是一種在線服務(wù),它的行存的索引不適合分析任務(wù)。典型的數(shù)倉設(shè)計(jì)肯定是要列存的,這樣壓縮效率和查詢效率才會高。第二,HBase 的集群維護(hù)成本比較高。最后,HBase 的數(shù)據(jù)是 HFile,不方便與大數(shù)據(jù)里數(shù)倉當(dāng)中典型的 Parquet、Avro、Orc 等結(jié)合。

1.2 Apache Kudu 維護(hù) CDC 數(shù)據(jù)集

針對 HBase 分析能力比較弱的情況,社區(qū)前幾年出現(xiàn)了一個(gè)新的項(xiàng)目,這就是 Apache Kudu 項(xiàng)目。Kudu 項(xiàng)目擁有 HBase 的點(diǎn)查能力的同時(shí),采用列存,這樣列存加速非常適合 OLAP 分析。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

這種方案會有什么問題呢?

首先 Kudu 是比較小眾的、獨(dú)立的集群,維護(hù)成本也比較高,跟 HDFS、S3、OSS 比較割裂。其次由于 Kudu 在設(shè)計(jì)上保留了點(diǎn)查能力,所以它的批量掃描性能不如 parquet,另外 Kudu 對于 delete 的支持也比較弱,最后它也不支持增量拉取。

1.3 直接導(dǎo)入 CDC 到 Hive 分析

第三種方案,也是大家在數(shù)倉中比較常用的方案,就是把 MySQL 的數(shù)據(jù)寫到 Hive,流程是:維護(hù)一個(gè)全量的分區(qū),然后每天做一個(gè)增量的分區(qū),最后把增量分區(qū)寫好之后進(jìn)行一次 Merge ,寫入一個(gè)新的分區(qū),流程上這樣是走得通的。Hive 之前的全量分區(qū)是不受增量的影響的,只有當(dāng)增量 Merge 成功之后,分區(qū)才可查,才是一個(gè)全新的數(shù)據(jù)。這種純列存的 append 的數(shù)據(jù)對于分析是非常友好的。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

這種方案會有什么問題呢?

增量數(shù)據(jù)和全量數(shù)據(jù)的 Merge 是有延時(shí)的,數(shù)據(jù)不是實(shí)時(shí)寫入的,典型的是一天進(jìn)行一次 Merge,這就是 T+1 的數(shù)據(jù)了。所以,時(shí)效性很差,不支持實(shí)時(shí) upsert。每次 Merge 都需要把所有數(shù)據(jù)全部重讀重寫一遍,效率比較差、比較浪費(fèi)資源。

1.4 Spark + Delta 分析 CDC 數(shù)據(jù)

針對這個(gè)問題,Spark + Delta 在分析 CDC 數(shù)據(jù)的時(shí)候提供了 MERGE INTO 的語法。這并不僅僅是對 Hive 數(shù)倉的語法簡化,Spark + Delta 作為新型數(shù)據(jù)湖的架構(gòu)(例如 Iceberg、Hudi),它對數(shù)據(jù)的管理不是分區(qū),而是文件,因此 Delta 優(yōu)化 MERGE INTO 語法,僅掃描和重寫發(fā)生變化的文件即可,因此高效很多。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

我們評估一下這個(gè)方案,他的優(yōu)點(diǎn)是僅依賴 Spark + Delta 架構(gòu)簡潔、沒有在線服務(wù)、列存,分析速度非常快。優(yōu)化之后的 MERGE INTO 語法速度也夠快。

這個(gè)方案,業(yè)務(wù)上是一個(gè) Copy On Write 的一個(gè)方案,它只需要 copy 少量的文件,可以讓延遲做的相對低。理論上,在更新的數(shù)據(jù)跟現(xiàn)有的存量沒有很大重疊的話,可以把天級別的延遲做到小時(shí)級別的延遲,性能也是可以跟得上的。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

這個(gè)方案在 Hive 倉庫處理 upsert 數(shù)據(jù)的路上已經(jīng)前進(jìn)了一小步了。但小時(shí)級別的延遲畢竟不如實(shí)時(shí)更有效,因此這個(gè)方案最大的缺點(diǎn)在 Copy On Write 的 Merge 有一定的開銷,延遲不能做的太低。

第一部分大概現(xiàn)有的方案就是這么多,同時(shí)還需要再強(qiáng)調(diào)一下,upsert 之所以如此重要,是因?yàn)樵跀?shù)據(jù)湖的方案中,upsert 是實(shí)現(xiàn)數(shù)據(jù)庫準(zhǔn)實(shí)時(shí)、實(shí)時(shí)入湖的一個(gè)關(guān)鍵技術(shù)點(diǎn)。

二、為何選擇 Flink + Iceberg

2.1 Flink 對 CDC 數(shù)據(jù)消費(fèi)的支持

第一,F(xiàn)link 原生支持 CDC 數(shù)據(jù)消費(fèi)。在前文 Spark + Delta 的方案中,MARGE INTO 的語法,用戶需要感知 CDC 的屬性概念,然后寫到 merge 的語法上來。但是 Flink 是原生支持 CDC 數(shù)據(jù)的。用戶只要聲明一個(gè) Debezium 或者其他 CDC 的 format,F(xiàn)link 上面的 SQL 是不需要感知任何 CDC 或者 upsert 的屬性的。Flink 中內(nèi)置了 hidden column 來標(biāo)識它 CDC 的類型數(shù)據(jù),所以對用戶而言比較簡潔。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

如下圖示例,在 CDC 的處理當(dāng)中,F(xiàn)link 在只用聲明一個(gè) MySQL Binlog 的 DDL 語句,后面的 select 都不用感知 CDC 屬性。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

2.2 Flink 對 Change Log Stream 的支持

下圖介紹的是 Flink 原生支持 Change Log Stream,F(xiàn)link 在接入一個(gè) Change Log Stream 之后,拓?fù)涫遣挥藐P(guān)心 Change Log flag 的 SQL。拓?fù)渫耆前凑兆约簶I(yè)務(wù)邏輯來定義,并且一直到最后寫入 Iceberg,中間不用感知 Change Log 的 flag。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

2.3 Flink + Iceberg CDC 導(dǎo)入方案評估

最后,F(xiàn)link + Iceberg 的 CDC 導(dǎo)入方案的優(yōu)點(diǎn)是什么?

對比之前的方案,Copy On Write 跟 Merge On Read 都有適用的場景,側(cè)重點(diǎn)不同。Copy On Write 在更新部分文件的場景中,當(dāng)只需要重寫其中的一部分文件時(shí)是很高效的,產(chǎn)生的數(shù)據(jù)是純 append 的全量數(shù)據(jù)集,在用于數(shù)據(jù)分析的時(shí)候也是最快的,這是 Copy On Write 的優(yōu)勢。

另外一個(gè)是 Merge On Read,即將數(shù)據(jù)連同 CDC flag 直接 append 到 Iceberg 當(dāng)中,在 merge 的時(shí)候,把這些增量的數(shù)據(jù)按照一定的組織格式、一定高效的計(jì)算方式與全量的上一次數(shù)據(jù)進(jìn)行一次 merge。這樣的好處是支持近實(shí)時(shí)的導(dǎo)入和實(shí)時(shí)數(shù)據(jù)讀?。贿@套計(jì)算方案的 Flink SQL 原生支持 CDC 的攝入,不需要額外的業(yè)務(wù)字段設(shè)計(jì)。

Iceberg 是統(tǒng)一的數(shù)據(jù)湖存儲,支持多樣化的計(jì)算模型,也支持各種引擎(包括 Spark、Presto、hive)來進(jìn)行分析;產(chǎn)生的 file 都是純列存的,對于后面的分析是非??斓?;Iceberg 作為數(shù)據(jù)湖基于 snapshot 的設(shè)計(jì),支持增量讀??;Iceberg 架構(gòu)足夠簡潔,沒有在線服務(wù)節(jié)點(diǎn),純 table format 的,這給了上游平臺方足夠的能力來定制自己的邏輯和服務(wù)化。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

三、如何實(shí)時(shí)寫入讀取

3.1 批量更新場景和 CDC 寫入場景

首先我們來了解一下在整個(gè)數(shù)據(jù)湖里面批量更新的兩個(gè)場景。

  • 第一批量更新的這種場景,在這個(gè)場景中我們使用一個(gè) SQL 更新了成千上萬行的數(shù)據(jù),比如歐洲的 GDPR 策略,當(dāng)一個(gè)用戶注銷掉自己的賬戶之后,后臺的系統(tǒng)是必須將這個(gè)用戶所有相關(guān)的數(shù)據(jù)全部物理刪除。

  • 第二個(gè)場景是我們需要將 date lake 中一些擁有共同特性的數(shù)據(jù)刪除掉,這個(gè)場景也是屬于批量更新的一個(gè)場景,在這個(gè)場景中刪除的條件可能是任意的條件,跟主鍵(Primary key)沒有任何關(guān)系,同時(shí)這個(gè)待更新的數(shù)據(jù)集是非常大,這種作業(yè)是一個(gè)長耗時(shí)低頻次的作業(yè)。

另外是 CDC 寫入的場景,對于對 Flink 來說,一般常用的有兩種場景,第一種場景是上游的 Binlog 能夠很快速的寫到 data lake 中,然后供不同的分析引擎做分析使用; 第二種場景是使用 Flink 做一些聚合操作,輸出的流是 upsert 類型的數(shù)據(jù)流,也需要能夠?qū)崟r(shí)的寫到數(shù)據(jù)湖或者是下游系統(tǒng)中去做分析。如下圖示例中 CDC 寫入場景中的 SQL 語句,我們使用單條 SQL 更新一行數(shù)據(jù),這種計(jì)算模式是一種流式增量的導(dǎo)入,而且屬于高頻的更新。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

3.2 Apache Iceberg 設(shè)計(jì) CDC 寫入方案需要考慮的問題

接下來我們看下 iceberg 對于 CDC 寫入這種場景在方案設(shè)計(jì)時(shí)需要考慮哪些問題。

  • 第一是正確性,即需要保證語義及數(shù)據(jù)的正確性,如上游數(shù)據(jù) upsert 到 iceberg 中,當(dāng)上游 upsert 停止后, iceberg 中的數(shù)據(jù)需要和上游系統(tǒng)中的數(shù)據(jù)保持一致。

  • 第二是高效寫入,由于 upsert 的寫入頻率非常高,我們需要保持高吞吐、高并發(fā)的寫入。

  • 第三是快速讀取,當(dāng)數(shù)據(jù)寫入后我們需要對數(shù)據(jù)進(jìn)行分析,這其中涉及到兩個(gè)問題,第一個(gè)問題是需要支持細(xì)粒度的并發(fā),當(dāng)作業(yè)使用多個(gè) task 來讀取時(shí)可以保證為各個(gè) task 進(jìn)行均衡的分配以此來加速數(shù)據(jù)的計(jì)算;第二個(gè)問題是我們要充分發(fā)揮列式存儲的優(yōu)勢來加速讀取。

  • 第四是支持增量讀,例如一些傳統(tǒng)數(shù)倉中的 ETL,通過增量讀取來進(jìn)行進(jìn)一步數(shù)據(jù)轉(zhuǎn)換。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

3.3 Apache Iceberg Basic

在介紹具體的方案細(xì)節(jié)之前,我們先了解一下 Iceberg 在文件系統(tǒng)中的布局,總體來講 Iceberg 分為兩部分?jǐn)?shù)據(jù),第一部分是數(shù)據(jù)文件,如下圖中的 parquet 文件,每個(gè)數(shù)據(jù)文件對應(yīng)一個(gè)校驗(yàn)文件(.crc文件)。第二部分是表元數(shù)據(jù)文件(Metadata 文件),包含 Snapshot 文件(snap-.avro)、Manifest 文件(.avro)、TableMetadata 文件(*.json)等。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

下圖展示了在 iceberg 中 snapshot、manifest 及 partition 中的文件的對應(yīng)關(guān)系。下圖中包含了三個(gè) partition,第一個(gè) partition 中有兩個(gè)文件 f1、f3,第二個(gè) partition 有兩個(gè)文件f4、f5,第三個(gè) partition 有一個(gè)文件f2。對于每一次寫入都會生成一個(gè) manifest 文件,該文件記錄本次寫入的文件與 partition 的對應(yīng)關(guān)系。再向上層有 snapshot 的概念,snapshot 能夠幫助快速訪問到整張表的全量數(shù)據(jù),snapshot 記錄多個(gè) manifest,如第二個(gè) snapshot 包含 manifest2 和 manifest3。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

3.4 INSERT、UPDATE、DELETE 寫入

在了解了基本的概念,下面介紹 iceberg 中 insert、update、delete 操作的設(shè)計(jì)。

下圖示例的 SQL 中展示的表包含兩個(gè)字段即 id、data,兩個(gè)字段都是 int 類型。在一個(gè) transaction 中我們進(jìn)行了圖示中的數(shù)據(jù)流操作,首先插入了(1,2)一條記錄,接下來將這條記錄更新為(1,3),在 iceberg 中 update 操作將會拆為 delete 和 insert 兩個(gè)操作。

這么做的原因是考慮到 iceberg 作為流批統(tǒng)一的存儲層,將 update 操作拆解為 delete 和 insert 操作可以保證流批場景做更新時(shí)讀取路徑的統(tǒng)一,如在批量刪除的場景下以 Hive 為例,Hive 會將待刪除的行的文件 offset 寫入到 delta 文件中,然后做一次 merge on read,因?yàn)檫@樣會比較快,在 merge 時(shí)通過 position 將原文件和 delta 進(jìn)行映射,將會很快得到所有未刪除的記錄。

接下來又插入記錄(3,5),刪除了記錄(1,3),插入記錄(2,5),最終查詢是我們得到記錄(3,5)(2,5)。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

上面操作看上去非常簡單,但在實(shí)現(xiàn)中是存在一些語義上的問題。如下圖中,在一個(gè) transaction 中首先執(zhí)行插入記錄(1,2)的操作,該操作會在 data file1 文件中寫入 INSERT(1,2),然后執(zhí)行刪除記錄(1,2)操作,該操作會在 equalify delete file1 中寫入 DELETE(1,2),接著又執(zhí)行插入記錄(1,2)操作,該操作會在 data file1 文件中再寫入INSERT(1,2),然后執(zhí)行查詢操作。

在正常情況下查詢結(jié)果應(yīng)該返回記錄 INSERT(1,2),但在實(shí)現(xiàn)中,DELETE(1,2)操作無法得知刪除的是 data file1 文件中的哪一行,因此兩行 INSERT(1,2)記錄都將被刪除。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

那么如何來解決這個(gè)問題呢,社區(qū)當(dāng)前的方式是采用了 Mixed position-delete and equality-delete。Equality-delete 即通過指定一列或多列來進(jìn)行刪除操作,position-delete 是根據(jù)文件路徑和行號來進(jìn)行刪除操作,通過將這兩種方法結(jié)合起來以保證刪除操作的正確性。

如下圖我們在第一個(gè) transaction 中插入了三行記錄,即 INSERT(1,2)、INSERT(1,3)、INSERT(1,4),然后執(zhí)行 commit 操作進(jìn)行提交。接下來我們開啟一個(gè)新的 transaction 并執(zhí)行插入一行數(shù)據(jù)(1,5),由于是新的 transaction,因此新建了一個(gè) data file2 并寫入 INSERT(1,5)記錄,接下來執(zhí)行刪除記錄(1,5),實(shí)際寫入 delete 時(shí)是:

在 position delete file1 文件寫入(file2, 0),表示刪除 data file2 中第 0 行的記錄,這是為了解決同一個(gè) transaction 內(nèi)同一行數(shù)據(jù)反復(fù)插入刪除的語義的問題。
在 equality delete file1 文件中寫入 DELETE (1,5),之所以寫入這個(gè) delete 是為了確保本次 txn 之前寫入的 (1,5) 能被正確刪除。

然后執(zhí)行刪除(1,4)操作,由于(1,4)在當(dāng)前 transaction 中未曾插入過,因此該操作會使用 equality-delete 操作,即在 equality delete file1 中寫入(1,4)記錄。在上述流程中可以看出在當(dāng)前方案中存在 data file、position delete file、equality delete file 三類文件。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

在了解了寫入流程后,如何來讀取呢。如下圖所示,對于 position delete file 中的記錄(file2, 0)只需和當(dāng)前 transaction 的 data file 進(jìn)行 join 操作,對于 equality delete file 記錄(1,4)和之前的 transaction 中的 data file 進(jìn)行 join 操作。最終得到記錄 INSERT(1,3)、INSERT(1,2)保證了流程的正確性。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

3.5 Manifest 文件的設(shè)計(jì)

上面介紹了 insert、update 及 delete,但在設(shè)計(jì) task 的執(zhí)行計(jì)劃時(shí)我們對 manifest 進(jìn)行了一些設(shè)計(jì),目的是通過 manifest 能夠快速到找到 data file,并按照數(shù)據(jù)大小進(jìn)行分割,保證每個(gè) task 處理的數(shù)據(jù)盡可能的均勻分布。

如下圖示例,包含四個(gè) transaction,前兩個(gè) transaction 是 INSERT 操作,對應(yīng) M1、M2,第三個(gè) transaction 是 DELETE 操作,對應(yīng) M3,第四個(gè) transaction 是 UPDATE 操作,包含兩個(gè) manifest 文件即 data manifest 和 delete manifest。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

對于為什么要對 manifest 文件拆分為 data manifest 和 delete manifest 呢,本質(zhì)上是為了快速為每個(gè) data file 找到對應(yīng)的 delete file 列表??梢钥聪聢D示例,當(dāng)我們在 partition-2 做讀取時(shí),需要將 deletefile-4 與datafile-2、datafile-3 做一個(gè) join 操作,同樣也需要將 deletefile-5 與 datafile-2、datafile-3 做一個(gè) join 操作。

以 datafile-3 為例,deletefile 列表包含 deletefile-4 和 deletefile-5 兩個(gè)文件,如何快速找到對應(yīng)的 deletefIle 列表呢,我們可以根據(jù)上層的 manifest 來進(jìn)行查詢,當(dāng)我們將 manifest 文件拆分為 data manifest 和 delete manifest 后,可以將 M2(data manifest)與 M3、M4(delete manifest)先進(jìn)行一次 join 操作,這樣便可以快速的得到 data file 所對應(yīng)的 delete file 列表。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

3.6 文件級別的并發(fā)

另一個(gè)問題是我們需要保證足夠高的并發(fā)讀取,在 iceberg 中這點(diǎn)做得非常出色。在 iceberg 中可以做到文件級別的并發(fā)讀取,甚至文件中更細(xì)粒度的分段的并發(fā)讀取,比如文件有 256MB,可以分為兩個(gè) 128MB 進(jìn)行并發(fā)讀取。這里舉例說明,假設(shè) insert 文件跟 delete 文件在兩個(gè) Bucket 中的布局方式如下圖所示。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

我們通過 manifest 對比發(fā)現(xiàn),datafile-2 的 delete file 列表只有 deletefile-4,這樣可以將這兩個(gè)文件作為一個(gè)單獨(dú)的 task(圖示中Task-2)進(jìn)行執(zhí)行,其他的文件也是類似,這樣可以保證每個(gè) task 數(shù)據(jù)較為均衡的進(jìn)行 merge 操作。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

對于這個(gè)方案我們做了簡單的總結(jié),如下圖所示。首先這個(gè)方案的優(yōu)點(diǎn)可以滿足正確性,并且可以實(shí)現(xiàn)高吞吐寫入和并發(fā)高效的讀取,另外可以實(shí)現(xiàn) snapshot 級別的增量的拉取。

當(dāng)前該方案還是比較粗糙,下面也有一些可以優(yōu)化的點(diǎn)。

  • 第一點(diǎn),如果同一個(gè) task 內(nèi)的 delete file 有重復(fù)可以做緩存處理,這樣可以提高 join 的效率。

  • 第二點(diǎn),當(dāng) delete file 比較大需要溢寫到磁盤時(shí)可以使用 kv lib 來做優(yōu)化,但這不依賴外部服務(wù)或其他繁重的索引。

  • 第三點(diǎn),可以設(shè)計(jì) Bloom filter(布隆過濾器)來過濾無效的 IO,因?yàn)閷τ?Flink 中常用的 upsert 操作會產(chǎn)生一個(gè) delete 操作和一個(gè) insert 操作,這會導(dǎo)致在 iceberg 中 data file 和 delete file 大小相差不大,這樣 join 的效率不會很高。如果采用 Bloom Filter,當(dāng) upsert 數(shù)據(jù)到來時(shí),拆分為 insert 和 delete 操作,如果通過 bloom filter 過濾掉那些之前沒有 insert 過數(shù)據(jù)的 delete 操作(即如果這條數(shù)據(jù)之前沒有插入過,則不需要將 delete 記錄寫入到 delete file 中),這將極大的提高 upsert 的效率。

  • 第四點(diǎn),是需要一些后臺的 compaction 策略來控制 delete file 文件大小,當(dāng) delete file 越少,分析的效率越高,當(dāng)然這些策略并不會影響正常的讀寫。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

3.7 增量文件集的 Transaction 提交

前面介紹了文件的寫入,下圖我們介紹如何按照 iceberg 的語義進(jìn)行寫入并且供用戶讀取。主要分為數(shù)據(jù)和 metastore 兩部分,首先會有 IcebergStreamWriter 進(jìn)行數(shù)據(jù)的寫入,但此時(shí)寫入數(shù)據(jù)的元數(shù)據(jù)信息并沒有寫入到 metastore,因此對外不可見。第二個(gè)算子是 IcebergFileCommitter,該算子會將數(shù)據(jù)文件進(jìn)行收集, 最終通過 commit transaction 來完成寫入。

在 Iceberg 中并沒有其他任何其他第三方服務(wù)的依賴,而 Hudi 在某些方面做了一些 service 的抽象,如將 metastore 抽象為獨(dú)立的 Timeline,這可能會依賴一些獨(dú)立的索引甚至是其他的外部服務(wù)來完成。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

四、未來規(guī)劃

下面是我們未來的一些規(guī)劃,首先是 Iceberg 內(nèi)核的一些優(yōu)化,包括方案中涉及到的全鏈路穩(wěn)定性測試及性能的優(yōu)化, 并提供一些 CDC 增量拉取的相關(guān) Table API 接口。

在 Flink 集成上,會實(shí)現(xiàn) CDC 數(shù)據(jù)的自動和手動合并數(shù)據(jù)文件的能力,并提供 Flink 增量拉取 CDC 數(shù)據(jù)的能力。

在其他生態(tài)集成上,我們會對 Spark、Presto 等引擎進(jìn)行集成,并借助 Alluxio 加速數(shù)據(jù)查詢。

Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)

看完上述內(nèi)容,你們對Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

本文標(biāo)題:Flink如何實(shí)時(shí)分析Iceberg數(shù)據(jù)湖的CDC數(shù)據(jù)
網(wǎng)址分享:http://jinyejixie.com/article36/jjhpsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站制作電子商務(wù)、網(wǎng)站導(dǎo)航移動網(wǎng)站建設(shè)、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
平湖市| 宜兰市| 定西市| 昭平县| 通山县| 十堰市| 牡丹江市| 思茅市| 梓潼县| 杨浦区| 湄潭县| 西乌珠穆沁旗| 江孜县| 团风县| 古蔺县| 清水县| 黄冈市| 普宁市| 宝鸡市| 德庆县| 灵川县| 砀山县| 孟津县| 砀山县| 奉贤区| 彭水| 高尔夫| 和龙市| 灵丘县| 洛川县| 清远市| 台东县| 桂林市| 集安市| 安远县| 贵州省| 阿尔山市| 克拉玛依市| 赤水市| 福海县| 南安市|