網(wǎng)站建設(shè)通路品牌網(wǎng)站建設(shè)
1.事務(wù)性
從事務(wù)性上來說,iceberg具有更高的數(shù)據(jù)質(zhì)量。
因?yàn)閕ceberg本質(zhì)是一種table format,屏蔽了底層的存儲細(xì)節(jié),寫入數(shù)據(jù)時候需要嚴(yán)格按照schema寫入。而hive可以先寫入底層數(shù)據(jù),然后使用load partition的方式來加載分區(qū)。這樣就可能造成hive的實(shí)際存儲數(shù)據(jù)與schema不一致。
另外,hive的分區(qū)數(shù)據(jù)生成以后,還可以直接刪掉hdfs路徑的文件(包括代碼有bug無意中刪除數(shù)據(jù)等),這樣經(jīng)常會存在分區(qū)數(shù)據(jù)不存在的場景。而iceberg基于快照提供了事務(wù)處理能力,使其實(shí)現(xiàn)了讀寫分離能力。iceberg在執(zhí)行delete操作或者overwrite操作時,不會將原有的數(shù)據(jù)進(jìn)行直接刪除,而是新增了一個snapshot,在這個snapshot中引用新的數(shù)據(jù)文件,這樣就實(shí)現(xiàn)了事務(wù)處理。
2.降低數(shù)據(jù)pipeline延時
hive針對數(shù)據(jù)進(jìn)行update操作時,需要先將數(shù)據(jù)讀取出來修改后再重新寫,有極大的修正成本。Iceberg 所具有的修改、刪除能力能夠有效地降低開銷,提升效率。
同時,傳統(tǒng)數(shù)倉從數(shù)據(jù)ETL到數(shù)據(jù)入庫入倉,流程一般較長,需要后續(xù)加入一些驗(yàn)證邏輯保證數(shù)據(jù)的準(zhǔn)確性。因?yàn)榱鞒涕L,架構(gòu)也較為復(fù)雜,所以數(shù)據(jù)入庫所需時間也較長。而iceberg的事務(wù)性設(shè)計(jì)可以保證流程的簡易性,降低整個數(shù)據(jù)pipeline的延時。
3.對接不同計(jì)算引擎
iceberg 上層可以支持 Spark、Flink、Presto等多種計(jì)算引擎,當(dāng)只需要進(jìn)行離線批處理的時候,我們可以直接將iceberg當(dāng)hive 表來使用,通過 Spark + iceberg 搭建原來的離線數(shù)據(jù)計(jì)算流。
當(dāng)有實(shí)時指標(biāo)計(jì)算的需求時,可以使用 flink 實(shí)時計(jì)算框架,來構(gòu)建近實(shí)時數(shù)倉,而且iceberg 存儲全量數(shù)據(jù),且仍然有批計(jì)算能力,可以在流式計(jì)算作業(yè)運(yùn)行的同時,跑一個批作業(yè)來進(jìn)行數(shù)據(jù)回溯或者數(shù)據(jù)糾正。
4.小文件處理
在傳統(tǒng)的實(shí)時數(shù)倉中,由于列式存儲相對行式存儲有較高的查詢性能,我們一般采用parquet,orc等列存儲數(shù)據(jù)格式。但是這種列式格式無法追加,流式數(shù)據(jù)又無法等候太長時間等到文件夠了一個hdfs block塊大小再寫入。所以不可避免的產(chǎn)生了一個令人頭大的問題,即小文件問題。大量小文件會對namenode造成巨大的壓力,極大影響hdfs服務(wù)的穩(wěn)定與性能,因此如何解決小文件問題也是傳統(tǒng)的hive數(shù)倉面臨的一個重要課題。
傳統(tǒng)的流式數(shù)據(jù)入庫的過程中對小文件進(jìn)行合并會產(chǎn)生很多問題,比如流式數(shù)據(jù)不斷的往hive表進(jìn)行寫入,如果同時有一個合并程序進(jìn)行小文件的合并,那么這時候?qū)ν环輸?shù)據(jù)進(jìn)行讀寫。會不會產(chǎn)生問題。如何保證事務(wù),出錯了怎么回滾呢,這些都是很棘手的問題。
而在iceberg中,提供了相應(yīng)的API來進(jìn)行小文件合并。
SparkActions.get(spark).rewriteDataFiles(icebergTable).execute()
5.統(tǒng)一接入數(shù)據(jù)源
通過iceberg 數(shù)據(jù)湖方案構(gòu)建的近實(shí)時數(shù)倉可以將基于hive 的離線數(shù)倉和基于kafka等消息隊(duì)列構(gòu)建的實(shí)時數(shù)倉進(jìn)行統(tǒng)一。你可以將日志數(shù)據(jù)、changeLog數(shù)據(jù)統(tǒng)一存儲在iceberg 中,通過 iceberg 構(gòu)建數(shù)倉只需要維護(hù)一套存儲,甚至是一套計(jì)算鏈路。
同時 iceberg 還具有很好的開放性。得益于 spark 和 flink 的豐富的生態(tài),可以將 MySQL Binlog數(shù)據(jù)、日志數(shù)據(jù)導(dǎo)入到 Iceberg 進(jìn)行分析,也可以將 Iceberg 中的數(shù)據(jù)導(dǎo)入到 Hive、Doris等其他存儲中進(jìn)行分析。將一份數(shù)據(jù)導(dǎo)入 Iceberg,你永遠(yuǎn)不用擔(dān)心在使用數(shù)據(jù)的時候取不出來。