Apache Hudi 詳解

1. 什麼是Hudi?

Apache Hudi代表Hadoop Upserts anD Incrementals,管理大型分析數據集在HDFS上的存儲。Hudi的主要目的是高效減少攝取過程中的數據延遲。由Uber開發並開源,HDFS上的分析數據集通過兩種類型的表提供服務:讀優化表(Read Optimized Table)和近實時表(Near-Real-Time Table)。

讀優化表的主要目的是通過列式存儲提供查詢性能,而近實時表則提供實時(基於行的存儲和列式存儲的組合)查詢。

Hudi是一個開源Spark庫,用於在Hadoop上執行諸如更新,插入和刪除之類的操作。它還允許用戶僅攝取更改的數據,從而提高查詢效率。它可以像任何作業一樣進一步水平擴展,並將數據集直接存儲在HDFS上。

2. Hudi如何工作?

Hudi針對HDFS上的數據集提供以下原語

  • 插入更新(upsert)

  • 增量消費

Hudi維護在數據集上執行的所有操作的時間軸(timeline),以提供數據集的即時視圖。Hudi將數據集組織到與Hive表非常相似的基本路徑下的目錄結構中。數據集分爲多個分區,文件夾包含該分區的文件。每個分區均由相對於基本路徑的分區路徑唯一標識。

分區記錄會被分配到多個文件。每個文件都有一個唯一的文件ID和生成該文件的提交(commit)。如果有更新,則多個文件共享相同的文件ID,但寫入時的提交(commit)不同。

存儲類型–處理數據的存儲方式

  • 寫時複製

  • 純列式

  • 創建新版本的文件

  • 讀時合併

  • 近實時

視圖–處理數據的讀取方式

讀取優化視圖-輸入格式僅選擇壓縮的列式文件

  • parquet文件查詢性能

  • 500 GB的延遲時間約爲30分鐘

  • 導入現有的Hive表

近實時視圖

  • 混合、格式化數據

  • 約1-5分鐘的延遲

  • 提供近實時表

增量視圖

  • 數據集的變更

  • 啓用增量拉取

Hudi存儲層由三個不同的部分組成

元數據–它以時間軸的形式維護了在數據集上執行的所有操作的元數據,該時間軸允許將數據集的即時視圖存儲在基本路徑的元數據目錄下。時間軸上的操作類型包括

  • 提交(commit),一次提交表示將一批記錄原子寫入數據集中的過程。單調遞增的時間戳,提交表示寫操作的開始。

  • 清理(clean),清理數據集中不再被查詢中使用的文件的較舊版本。

  • 壓縮(compaction),將行式文件轉化爲列式文件的動作。

  • 索引,將傳入的記錄鍵快速映射到文件(如果已存在記錄鍵)。索引實現是可插拔的,Bloom過濾器-由於不依賴任何外部系統,因此它是默認配置,索引和數據始終保持一致。Apache HBase-對少量key更高效。在索引標記過程中可能會節省幾秒鐘。

  • 數據,Hudi以兩種不同的存儲格式存儲數據。實際使用的格式是可插入的,但要求具有以下特徵–讀優化的列存儲格式(ROFormat),默認值爲Apache Parquet;寫優化的基於行的存儲格式(WOFormat),默認值爲Apache Avro。

3. 爲什麼Hudi對於大規模和近實時應用很重要?

Hudi解決了以下限制

  • HDFS的可伸縮性限制

  • 需要在Hadoop中更快地呈現數據

  • 沒有直接支持對現有數據的更新和刪除

  • 快速的ETL和建模

  • 要檢索所有更新的記錄,無論這些更新是添加到最近日期分區的新記錄還是對舊數據的更新,Hudi都允許用戶使用最後一個檢查點時間戳。此過程不用執行掃描整個源表的查詢

4. 如何使用Apache Spark將Hudi用於數據管道?

4.1 下載Hudi

$ mvn clean install -DskipTests -DskipITs

$ mvn clean install -DskipTests -DskipITs -Dhive11

4.2 版本兼容性

Hudi需要安裝Java 8,適用於Spark-2.x版本。

Hadoop Hive Spark 構建命令
Apache Hadoop-2.8.4 Apache Hive-2.3.3 spark-2.[1-3].x mvn clean install -DskipTests
Apache Hadoop-2.7.3 Apache Hive-1.2.1 spark-2.[1-3].x mvn clean install -DskipTests

4.3 生成Hudi數據集

設置環境變量

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/

export HIVE_HOME=/var/hadoop/setup/apache-hive-1.1.0-cdh5.7.2-bin

export HADOOP_HOME=/var/hadoop/setup/hadoop-2.6.0-cdh5.7.2

export HADOOP_INSTALL=/var/hadoop/setup/hadoop-2.6.0-cdh5.7.2

export HADOOP_CONF_DIR=$HADOOP_INSTALL/etc/hadoop

export SPARK_HOME=/var/hadoop/setup/spark-2.3.1-bin-hadoop2.7

export SPARK_INSTALL=$SPARK_HOME

export SPARK_CONF_DIR=$SPARK_HOME/conf

export PATH=$JAVA_HOME/bin:$HIVE_HOME/bin:$HADOOP_HOME/bin:$SPARK_INSTALL/bin:$PATH

4.4 Api支持

使用DataSource API,只需幾行代碼即可快速開始讀取或寫入Hudi數據集及使用RDD API操作Hudi數據集。

5. Hudi最佳實踐

  • 使用一種新的HoodieRecordPayload類型,並保留以前的持久類型作爲CombineAndGetUpdateValue(...)的輸出。否則前一次提交的提交時間一直更新到最新,會使得下游增量ETL將此記錄計數兩次。

  • 左連接(left join)包含所有通過鍵保留的數據的數據框(data frame),並插入persisted_data.key爲空的記錄。但不確定是否充分利用了BloomIndex/metadata。

  • 添加一個新的標誌字段至從HoodieRecordPayload元數據讀取的HoodieRecord中,以表明在寫入過程中是否需要複製舊記錄。

  • 在數據框(data frame)選項中傳遞一個標誌位以強制整個作業會複製舊記錄。

6. Hudi的優勢

  • HDFS中的可伸縮性限制。

  • Hadoop中數據的快速呈現

  • 支持對於現有數據的更新和刪除

  • 快速的ETL和建模

7. Apache Hudi與Apache Kudu的比較

Apache Kudu與Hudi非常相似;Apache Kudu用於對PB級數據進行實時分析,也支持插入更新。

Apache Kudu和Hudi之間的主要區別在於Kudu試圖充當OLTP(在線事務處理)工作負載的數據存儲,而Hudi卻不支持,它僅支持OLAP(在線分析處理)。

Apache Kudu不支持增量拉取,但Hudi支持增量拉取。

還有其他主要的主要區別,Hudi完全基於Hadoop兼容的文件系統,例如HDFS,S3或Ceph,而Hudi也沒有自己的存儲服務器,Apache Kudu的存儲服務器通過RAFT進行相互通信。

對於繁重的工作流,Hudi依賴於Apache Spark,因此可以像其他Spark作業一樣輕鬆地擴展Hudi。

8. Hudi總結

Hudi填補了在HDFS上處理數據的巨大空白,因此可以與一些大數據技術很好地共存。Hudi最好用於在HDFS之上對parquet格式數據執行插入/更新操作。

發佈了65 篇原創文章 · 獲贊 8 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章