<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Hudi 版本 | Apache Hudi 0.13.0版本重磅發(fā)布!

          共 17672字,需瀏覽 36分鐘

           ·

          2023-03-04 05:39



          Apache Hudi 0.13.0 版本引入了許多新功能,包括 Metaserver[1]變更數(shù)據(jù)捕獲[2]新的 Record Merge API[3]Deltastreamer支持新數(shù)據(jù)源[4]等。雖然此版本不需要表版本升級(jí),但希望用戶在使用 0.13.0 版本之前按照下面的遷移指南采取相關(guān)重大變更[5]行為變更[6]的操作。

          遷移指南:概述

          此版本與 0.12.0 版本保持相同的表版本 (5),如果從 0.12.0[7] 升級(jí),則無需升級(jí)表版本。如下所述,存在一些重大變更和行為變更,用戶在使用 0.13.0 版本之前需要采取相應(yīng)的措施。

          注意:如果從舊版本(0.12.0 之前)遷移,請(qǐng)按順序檢查每個(gè)舊版本的升級(jí)說明。

          遷移指南:重大變更

          Bundle包更新

          Spark Bundle支持

          從現(xiàn)在開始,hudi-spark3.2-bundle[8] 可與 Apache Spark 3.2.1 和 Spark 3.2.x 的更新版本一起使用。由于Spark 版本 3.2.0 和 3.2.1 之間 HiveClientImpl 的 getHive方法實(shí)現(xiàn)不兼容,因此hudi-spark3.2-bundle放棄了對(duì)Spark 3.2.0 的支持。

          實(shí)用程序Bundle包更改

          AWS 和 GCP bundle jar 與 hudi-utilities-bundle[9] 分開。意味著用戶在使用云服務(wù)時(shí)需要使用 hudi-aws-bundle[10] 或 hudi-gcp-bundle[11] 以及 hudi-utilities-bundle[12]

          新的 Flink Bundle包

          Hudi 現(xiàn)在通過新的 hudi-flink1.16-bundle[13] 支持 Flink 1.16.x 。

          Spark Lazy文件索引

          Hudi 在 Spark 中的文件索引默認(rèn)切換為Lazy加載:這意味著它只會(huì)列出查詢請(qǐng)求的分區(qū)(即在分區(qū)修剪之后),而不是在此版本之前總是列出整個(gè)表。這會(huì)為大型表帶來相當(dāng)大的性能提升。

          如果用戶想要更改列表行為,則會(huì)添加一個(gè)新的配置屬性:hoodie.datasource.read.file.index.listing.mode(現(xiàn)在默認(rèn)為L(zhǎng)azy)。可以設(shè)置兩個(gè)可能的值:

          • ? eager:這會(huì)在初始化期間列出所有分區(qū)路徑和其中相應(yīng)的文件切片。這是 0.13.0 之前的默認(rèn)行為。如果一個(gè)Hudi表有1000個(gè)分區(qū),eager模式在構(gòu)建文件索引時(shí)會(huì)列出所有分區(qū)下的文件。

          • ? lazy:其中的分區(qū)和文件切片將被延遲加載,允許分區(qū)修剪謂詞被適當(dāng)?shù)叵蛳峦疲虼酥涣谐鲆呀?jīng)被修剪的分區(qū)。初始化文件索引時(shí),文件未列在分區(qū)下。在查詢中使用謂詞(例如,datestr=2023-02-19)進(jìn)行分區(qū)修剪后,文件僅列在目標(biāo)分區(qū)下。

          要保留 0.13.0 之前的行為需要設(shè)置 hoodie.datasource.read.file.index.listing.mode=eager。

          只有當(dāng)表同時(shí)具有以下兩種情況時(shí)才會(huì)發(fā)生重大更改:多個(gè)分區(qū)列和分區(qū)值包含未進(jìn)行 URL 編碼的斜杠。 例如假設(shè)我們要從分區(qū)路徑 2022/01/03 解析兩個(gè)分區(qū)列 - 月 (2022/01) 和 日 (03)。由于分區(qū)列的數(shù)量(此處為 2 - 分別為)與分區(qū)路徑中由 /分隔的數(shù)量(在本例中為 3 - )不匹配,因此會(huì)導(dǎo)致歧義。在這種情況下不能恢復(fù)每個(gè)分區(qū)列對(duì)應(yīng)的分區(qū)值。有兩種方法可以避免重大變更:

          • ? 第一個(gè)選項(xiàng)是更改分區(qū)值的構(gòu)造方式。用戶可以切換月份列的分區(qū)值,避免任何分區(qū)列值出現(xiàn)斜杠,比如202201,那么解析分區(qū)路徑(202201/03)就沒有問題。

          • ? 第二個(gè)選項(xiàng)是將列表模式切換為 eager。文件索引將假定表未分區(qū)并僅犧牲分區(qū)修剪,但將能夠像表未分區(qū)一樣處理查詢(因此可能導(dǎo)致性能損失),而不是失敗查詢。

          Spark Structured Streaming 的檢查點(diǎn)管理

          如果您使用 Spark streaming 攝取到 Hudi,Hudi 會(huì)在內(nèi)部自行管理檢查點(diǎn)。我們現(xiàn)在正在添加對(duì)多客戶端寫入的支持,每個(gè)寫入客戶端都通過流式攝取攝取到同一個(gè) Hudi 表中。在舊版本的 hudi 中,您不能將多個(gè)流式攝取編寫器攝取到同一個(gè) hudi 表中(一個(gè)具有并發(fā) Spark 數(shù)據(jù)源編寫器的流式攝取寫入與鎖提供程序一起工作;但是不支持兩個(gè) Spark 流式攝取編寫器)。在 0.13.0 中,我們添加了對(duì)同一個(gè)表進(jìn)行多個(gè)流式攝取的支持。如果是單個(gè)流攝取,用戶無需執(zhí)行任何操作;舊管道無需任何額外更改即可工作。但是如果有多個(gè)流式寫入客戶端寫入到同一個(gè) Hudi 表,則每個(gè)表都必須為配置 hoodie.datasource.write.streaming.checkpoint.identifier 設(shè)置一個(gè)唯一的值。此外用戶應(yīng)該設(shè)置通常的多寫入器配置。更多詳情參考[14]

          Spark ORC 支持

          此版本中刪除了 Spark 2.x 中支持的 ORC ,因?yàn)闉榱伺cSpark 3兼容,Hudi 中對(duì) orc-core:nohive 的依賴現(xiàn)在被 orc-core 取代,Spark 3.x 支持 ORC,但以前的版本不支持了。

          強(qiáng)制設(shè)置記錄鍵字段

          設(shè)置記錄鍵字段的配置hoodie.datasource.write.recordkey.field現(xiàn)在需要顯示設(shè)置,沒有默認(rèn)值。以前默認(rèn)值為 uuid。

          遷移指南:行為變更

          寫路徑中的模式Schema處理

          許多用戶想使用 Hudi CDC 用例,他們希望在新模式中刪除現(xiàn)有列的模式進(jìn)行自動(dòng)演化。從 0.13.0 版本開始,Hudi 現(xiàn)在具有此功能,可以允許模式自動(dòng)演化,可以在新模式中刪除現(xiàn)有列。

          由于根據(jù)源Schema在目標(biāo)表中刪除列是很大的行為更改,因此默認(rèn)情況下禁用此功能并由以下配置保護(hù):hoodie.datasource.write.schema.allow.auto.evolution.column.drop。要啟用自動(dòng)刪除列以及傳入批次的新演化模式,請(qǐng)將其設(shè)置為 true

          此配置不需要通過使用例如 ALTER TABLE … Spark 中的 DROP COLUMN 手動(dòng)演變模式。

          刪除默認(rèn)Shuffle并行性

          此版本更改了 Hudi 寫入操作的Shuffle并行度的方式,包括 INSERT、BULK_INSERT、UPSERT 和 DELETE (hoodie.insert|bulkinsert|upsert|delete.shuffle.parallelism),這最終會(huì)影響寫入性能。

          之前如果用戶不配置,Hudi 會(huì)使用 200 作為默認(rèn)的 shuffle 并行度。從 0.13.0 開始,默認(rèn)情況下Hudi 通過使用由 Spark 確定的輸出 RDD 分區(qū)數(shù)(如果可用)或使用 spark.default.parallelism 值自動(dòng)推導(dǎo)suffle并行度。如果上述Hudi shuffle并行度是用戶明確配置的,那么用戶配置的并行度仍然用于定義實(shí)際的并行度。對(duì)于具有合理大小輸入的工作負(fù)載,此類行為更改可將開箱即用的性能提高 20%。

          如果輸入數(shù)據(jù)文件很小,例如小于 10MB,我們建議顯式配置 Hudi shuffle 并行度(hoodie.insert|bulkinsert|upsert|delete.shuffle.parallelism),這樣并行度至少為 total_input_data_size/500MB,以 避免潛在的性能下降(有關(guān)更多信息請(qǐng)參考調(diào)優(yōu)指南[15]

          默認(rèn)的簡(jiǎn)單寫執(zhí)行器SimpleExecutor

          對(duì)于插入/更新插入操作的執(zhí)行,Hudi 過去使用執(zhí)行器的概念,依靠?jī)?nèi)存中的隊(duì)列將攝取操作(以前通常由 I/O 操作獲取shuffle數(shù)據(jù))與寫入操作分離。到現(xiàn)在 Spark 架構(gòu)有了很大的發(fā)展,使得這種架構(gòu)變得多余。為了發(fā)展這種寫入模式并利用 Spark 優(yōu)勢(shì),在 0.13.0 中引入了一個(gè)新的簡(jiǎn)化版本的執(zhí)行程序,并命名為 SimpleExecutor并將其設(shè)置為開箱即用的默認(rèn)值。

          SimpleExecutor 沒有任何內(nèi)部緩沖(即不在內(nèi)存中保存記錄),它在內(nèi)部實(shí)現(xiàn)對(duì)提供的迭代器的簡(jiǎn)單迭代(類似于默認(rèn)的 Spark 行為)。它在 Spark 3.x版本上提供了約 10% 的開箱即用性能改進(jìn),與 Spark 原生 SparkRecordMerger一起使用時(shí)效果更好。

          批量插入使用NONE排序以匹配 Parquet 寫入

          此版本調(diào)整了 BULK_INSERT 寫入操作的 NONE 排序模式(默認(rèn)排序模式)的并行度。從現(xiàn)在開始默認(rèn)情況下,使用輸入并行性而不是隨機(jī)shuffle并行性 (hoodie.bulkinsert.shuffle.parallelism) 來寫入數(shù)據(jù),以匹配默認(rèn)的 parquet 寫入行為。這不會(huì)更改使用 NONE 排序模式的聚類行為。

          BULK_INSERT 寫入操作行為的變更提高了開箱即用的寫入性能。

          如果在默認(rèn)的NONE排序方式下還是發(fā)現(xiàn)小文件問題,我們建議在寫入Hudi表之前,先根據(jù)分區(qū)路徑和記錄鍵對(duì)輸入數(shù)據(jù)進(jìn)行排序。還可以使用 GLOBAL_SORT 來確保最佳文件大小。

          Deltstreamer 元同步失敗處理

          在早期版本中,我們使用了一種快速失敗的方法,如果任何目錄同步[16]失敗,則不會(huì)嘗試同步剩余的目錄。在 0.13.0 中,在任何目錄同步失敗的操作失敗之前嘗試同步到所有配置的目錄。在一個(gè)目錄同步失敗的情況下,其他目錄的同步仍然可以成功,所以用戶現(xiàn)在只需要重試失敗的目錄即可。

          不覆蓋內(nèi)部元數(shù)據(jù)表Metadata Table配置

          由于錯(cuò)誤配置可能導(dǎo)致數(shù)據(jù)完整性問題,在 0.13.0 中我們努力使用戶的元數(shù)據(jù)表配置更加簡(jiǎn)單。在內(nèi)部 Hudi 確定這些配置的最佳選擇,以實(shí)現(xiàn)系統(tǒng)的最佳性能和穩(wěn)定性。

          以下與元數(shù)據(jù)表相關(guān)的配置是內(nèi)部配置,用戶不能再顯式配置這些配置:

          hoodie.metadata.clean.async
          hoodie.metadata.cleaner.commits.retained
          hoodie.metadata.enable.full.scan.log.files
          hoodie.metadata.populate.meta.fields

          Spark SQL CTAS 性能修復(fù)

          以前由于配置錯(cuò)誤,CTAS 寫入操作被錯(cuò)誤地設(shè)置為使用 UPSERT。在 0.13.0 版本中我們修復(fù)了這個(gè)問題,以確保 CTAS 使用 BULK_INSERT操作來提高初始化寫入 Hudi 表的性能。

          Flink CkpMetadata

          在 0.13.0 之前,我們通過清理所有消息來初始化 ckp 元數(shù)據(jù)(檢查點(diǎn)相關(guān)元數(shù)據(jù))。但一些極端情況沒有得到正確處理。例如:

          • ? 重新啟動(dòng)作業(yè)時(shí),寫任務(wù)無法正確獲取pending的instant。

          • ? 如果檢查點(diǎn)成功并且作業(yè)突然崩潰,則instant沒有時(shí)間提交。數(shù)據(jù)丟失,因?yàn)樽詈笠粋€(gè)pending的instant被回滾;然而 Flink 引擎仍然認(rèn)為檢查點(diǎn)/即時(shí)是成功的。

          Q:為什么要在 0.13.0 版本之前清理消息?

          A:為了防止時(shí)間線和消息不一致

          Q:為什么我們要保留 0.13.0 版本中的消息?

          A:不一致有兩種情況:

          1. 1. 時(shí)間線即時(shí)完成但 ckp 消息正在傳輸(用于提交instant)。

          2. 2. 時(shí)間軸時(shí)刻處于pending狀態(tài),而 ckp 消息未啟動(dòng)(用于啟動(dòng)新instant)。

          對(duì)于case 1,不需要re-commit instant,如果write task在恢復(fù)的時(shí)候沒有得到pending instant就好了

          對(duì)于case 2,instant基本上是pending的。instant將被回滾(如預(yù)期的那樣)。因此保持 ckp 消息實(shí)際上可以保持正確性。

          重大特性

          元服務(wù)器Metaserver

          在 0.13.0 中我們引入了元數(shù)據(jù)集中管理服務(wù) Metaserver。這是我們?cè)谖磥硪氲钠脚_(tái)服務(wù)組件之一。Metaserver 幫助用戶輕松管理數(shù)據(jù)湖平臺(tái)中的大量表。

          注意:這是一項(xiàng)實(shí)驗(yàn)性功能。

          如需要在環(huán)境中設(shè)置元服務(wù)器,請(qǐng)使用 hudi-metaserver-server-bundle[17] 并將其作為 java 服務(wù)器應(yīng)用程序運(yùn)行,例如 java -jar hudi-metaserver-server-bundle-<HUDI_VERSION>.jar。在客戶端添加以下選項(xiàng)以與元服務(wù)器集成:

          hoodie.metaserver.enabled=true
          hoodie.metaserver.uris=thrift://<server url>:9090

          Metaserver 存儲(chǔ) Hudi 表的元數(shù)據(jù),如表名、數(shù)據(jù)庫、所有者;以及時(shí)間線的元數(shù)據(jù),如提交instant、action、state等。此外Metaserver 通過 Hudi Spark 包支持 Spark 寫入和讀取。

          更改數(shù)據(jù)捕獲CDC

          在 Hudi 表用作流源的情況下,我們希望了解屬于單個(gè)提交的記錄的所有變更。例如我們想知道哪些記錄被插入、刪除和更新。對(duì)于更新的記錄,后續(xù)管道可能希望獲取更新前的舊值和更新后的新值。0.13.0之前,增量查詢不包含硬刪除記錄,用戶需要使用軟刪除流刪除,可能不符合GDPR要求。

          Change-Data-Capture (CDC) 功能使 Hudi 能夠通過生成變更來顯示記錄是如何變更的,從而處理 CDC 查詢用例。

          注意:CDC 是一項(xiàng)實(shí)驗(yàn)性功能,當(dāng)前僅支持COW 表。CDC 查詢尚不支持 MOR 表。

          要使用 CDC,用戶需要先在寫入表時(shí)啟用它以記錄額外的數(shù)據(jù),這些數(shù)據(jù)由 CDC 增量查詢返回。對(duì)于寫入,設(shè)置 hoodie.table.cdc.enabled=true 并通過 hoodie.datasource.query.incremental.format指定 CDC 日志記錄模式,以控制記錄的數(shù)據(jù)。有3種模式可供選擇:

          • data_before_after:這記錄了變更記錄的操作以及變更前后的整個(gè)記錄。這種模式在存儲(chǔ)上產(chǎn)生最多的 CDC 數(shù)據(jù),并且查詢 CDC 結(jié)果的計(jì)算量最少。

          • data_before:這記錄了變更記錄的操作和更改前的整個(gè)記錄。

          • op_key_only:這只記錄變更記錄的操作和key。這種模式在存儲(chǔ)上產(chǎn)生最少的 CDC 數(shù)據(jù),但查詢 CDC 結(jié)果需要最多的計(jì)算工作。

          默認(rèn)值為 data_before_after。CDC讀取配置如下設(shè)置:

          hoodie.datasource.query.type=incremental
          hoodie.datasource.query.incremental.format=cdc

          和其他通常的增量查詢選項(xiàng),如開始和結(jié)束即時(shí)時(shí)間,并返回 CDC 結(jié)果。

          請(qǐng)注意,hoodie.table.cdc.enabled 是表配置。一旦啟用就不允許為關(guān)閉它。同樣不能更改 hoodie.table.cdc.supplemental.logging.mode,一旦它被保存為表配置。

          優(yōu)化記錄負(fù)載處理

          此版本引入了期待已久的支持,可將記錄作為其引擎原生表示進(jìn)行處理,從而避免將它們轉(zhuǎn)換為中間形式 (Avro) 的需要。

          注意:此功能處于實(shí)驗(yàn)?zāi)J剑壳皟H支持 Spark。

          通過引入新的 HoodieRecordMerger[18] 抽象。HoodieRecordMerger 是未來在 Hudi 中實(shí)現(xiàn)任何合并語義的核心和事實(shí)來源。在這種能力下,它取代了以前用于實(shí)現(xiàn)自定義合并語義的 HoodieRecordPayload 層次結(jié)構(gòu)。通過依賴 HoodieRecordMerger 形式的統(tǒng)一組件,我們可以在寫入操作的整個(gè)生命周期內(nèi)以統(tǒng)一的方式處理記錄。這大大減少了延遲,因?yàn)橛涗洭F(xiàn)在是引擎原生表示,避免了不必要的復(fù)制、反序列化和轉(zhuǎn)換為中間表示 (Avro)。在基準(zhǔn)測(cè)試中,與 0.13.0 默認(rèn)狀態(tài)相比,upsert 性能提高了 10%,與 0.12.2 相比提高了 20%。

          如要啟用,需要為 Hudi 表指定不同的配置:

          • ? 對(duì)于 COW,指定 hoodie.datasource.write.record.merger.impls=org.apache.hudi.HoodieSparkRecordMerger

          • ? 對(duì)于 MOR,指定 hoodie.datasource.write.record.merger.impls=org.apache.hudi.HoodieSparkRecordMerger 和 hoodie.logfile.data.block.format=parquet

          請(qǐng)注意,當(dāng)前的 HoodieSparkRecordMerger 實(shí)現(xiàn)僅支持與 OverwriteWithLatestAvroPayload 類等效的合并語義,這是當(dāng)前用于合并記錄的默認(rèn) HoodieRecordPayload 實(shí)現(xiàn)(設(shè)置為“hoodie.compaction.payload.class”)。因此如果您正在使用任何其他 HoodieRecordPayload 實(shí)現(xiàn),則需要等到它被相應(yīng)的 HoodieRecordMerger 實(shí)現(xiàn)替換。

          Deltastreamer 中的新源支持

          Deltastreamer 是一個(gè)完全托管的增量 ETL 實(shí)用程序,支持各種數(shù)據(jù)源。在此版本中我們添加了三個(gè)新數(shù)據(jù)源。

          Proto Kafka源

          Deltastreamer 已經(jīng)支持從 Kafka 中一次性攝取 JSON 和 Avro 格式新事件。 ProtoKafkaSource[19] 支持基于 Protobuf 類的模式。只需一個(gè)額外的配置,就可以輕松設(shè)置此源。查看文檔[20]以獲取更多詳細(xì)信息。

          GCS 增量源

          沿著 S3 事件源的路線,我們現(xiàn)在有一種可靠且快速的方法來通過 GcsEventsHoodieIncrSource[21] 從 Google Cloud Storage (GCS) 中的對(duì)象中攝取。

          Pulsar源

          Apache Pulsar 是一個(gè)為云構(gòu)建的開源分布式消息傳遞和流數(shù)據(jù)平臺(tái)。 PulsarSource[22] 支持通過 Deltastreamer 從 Apache Pulsar 攝取。

          支持部分負(fù)載更新

          部分更新是社區(qū)中的一個(gè)常見用例,它需要能夠僅更新某些字段而不是替換整個(gè)記錄。以前我們建議用戶通過引入他們自己的自定義記錄負(fù)載實(shí)現(xiàn)來滿足此用例。隨著該需求變得越來越普遍,在 0.13.0 版本中,我們添加了一個(gè)新的記錄有效負(fù)載實(shí)現(xiàn) PartialUpdateAvroPayload[23]以支持這種開箱即用的功能,因此用戶可以使用該實(shí)現(xiàn)而不必編寫自己的自定義實(shí)現(xiàn)。

          一致性哈希索引

          我們引入了 Consistent Hashing Index 作為使用 Hudi 寫入的另一種索引選項(xiàng)。這是對(duì) 0.11.0 版本中添加的 Bucket Index[24] 的增強(qiáng)。使用桶索引,每個(gè)分區(qū)的桶/文件組是靜態(tài)分配的,而使用一致性哈希索引,桶可以動(dòng)態(tài)增長(zhǎng),因此用戶無需擔(dān)心數(shù)據(jù)傾斜。桶將根據(jù)每個(gè)分區(qū)的負(fù)載因子擴(kuò)展和收縮。更多細(xì)節(jié)可參考此功能設(shè)計(jì)的 RFC[25]

          如需使用,配置如下

          hoodie.index.type=bucket
          hoodie.index.bucket.engine=CONSISTENT_HASHING
          hoodie.bucket.index.max.num.buckets=128
          hoodie.bucket.index.min.num.buckets=32
          hoodie.bucket.index.num.buckets=4
          ## do split if the bucket size reach 1.5 * max_file_size
          hoodie.bucket.index.split.threshold=1.5
          ## do merge if the bucket size smaller than 0.2 * max_file_size
          hoodie.bucket.index.merge.threshold=0.1 

          要強(qiáng)制縮小或擴(kuò)大存儲(chǔ)桶,需要使用以下配置啟用Clustering

          ## check resize for every 4 commit
          hoodie.clustering.inline=true
          hoodie.clustering.inline.max.commits=4
          hoodie.clustering.plan.strategy.class=org.apache.hudi.client.clustering.plan.strategy.SparkConsistentBucketClusteringPlanStrategy
          hoodie.clustering.execution.strategy.class=org.apache.hudi.client.clustering.run.strategy.SparkConsistentBucketClusteringExecutionStrategy
          ## for supporting concurrent write & resizing
          hoodie.clustering.updates.strategy=org.apache.hudi.client.clustering.update.strategy.SparkConsistentBucketDuplicateUpdateStrategy

          Consistent Hashing Index 仍然是一個(gè)不斷發(fā)展的特性,目前從 0.13.0 開始使用它有一些限制:

          • ? 只有使用 MOR 表的 Spark 引擎才支持此索引。

          • ? 它不適用于啟用元數(shù)據(jù)表。

          • ? 要擴(kuò)大或縮小桶,用戶必須使用上述配置(以某種節(jié)奏)手動(dòng)觸發(fā)Clustering,但他們不能同時(shí)運(yùn)行壓縮。

          • ? 因此如果常規(guī)寫入管道啟用了壓縮,請(qǐng)遵循以下建議:可以選擇每 12 小時(shí)觸發(fā)一次擴(kuò)容/縮容。在這種情況下,每 12 小時(shí)一次,可能需要禁用壓縮、停止寫入管道并啟用Clustering。應(yīng)該格外小心不要同時(shí)運(yùn)行兩者,因?yàn)檫@可能會(huì)導(dǎo)致沖突和管道失敗。Clustering完成后可以恢復(fù)常規(guī)寫入管道,這將啟用壓縮。

          我們正在努力實(shí)現(xiàn)這些自動(dòng)化,并使用戶更容易利用 Consistent Hashing Index。可以在此處[26]關(guān)注 Consistent Hashing Index 正在進(jìn)行的工作。

          多客戶端寫入的早期沖突檢測(cè)

          Hudi提供樂觀并發(fā)控制(OCC),允許多個(gè)寫入客戶端在沒有重疊數(shù)據(jù)文件寫入的情況下,并發(fā)寫入并原子提交到Hudi表,保證數(shù)據(jù)的一致性、完整性和正確性。在0.13.0版本之前,這種重疊數(shù)據(jù)文件的沖突檢測(cè)是在提交元數(shù)據(jù)之前和數(shù)據(jù)寫入完成之后進(jìn)行的。如果在最后階段檢測(cè)到任何沖突,則可能會(huì)浪費(fèi)計(jì)算資源,因?yàn)閿?shù)據(jù)寫入已經(jīng)完成。

          為了提高并發(fā)控制,0.13.0版本引入了OCC早期沖突檢測(cè)的新特性,利用Hudi的標(biāo)記機(jī)制,在數(shù)據(jù)寫入階段檢測(cè)到?jīng)_突,一旦檢測(cè)到?jīng)_突就提前中止寫入。Hudi 現(xiàn)在可以更早地停止沖突寫入器,因?yàn)樗梢约霸鐧z測(cè)沖突并釋放集群所需的計(jì)算資源,從而提高資源利用率。

          注意:OCC 中的早期沖突檢測(cè)在 0.13.0 版本中是實(shí)驗(yàn)性的。

          默認(rèn)情況下,此功能處于關(guān)閉狀態(tài)。要嘗試這一點(diǎn),用戶需要在使用 OCC 進(jìn)行并發(fā)控制時(shí)將 hoodie.write.concurrency.early.conflict.detection.enable設(shè)置為 true(有關(guān)更多詳細(xì)信息請(qǐng)參閱并發(fā)控制[27])。

          寫入數(shù)據(jù)中的無鎖消息隊(duì)列

          在以前的版本中,Hudi 使用生產(chǎn)者-消費(fèi)者模型通過有界內(nèi)存隊(duì)列將傳入數(shù)據(jù)寫入表中。在此版本中我們添加了一種新型隊(duì)列,利用 Disruptor[28],它是無鎖的。當(dāng)數(shù)據(jù)量很大時(shí),這會(huì)增加寫入吞吐量。將 1 億條記錄寫入云存儲(chǔ)上的 Hudi 表中的 1000 個(gè)分區(qū)的基準(zhǔn)[29]顯示,與現(xiàn)有的有界內(nèi)存隊(duì)列執(zhí)行器類型相比,性能提高了 20%。

          注意:DisruptorExecutor 作為實(shí)驗(yàn)特性支持 Spark 插入和 Spark 批量插入操作

          用戶可以設(shè)置 hoodie.write.executor.type=DISRUPTOR_EXECUTOR 來啟用該功能。還有其他配置,如 hoodie.write.wait.strategy 和 hoodie.write.buffer.size 可以進(jìn)一步調(diào)整性能。

          Hudi CLI 包

          我們?yōu)?Spark 3.x 引入了一個(gè)新的 Hudi CLI Bundle,hudi-cli-bundle_2.12[30],使 Hudi CLI 更簡(jiǎn)單易用。用戶現(xiàn)在可以使用這個(gè) bundle jar(已經(jīng)發(fā)布到 Maven 倉庫)和 Hudi Spark bundle 來啟動(dòng)腳本來啟動(dòng)帶有 Spark 的 Hudi-CLI shell,Hudi-CLI 可輕松部署,因?yàn)橛脩舨恍枰诒镜鼐幾g Hudi CLI 模塊、上傳 jar 和解決任何依賴沖突(如果有)。可以在 Hudi CLI 頁面[31]上找到詳細(xì)說明。

          支持 Flink 1.16

          Flink 1.16.x 集成Hudi,在編譯源碼時(shí)使用profile參數(shù)-Pflink1.16激活版本。或者使用 hudi-flink1.16-bundle[32]。Flink 1.15、Flink 1.14 和 Flink 1.13 也將繼續(xù)支持。

          Json Schema轉(zhuǎn)換器

          對(duì)于配置模式注冊(cè)表的 DeltaStreamer 用戶,添加了一個(gè) JSON schema轉(zhuǎn)換器,以幫助將 JSON 模式轉(zhuǎn)換為目標(biāo) Hudi 表的 AVRO。將 hoodie.deltastreamer.schemaprovider.registry.schemaconverter 設(shè)置為 org.apache.hudi.utilities.schema.converter.JsonToAvroSchemaConverter 以使用此功能。用戶還可以實(shí)現(xiàn)此接口 org.apache.hudi.utilities.schema.SchemaRegistryProvider.SchemaConverter 以提供從原始模式到 AVRO 的自定義轉(zhuǎn)換。

          通過 Spark SQL 設(shè)置 Hudi Config

          用戶現(xiàn)在可以通過 Spark SQL conf 提供 Hudi 配置,例如,設(shè)置

          spark.sql("set hoodie.sql.bulk.insert.enable = true")

          確保 Hudi 在執(zhí)行 INSERT INTO 語句時(shí)能夠使用 BULK_INSERT 操作

          感謝

          感謝參與0.13.0版本的所有貢獻(xiàn)者,歡迎廣大數(shù)據(jù)湖愛好者加入Apache Hudi社區(qū),歡迎star & fork https://github.com/apache/hudi

          推薦閱讀

          Apache Hudi 負(fù)載類Payload使用案例剖析

          Apache Hudi 流轉(zhuǎn)批 場(chǎng)景實(shí)踐

          流利說基于Apache Hudi構(gòu)建實(shí)時(shí)數(shù)倉的實(shí)踐

          基于Apache Hudi 構(gòu)建Serverless實(shí)時(shí)分析平臺(tái)

          阿里云ADB基于Hudi構(gòu)建Lakehouse的實(shí)踐

          引用鏈接

          [1] Metaserver: [https://hudi.apache.org/releases/release-0.13.0/#metaserver](https://hudi.apache.org/releases/release-0.13.0/#metaserver)
          [2] 變更數(shù)據(jù)捕獲: [https://hudi.apache.org/releases/release-0.13.0/#change-data-capture](https://hudi.apache.org/releases/release-0.13.0/#change-data-capture)
          [3] 新的 Record Merge API: [https://hudi.apache.org/releases/release-0.13.0/#optimizing-record-payload-handling](https://hudi.apache.org/releases/release-0.13.0/#optimizing-record-payload-handling)
          [4] Deltastreamer支持新數(shù)據(jù)源: [https://hudi.apache.org/releases/release-0.13.0/#new-source-support-in-deltastreamer](https://hudi.apache.org/releases/release-0.13.0/#new-source-support-in-deltastreamer)
          [5] 重大變更: [https://hudi.apache.org/releases/release-0.13.0/#migration-guide-breaking-changes](https://hudi.apache.org/releases/release-0.13.0/#migration-guide-breaking-changes)
          [6] 行為變更: [https://hudi.apache.org/releases/release-0.13.0/#migration-guide-behavior-changes](https://hudi.apache.org/releases/release-0.13.0/#migration-guide-behavior-changes)
          [7] 0.12.0: [https://hudi.apache.org/releases/release-0.12.0](https://hudi.apache.org/releases/release-0.12.0)
          [8] hudi-spark3.2-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark3.2-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark3.2-bundle)
          [9] hudi-utilities-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-utilities-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-utilities-bundle)
          [10] hudi-aws-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-aws-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-aws-bundle)
          [11] hudi-gcp-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-gcp-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-gcp-bundle)
          [12] hudi-utilities-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-utilities-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-utilities-bundle)
          [13] hudi-flink1.16-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-flink1.16-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-flink1.16-bundle)
          [14] 參考: [https://hudi.apache.org/docs/concurrency_control](https://hudi.apache.org/docs/concurrency_control)
          [15] 調(diào)優(yōu)指南: [https://hudi.apache.org/docs/tuning-guide](https://hudi.apache.org/docs/tuning-guide)
          [16] 目錄同步: [https://hudi.apache.org/docs/syncing_metastore](https://hudi.apache.org/docs/syncing_metastore)
          [17] hudi-metaserver-server-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-metaserver-server-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-metaserver-server-bundle)
          [18] HoodieRecordMerger: [https://github.com/apache/hudi/blob/release-0.13.0/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieRecordMerger.java](https://github.com/apache/hudi/blob/release-0.13.0/hudi-common/src/main/java/org/apache/hudi/common/model/HoodieRecordMerger.java)
          [19] ProtoKafkaSource: [https://github.com/apache/hudi/blob/release-0.13.0/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/ProtoKafkaSource.java](https://github.com/apache/hudi/blob/release-0.13.0/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/ProtoKafkaSource.java)
          [20] 文檔: [https://hudi.apache.org/docs/hoodie_deltastreamer](https://hudi.apache.org/docs/hoodie_deltastreamer)
          [21] GcsEventsHoodieIncrSource: [https://github.com/apache/hudi/blob/release-0.13.0/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/GcsEventsHoodieIncrSource.java](https://github.com/apache/hudi/blob/release-0.13.0/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/GcsEventsHoodieIncrSource.java)
          [22] PulsarSource: [https://github.com/apache/hudi/blob/release-0.13.0/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/PulsarSource.java](https://github.com/apache/hudi/blob/release-0.13.0/hudi-utilities/src/main/java/org/apache/hudi/utilities/sources/PulsarSource.java)
          [23] PartialUpdateAvroPayload: [https://github.com/apache/hudi/blob/release-0.13.0/hudi-common/src/main/java/org/apache/hudi/common/model/PartialUpdateAvroPayload.java](https://github.com/apache/hudi/blob/release-0.13.0/hudi-common/src/main/java/org/apache/hudi/common/model/PartialUpdateAvroPayload.java)
          [24] Bucket Index: [https://hudi.apache.org/releases/release-0.11.0#bucket-index](https://hudi.apache.org/releases/release-0.11.0#bucket-index)
          [25] RFC: [https://github.com/apache/hudi/blob/master/rfc/rfc-42/rfc-42.md](https://github.com/apache/hudi/blob/master/rfc/rfc-42/rfc-42.md)
          [26] 此處: [https://issues.apache.org/jira/browse/HUDI-3000](https://issues.apache.org/jira/browse/HUDI-3000)
          [27] 并發(fā)控制: [https://hudi.apache.org/docs/concurrency_control](https://hudi.apache.org/docs/concurrency_control)
          [28] Disruptor: [https://lmax-exchange.github.io/disruptor/user-guide/index.html](https://lmax-exchange.github.io/disruptor/user-guide/index.html)
          [29] 基準(zhǔn): [https://github.com/apache/hudi/pull/5416](https://github.com/apache/hudi/pull/5416)
          [30] hudi-cli-bundle_2.12: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-cli-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-cli-bundle)
          [31] Hudi CLI 頁面: [https://hudi.apache.org/docs/cli](https://hudi.apache.org/docs/cli)
          [32] hudi-flink1.16-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-flink1.16-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-flink1.16-bundle)


          瀏覽 69
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  3级网站在线观看 | 爱福利一区二区三区 | 国产精品激情综合网 | Av之家亚洲中文 AV中文字幕播放 av最新中文字幕 | 国产视频99在线观看 |