![]() |
博主歷時(shí)三年精心創(chuàng)作的《大數(shù)據(jù)平臺(tái)架構(gòu)與原型實(shí)現(xiàn):數(shù)據(jù)中臺(tái)建設(shè)實(shí)戰(zhàn)》一書(shū)現(xiàn)已由知名IT圖書(shū)品牌電子工業(yè)出版社博文視點(diǎn)出版發(fā)行,點(diǎn)擊《重磅推薦:建大數(shù)據(jù)平臺(tái)太難了!給我發(fā)個(gè)工程原型吧!》了解圖書(shū)詳情,京東購(gòu)書(shū)鏈接:https://item.jd.com/12677623.html,掃描左側(cè)二維碼進(jìn)入京東手機(jī)購(gòu)書(shū)頁(yè)面。 |
在當(dāng)前的大數(shù)據(jù)格局中,Spark / Hive / Flink 是最為主流的 ETL 或 Streaming 引擎,元數(shù)據(jù)方面,Hive Metastore 可以視為事實(shí)上的 Data Catalog 標(biāo)準(zhǔn),而在數(shù)據(jù)湖存儲(chǔ)格式上,又有 Hudi、Iceberg 這類新晉的框架,在這種復(fù)雜的格局下,用戶希望能它們之間能相互打通,以便能根據(jù)應(yīng)用場(chǎng)景靈活地選擇技術(shù)棧,同時(shí)又不會(huì)出現(xiàn)技術(shù)上的“隔離”,一個(gè)非常典型的例子是:當(dāng)我們選擇了 Hudi 作為數(shù)據(jù)湖的統(tǒng)一存儲(chǔ)格式后,我們希望不管是 Flink 還是 Spark (也包括 Hive)都能順利讀寫(xiě) Hudi 表,這也暗含著“元數(shù)據(jù)最好統(tǒng)一存儲(chǔ)在 Hive Metastore 中”這樣的訴求,這非常普遍且典型的一種用戶訴求,而我們這篇文章其實(shí)就是針對(duì)這個(gè)訴求給出解決方案。
1. Flink Catalog 的整體設(shè)計(jì)和各類具體實(shí)現(xiàn)
首先,我們要清楚地明白一點(diǎn):Flink 是有自己的、完全獨(dú)立的 Catalog 定義(接口)的,就像 Hive 設(shè)計(jì)并使用了自己的 Hive MetaStore 一樣。Flink 在自已統(tǒng)一的 Catalog 定義(接口)下,提供了多種不同的實(shí)現(xiàn),其實(shí)本質(zhì)的差別主要是存儲(chǔ)介質(zhì)上的差異:
- ?? 默認(rèn) Catalog(GenericInMemoryCatalog)
- 基于內(nèi)存,Session 結(jié)束時(shí),metadata 也會(huì)隨之丟失,下次再使用需要重新建庫(kù)、建表;
- ?? 將元數(shù)據(jù)持久化到數(shù)據(jù)庫(kù)中 (JdbcCatalog)
- 這就有點(diǎn)像 Hive Metastore 的實(shí)現(xiàn)方式了,但是要注意,只是性質(zhì)上類似,metadata 的 schema 肯定是不一樣的
- ?? 將元數(shù)據(jù)持久化到 Hive Metastore 中(HiveCatalog)
- 這種方式要注意理解,它是把 Hive Metastore 當(dāng)成了底層存儲(chǔ),通過(guò)調(diào)用 Hive Metastore 的 API 來(lái)讀寫(xiě) Flink 的 metadata;
- 同時(shí),使用這種方式還能讀寫(xiě) Hive 中已有的 Hive 表,某種角度上看,有點(diǎn)類似在 Flink Catalog 和 Hive Metastore 之間做了“適配”;
- 鑒于 Hive Metestore 在大數(shù)據(jù)生態(tài)中的核心位置,將 Flink 的元數(shù)據(jù)統(tǒng)一到 Hive 的 Metastore 上也是一種必然地選擇,不過(guò),F(xiàn)link Catalog 數(shù)據(jù)結(jié)構(gòu)畢竟與 Hive 的 Catalog 結(jié)構(gòu)有所不同,所以將大量 Flink 的 metadata 寫(xiě)入 Hive 會(huì)導(dǎo)致所謂的 “Hive 元數(shù)據(jù)污染” 問(wèn)題(參考:《Flink 實(shí)時(shí)計(jì)算平臺(tái)在知乎的演進(jìn)》)
- ?? 用戶自定義 Catalog
- 既然 Flink 的 Catalog 基于接口設(shè)計(jì)的,那么用戶自然可以開(kāi)發(fā)自己的 Catalog 實(shí)現(xiàn);
- 對(duì)于那些擁有內(nèi)置元數(shù)據(jù)服務(wù)的數(shù)據(jù)湖框架,例如 Hudi 和 Iceberg,這是絕佳的元數(shù)據(jù)切入方式,通過(guò)這種形式,它們會(huì)開(kāi)發(fā)自己的 Flink Catalog 實(shí)現(xiàn),目的就在于為了和 Flink Catalog 機(jī)制無(wú)縫打通,讓 Flink 能很好的讀寫(xiě)這些格式內(nèi)置的元數(shù)據(jù),實(shí)際上,它們也確實(shí)這樣做了
下圖從本質(zhì)上(類的繼承關(guān)系)揭示了 Flink Catalog 的設(shè)計(jì)框架和各個(gè)實(shí)現(xiàn)之間的關(guān)系:
同樣的,下圖從更大的一個(gè)上下文中展示了 Flink 表種 Catalog 具體實(shí)現(xiàn)的工作場(chǎng)景:
2. Flink 讀寫(xiě) Hudi 表并同步至 Hive Metastore 的方法
存放 Hudi 的元數(shù)據(jù)有多種途徑,本著不再發(fā)明輪子的態(tài)度,這兩篇文章《Flink SQL操作Hudi并同步Hive使用總結(jié)》和 《Flink SQL通過(guò)Hudi HMS Catalog讀寫(xiě)Hudi并同步Hive表》已經(jīng)總結(jié)的非常全面和細(xì)致了,總結(jié)一下一共有以下幾種途徑:
① 在 Flink 的默認(rèn) Catalog 中創(chuàng)建 Hudi 表,不同步表格元數(shù)據(jù)到 Hive Metastore (不配置 hudi 表的 hive_sync.* 屬性)
這一方案 Spark 和 Hive 都讀取不到這張 Hudi 表,且 Flink 自己在 Session 關(guān)閉后也需要重新建表,所以,這一方案并沒(méi)有實(shí)用價(jià)值。
② 在 Flink 的 Hive Catalog 中創(chuàng)建 Hudi 表,不同步表格元數(shù)據(jù)到 Hive Metastore (不配置 hudi 表的 hive_sync.* 屬性)
這一方案是在 Flink SQL 中連通 Hive Metastore(即使用 HiveCatalog),直接在 Hive Metastore 中創(chuàng)建 Hudi 表,這樣,原則上,Spark / Hive 都能發(fā)現(xiàn)這張 Hudi 表,并對(duì)其進(jìn)行讀寫(xiě)。但實(shí)際上,使用在這種模式下,Spark / Hive 是不能正常讀寫(xiě) Hudi 表的,因?yàn)樵摲椒▌?chuàng)建的 Hudi 表寫(xiě)入了大量的 Flink 特有的 metadata,同時(shí)又缺少了 Hive / Spark 必要的 Hudi 表的屬性,所以 Spark / Hive 不能讀寫(xiě)這種方式創(chuàng)建的 Hudi 表。簡(jiǎn)單地說(shuō),在這種方式下,F(xiàn)link 只是將 Hive Metastore 當(dāng)做一種底層的元數(shù)據(jù)存儲(chǔ)服務(wù),所以寫(xiě)入的元數(shù)據(jù)都是 Flink Catalog 風(fēng)格的,并不會(huì)考慮任何與 Hive / Spark 元數(shù)據(jù)兼容的問(wèn)題,所以 Spark / Hive 讀不出這種方式創(chuàng)建的 Hudi 表就不難理解了。
③ 在 Flink 的默認(rèn) Catalog 中創(chuàng)建 Hudi 表,并同步表格元數(shù)據(jù)到 Hive Metastore (配置 hudi 表的 hive_sync.* 屬性)
這一方案在 Flink 中創(chuàng)建的 Hudi 表的元數(shù)據(jù)能自動(dòng)同步到 Hive Metastore,這樣,Spark / Hive 就可以讀寫(xiě)這張表了,但是,唯一不足的地方是:對(duì)于 Flink 這一端,具體說(shuō)就是 Flink SQL Client,當(dāng) Session 關(guān)閉再重新打開(kāi)后,F(xiàn)link 的 Catalog 里原來(lái)的 Hudi 表就消失了,雖然可以通過(guò)注冊(cè) Hive Catalog 讀到上次創(chuàng)建的 Hudi 表,但是,先后兩次操作,SQL 會(huì)不一樣,所以還是有一些瑕疵。說(shuō)到底,這種方式是在混用 Flink Catalog 和 Hive Metastore。
④ 在 Flink 的 Hive Catalog 中創(chuàng)建 Hudi 表,并同步表格元數(shù)據(jù)到 Hive Metastore (配置 hudi 表的 hive_sync.* 屬性)
這一方案和方案 2 很接近,通過(guò)主動(dòng)同步 Hudi 元數(shù)據(jù)到 Hive Metastore 解決了 Hive / Spark 無(wú)法讀寫(xiě) Hudi 表的問(wèn)題。不過(guò),這一方案將勢(shì)必在 Hive Metastore 中創(chuàng)建出至少兩張以上的表(對(duì)于 MOR 表是 3 張),一張是 Flink 原生的 Hudi 表,另一張是通過(guò) Hive Sync 同步出來(lái)的表,雖然兩張表的數(shù)據(jù)是一份,但是元數(shù)據(jù)上確實(shí)是兩張不同的表,且使用 Flink 時(shí),只能讀寫(xiě) Flink 注冊(cè)的表,使用 Hive / Spark 時(shí),只能使用 Hive Sync 出來(lái)的表,雖然可以 work,但顯然還是一種很別扭的方案
⑤ 使用 Hudi HMS Catalog ( HoodieHiveCatalog )
上述四種方案都有一定的局限性,為此,F(xiàn)link / Hudi 社區(qū)專門(mén)針對(duì) Hudi 的 metadata 開(kāi)發(fā)了一個(gè)單獨(dú)的 Flink Catalog 實(shí)現(xiàn):HoodieHiveCatalog,這一方案從最底層上解決了元數(shù)據(jù)適配和共享的問(wèn)題。接下來(lái)我們會(huì)詳細(xì)介紹這種實(shí)現(xiàn)。
3. 最佳解決方案
在“Flink 讀寫(xiě) Hudi 表并同步至 Hive Metastore” 這件事情上,作為需求,最好的解決方案應(yīng)該:在 Flink 中創(chuàng)建的 Hudi 表能自動(dòng)被 Hive / Spark 發(fā)現(xiàn)和讀寫(xiě),鑒于 Hive Metastore 在大數(shù)據(jù)生態(tài)中的地位,元數(shù)據(jù)應(yīng)該存儲(chǔ)于 Hive Metastore 中,但不需要顯式配置 Hive Sync,也不應(yīng)存儲(chǔ)兩份以上的元數(shù)據(jù),F(xiàn)link / Hive / Spark 有統(tǒng)一的元數(shù)據(jù)視圖,均可共同讀寫(xiě)同一張 Hudi 表,而這就是 HoodieHiveCatalog 所要完成的任務(wù)。
從設(shè)計(jì)模式的角度看,本質(zhì)上,HoodieHiveCatalog 是一個(gè) “適配器”,它將 Flink Catalog 的元數(shù)據(jù)格式和 Hudi 的元數(shù)據(jù)格式以及 Hive Metastore 的格式做了完備的適配,這才得以實(shí)現(xiàn)三者的無(wú)縫集成!使得 Hudi 表元數(shù)據(jù)在 Flink / Hive / Spark 上做到的真正意義上的統(tǒng)一。下圖非常細(xì)致地描繪了 HoodieHiveCatalog 的工作方式(Glue Data Catalog 部分不影響解讀,可忽略):
方案 5 自始至終只使用 Hive Metastore 一種存儲(chǔ)介質(zhì),并面向 Hudi Metadata 的存儲(chǔ)在 Flink Catalog 和 Hive Catalog 進(jìn)行了適配,只存儲(chǔ)一份元數(shù)據(jù),而其他方案都是同時(shí)使用兩套 Catalog,并通過(guò) Hive Sync 盡量彌合兩套 Catalog 之間的差異,總會(huì)遇到這樣那樣的不一致問(wèn)題。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-835396.html
4. 示例代碼
關(guān)于使用 Hudi HMS Catalog ( HoodieHiveCatalog ) 統(tǒng)一 Hudi 表在 Flink / Spark / Hive 上的元數(shù)據(jù)示例,我們已經(jīng)在《CDC 整合方案:MySQL > Flink CDC + Schema Registry + Avro > Kafka > Hudi》 一文中給出了細(xì)致的演示和程序代碼,請(qǐng)移步此文了解詳情。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-835396.html
到了這里,關(guān)于Flink Catalog 解讀與同步 Hudi 表元數(shù)據(jù)的最佳實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!