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格式數據執行插入/更新操作。