理解
首先辰狡,大家要明白為什么出現(xiàn)了類似Iceberg這樣的數(shù)據(jù)技術(shù)。
大數(shù)據(jù)領(lǐng)域發(fā)展至今已經(jīng)經(jīng)歷了相當(dāng)長(zhǎng)時(shí)間的發(fā)展和探索菊匿,雖然大數(shù)據(jù)技術(shù)的出現(xiàn)和迭代降低了用戶處理海量數(shù)據(jù)的門檻付呕,但是有一個(gè)問題不能忽視,數(shù)據(jù)格式對(duì)不同引擎適配的對(duì)接跌捆。
這句話是什么意思呢徽职?
我們?cè)谑褂貌煌囊孢M(jìn)行計(jì)算時(shí),需要將數(shù)據(jù)根據(jù)引擎進(jìn)行適配佩厚。這是相當(dāng)棘手的問題
為此出現(xiàn)了一種新的解決方案:
介于上層計(jì)算引擎和底層存儲(chǔ)格式之間的一個(gè)中間層姆钉。這個(gè)中間層不是數(shù)據(jù)存儲(chǔ)的方式,只是定義了數(shù)據(jù)的元數(shù)據(jù)組織方式抄瓦,并且向引擎層面提供統(tǒng)一的類似傳統(tǒng)數(shù)據(jù)庫(kù)中"表"的語義育韩。它的底層仍然是Parquet、ORC等存儲(chǔ)格式闺鲸。
基于此筋讨,Netflix開發(fā)了Iceberg,目前已經(jīng)是Apache的頂級(jí)項(xiàng)目摸恍。
介紹
Apache Iceberg 是一種開放的表格格式悉罕,專為巨大的 PB 級(jí)表格而設(shè)計(jì)。表格格式的功能是確定您如何管理立镶、組織和跟蹤構(gòu)成表格的所有文件壁袄。您可以將其視為物理數(shù)據(jù)文件(用 Parquet 或 ORC 等編寫)以及它們?nèi)绾螛?gòu)建以形成表格之間的抽象層。
該項(xiàng)目最初是在 Netflix 開發(fā)的媚媒,目的是解決長(zhǎng)期存在的 PB 級(jí)大表使用問題嗜逻。它于 2018 年作為 Apache 孵化器項(xiàng)目開源,并于 2020 年 5 月 19 日從孵化器畢業(yè)缭召。
Netflix用內(nèi)部的一個(gè)時(shí)序數(shù)據(jù)業(yè)務(wù)的案例來說明Hive的這些問題栈顷,采用Hive時(shí)按照時(shí)間字段做partition,他們發(fā)現(xiàn)僅一個(gè)月會(huì)產(chǎn)生2688個(gè)partition和270萬個(gè)數(shù)據(jù)文件嵌巷。他們執(zhí)行一個(gè)簡(jiǎn)單的select查詢萄凤,發(fā)現(xiàn)僅在分區(qū)裁剪階段就耗費(fèi)數(shù)十分鐘。
hive存在的問題
1搪哪、Hive的元數(shù)據(jù)依賴一個(gè)外部的MySQL和HDFS文件系統(tǒng)靡努,通過MySQL找到相關(guān)的parition之后,需要為每個(gè)partition去HDFS文件系統(tǒng)上按照分區(qū)做目錄的list操作在文件量大的情況下,這是一個(gè)非常耗時(shí)
的操作
2惑朦、hive元數(shù)據(jù)分屬M(fèi)ySQL和HDFS管理兽泄,寫入操作本身的原子性難以保證。即使在開啟Hive ACID情況下漾月,仍有很多細(xì)小場(chǎng)景無法保證原子性病梢。
3、Hive Metastore
沒有文件級(jí)別的統(tǒng)計(jì)信息栅屏,無法追蹤到文件級(jí)別,這使得filter謂詞只能下推到partition級(jí)別堂鲜,而無法下推到文件級(jí)別栈雳,對(duì)上層分析性能損耗無可避免。
Iceberg通過使用持久樹結(jié)構(gòu)跟蹤表中所有文件的完整列表來避免這種情況缔莲。對(duì)表的更改使用原子(對(duì)象/文件)級(jí)提交來更新包含所有單個(gè)數(shù)據(jù)文件位置的新元數(shù)據(jù)文件的路徑
Iceberg 跟蹤單個(gè)文件而不是文件夾的另一個(gè)優(yōu)點(diǎn)是不再需要昂貴的list操作哥纫,這會(huì)在執(zhí)行查詢表中的數(shù)據(jù)等操作時(shí)提高性能。
iceberg文件
1痴奏、Snapshot metadata file( /metadata/v9.metadata.json
):包含有關(guān)表的元數(shù)據(jù)蛀骇,如表架構(gòu)、分區(qū)規(guī)范以及清單列表的路徑读拆。
2擅憔、Manifest list(/metadata/snap-1690829998331847164-1-5655e629-c39e-4e6b-825a-dca3bf5b814a.avro
):包含與快照關(guān)聯(lián)的每個(gè)清單文件的條目。每個(gè)條目都包含清單文件的路徑和有關(guān)該文件的一些元數(shù)據(jù)檐晕,包括分區(qū)統(tǒng)計(jì)信息和數(shù)據(jù)文件計(jì)數(shù)暑诸。這些統(tǒng)計(jì)信息可用于避免讀取操作不需要的清單。
3辟灰、Manifest file(/metadata/5655e629-c39e-4e6b-825a-dca3bf5b814a-m2.avro
):包含相關(guān)數(shù)據(jù)文件的路徑列表个榕。數(shù)據(jù)文件的每個(gè)條目都包含一些關(guān)于文件的元數(shù)據(jù),例如每列的上限和下限芥喇,可用于在查詢計(jì)劃期間修剪文件西采。
4、Data file(/data/level=1/00000-811-f7539dc8-534e-4d29-a563-3de7f8b35c9d-00001.parquet
):物理數(shù)據(jù)文件继控,以 Parquet械馆、ORC、Avro 等格式編寫武通。
iceberg schema 修改理解
Iceberg保證更改是獨(dú)立的且沒有副作用狱杰。Iceberg 使用唯一 ID 來跟蹤schema 中的每個(gè)字段,并將字段名稱映射到 ID厅须。這意味著您可以更改字段的名稱仿畸,但 Iceberg讀取底層數(shù)據(jù)仍將使用與每個(gè)字段關(guān)聯(lián)的 ID。
Partition Evolution
由于Iceberg實(shí)現(xiàn)了隱藏分區(qū),因此Iceberg還可以提供分區(qū)規(guī)范演變的特性错沽。這意味著您可以在不破壞表的情況下更改分區(qū)的粒度或列簿晓。分區(qū)演變是一種元數(shù)據(jù)操作,不會(huì)重寫文件千埃,因此舊數(shù)據(jù)可以與任何新數(shù)據(jù)在表中共存憔儿。Iceberg實(shí)現(xiàn)了分割計(jì)劃——Iceberg使用舊規(guī)范為第一組數(shù)據(jù)執(zhí)行查詢計(jì)劃,然后使用新規(guī)范為第二組數(shù)據(jù)執(zhí)行第二個(gè)查詢計(jì)劃放可,然后合并所有文件谒臼。
在上面的圖表中,booking_table最初是按月(日期)進(jìn)行分區(qū)的耀里,直到
partition spec
更改為日(日期)的2009-01-01蜈缤。舊數(shù)據(jù)保持舊分區(qū)格式,所有新數(shù)據(jù)都以新格式寫入冯挎。當(dāng)運(yùn)行示例查詢時(shí)底哥,Iceberg為每個(gè)分區(qū)規(guī)范執(zhí)行分割計(jì)劃,并可以通過對(duì)日期列應(yīng)用月或日轉(zhuǎn)換來過濾兩種spec下的分區(qū)房官。
Time travel
如前所述趾徽,Iceberg保留表以前快照的日志,這允許執(zhí)行時(shí)間旅行查詢或表回滾翰守。iceberg為spark3.x提供了全部功能的實(shí)現(xiàn)
通過Spark可以訪問快照日志數(shù)據(jù):
spark.read
.format("iceberg")
.load("bookings.rome_hotels.snapshots")
.show(truncate = false)
查詢指定快照數(shù)據(jù)孵奶,回滾操作
spark.read
.format("iceberg")
.option("snapshot-id", 1624021260521L) #Using snapshot ID
.load("bookings.rome_hotels")
spark.read
.format("iceberg")
.option("as-of-timestamp", "1624021260521") #Using timestamp
.load("bookings.rome_hotels")
table.rollback()
.toSnapshotId(1624021260521L)
.commit();
table.rollback()
.toSnapshotAtTime(1624021260521)
.commit();
參考
https://iceberg.apache.org/spark-procedures/
https://medium.com/expedia-group-tech/a-short-introduction-to-apache-iceberg-d34f628b6799
https://jishuin.proginn.com/p/763bfbd3950b