Blaze 與 Apache Gluten 深入研究報告:技術實現、性能對比與選型指南
一、項目背景與技術演進
1.1 大數據處理性能瓶頸與 Native 引擎興起
隨著大數據量處理需求的不斷增長,基于 JVM 的 Spark 在 CPU 密集型場景下的性能瓶頸日益凸顯。從 Spark 2.4 版本后,Spark 在特定算子(如 HashAgg、HashJoin、TableScan 等)的性能提升變得緩慢,尤其是在處理大規模數據時,JVM 的內存管理和 GC 開銷成為性能提升的主要障礙。Databricks 等公司的測試表明,在 Intel CPU 上運行 Spark 時,CPU 使用率常常達到 80%-90%,成為性能瓶頸。
為應對這一挑戰,業界開始探索將 Spark 與 Native 引擎結合的解決方案,通過將部分計算任務下推到本地計算引擎執行,充分利用現代 CPU 特性(如 SIMD 指令集)和內存管理優勢。這一趨勢催生了多個 Spark Native 執行引擎項目,其中最具代表性的是 Blaze 和 Apache Gluten。
1.2 Blaze 與 Gluten 項目發展歷程
Blaze是由快手公司于 2021 年底開始調研、2022 年正式立項開發的 Spark 向量化引擎。該項目基于 Apache DataFusion 開發,采用 Rust 語言實現,旨在通過向量化技術提升 Spark SQL 的執行效率。Blaze 于 2023 年開源,目前已在快手內部覆蓋近一半的例行作業,每天使用的資源開銷占據整個集群總量的 30%(優化前這部分作業占資源達 40-50%)。
Apache Gluten項目則由 Intel 和 Kyligence 等公司發起,其前身是 Gazelle 項目。Gluten 作為一個中間層,負責將基于 JVM 的 SQL 引擎的執行任務分流到原生引擎處理。該項目于 2023 年進入 Apache 孵化器,目前已獲得 1300+ GitHub 星標,吸引了來自超過 25 家公司的 163 位以上的貢獻者參與。Gluten 進一步增強了 Spark 工作負載對英特爾架構的依賴性優化,已被 18 家客戶采用,包括 2024 年新增的 8 家。
二、技術架構與實現原理
2.1 Blaze 技術架構與實現
Blaze 是一個基于 Apache DataFusion 項目封裝的向量化執行引擎中間件,通過該組件既能夠充分發揮 Spark 分布式計算框架的優勢,同時也能夠利用 DataFusion Native 向量化算子執行的性能優勢。
2.1.1 核心組件與執行流程
Blaze 的核心架構可以抽象為四個主要組件:
- Blaze Session Extension:主要負責控制整個 Spark 執行過程中算子的檢查和轉換操作
- Plan SerDe:通過 protobuf 來對 DataFusion 執行計劃進行序列化和反序列化
- JNI Gateways:通過 JNI 實現數據和執行計劃的傳遞轉換
- Native Operators:將 Spark 的執行計劃映射到 Native 引擎的具體執行
- Blaze 的執行過程可分為三個主要步驟:
- 物理執行計劃的轉換:將 Spark 生成的物理執行計劃轉換為對應的 Native Plan
- Native Plan 的生成和提交:將轉換后的計劃通過 JNI 傳遞給底層的 DataFusion 執行
- Native 執行:由 DataFusion 引擎執行向量化計算
Blaze 采用 Spark 3.0 引入的 Session Extension 機制,在生成物理執行計劃到每個 Stage 實際執行之前,通過 Blaze 的 Extension 組件對整個 Stage 中的所有算子進行檢查和翻譯。對于無法轉換為 Native 執行的算子,Blaze 會在算子前后加入列轉行和行轉列的算子,通過 FFI 實現數據在 Native 和 JVM 之間的交換。
2.1.2 向量化執行與內存管理
Blaze 底層技術實現采用的是 Rust,是基于 Apache 的 DataFusion 引擎開發的。DataFusion 項目采用列式計算,并對主要的表達式計算實現了 Native 向量化支持,經過翻譯后的 Native 算子執行效率遠高于 Spark 原生 JVM 執行。
在內存管理方面,Blaze 實現了一套獨特的策略:
- 堆外內存管理:Blaze Native 代碼直接申請堆外內存,避免了 JVM GC 的影響
- 二級 Spill 策略:當堆外內存不足時,Blaze 會在堆內開辟空間,通過 JNI+NIO 方式將需要 Spill 的數據直接寫入堆內,這樣就能夠把堆外空間釋放出來;當堆內空間也不足時,將這部分內存塊寫到磁盤文件
- 自定義內存分配器:Blaze 在 Agg 算子中使用 hashbrown 進行 hash 表的維護,它是 google SwissTable 的高效實現,在性能和內存開銷上都有很大優勢
2.1.3 列式 Shuffle 與優化
Blaze 對傳統行式 shuffle 進行了優化,采用列式 shuffle 來更好地提速。在 Shuffle 數據轉換上,Blaze 最初采用 Arrow-RPC 格式,但發現處理字符串列時壓縮效率不理想。為此,Blaze 實現了自定義的格式,通過把字符串存儲改成按順序寫入每行的長度和字符串字節數組,并且使用前綴編碼的處理方式,讓長度在大部分 case 下只占 1~2 字節,這樣就能夠很好地觸發 ZSTD 的壓縮。
2.2 Apache Gluten 技術架構與實現
Apache Gluten 是一個負責將基于 JVM 的 SQL 引擎的執行任務分流到原生引擎處理的中間層設計項目。其核心思路是通過本地化(Native)引擎優化 Spark 的執行效率,解決 Spark 在 CPU 密集型場景下的性能瓶頸。
2.2.1 架構設計與工作原理
Gluten 的核心架構設計是一個中間層,向上承接 Spark 框架,向下對接不同類型的后端本地計算引擎。其工作原理如下:
- 物理執行計劃轉換:Gluten 將 Spark 生成的物理執行計劃轉換為 Substrait 格式的計劃(基于 Protobuf 的跨語言序列化協議)
- 計劃分發與執行:將 Substrait 計劃發送至不同的后端引擎(如 Velox 或 ClickHouse)執行
- 結果整合:將后端引擎的執行結果整合,返回給 Spark 框架
Gluten 采用 Spark 2.4 版發展出的為拓展 GPU 而設定的 public common API 接口,以插件形式實現 Spark 對接,使得本地計算引擎得以在 Spark 里運作。在單一任務執行時,Gluten 監測 Operator 是否能被本地庫執行,若能執行,就通過 Gluten 插件,對接 JNI 接口下推算子,然后選擇后端引擎類型執行;若不能執行,就執行 fallback,回到 JVM 計算引擎做執行。
2.2.2 多后端引擎支持
Gluten 支持多種后端引擎,目前主要支持兩種主流的計算引擎:
- Velox:由 Meta(Facebook)公司開源的 C++ 向量化執行引擎庫,由 Gluten 團隊主要負責維護,包括查詢計劃的轉換、算子下推等
- ClickHouse:由 Kyligence 團隊維護的高性能 OLAP 引擎,包括源碼管理和規劃
Gluten 項目當前只能夠選擇單一后端引擎,即選擇 Velox 引擎,那么在編譯階段和執行階段都使用 Velox 引擎。未來計劃通過成本模型(Cost Model)進行后端引擎的消費分析,以進行引擎的策略選用,即有多個不同種類型后端,在實際分析時,通過在 Gluten 中的成本模型,去分析在哪一個后端的消費是最低的,性能是最優的。
2.2.3 列式 Shuffle 與內存管理
Gluten 改寫了傳統行式 shuffle,使用列式 shuffle 來更好地提速,這樣也可以避免 fallback 問題(即 C2R\R2C 的數據轉換問題)。列式 shuffle 帶來的好處包括:
- 硬件特性發揮:使用列式 shuffle 可以使得一些硬件特性得以發揮,例如 AVX 技術帶來的提速
- 數據通信減少:在實際引擎計算層面,使用列式 shuffle 可以減少 10% 到 20% 的數據通信,能夠大幅減少 shuffle 的執行時間
在內存管理方面,Gluten 采用 Spark 統一的參數變量,對內存做統一的管理,實現的模式是 Off Heap Memory(堆外內存)。調整 Spark 中的 Off Heap 參數,通過調用這個參數做內存的統一管理,調整過程中,當流轉到本地計算庫時候,本地計算是可以直接通過 Off Heap 部分的內存做分配,即直接讓本地計算的內存調用直接在 Off Heap 內存中使用。
2.3 技術架構對比分析
Blaze 和 Apache Gluten 在技術架構上有許多相似之處,也存在一些關鍵差異:
- 相似點:
- 兩者都基于 Spark 插件機制實現,不改變 Spark 的分布式控制流和資源管理
都采用將 Spark 物理執行計劃轉換為中間格式(Blaze 使用 ProtoBuf,Gluten 使用 Substrait)的方式,交由后端 Native 引擎執行 - 都支持向量化執行和列式 Shuffle,以提高計算效率和減少數據轉換開銷
- 都實現了 fallback 機制,當遇到不支持的算子時回退到 Spark 原生執行
- 兩者都基于 Spark 插件機制實現,不改變 Spark 的分布式控制流和資源管理
- 差異點:
- 中間格式:Blaze 將 Spark 物理執行計劃轉換為 Rust DataFusion 的向量化執行計劃,通過 JNI 方式傳遞給底層的 DataFusion 執行;Gluten 將 Spark 的物理執行計劃轉化為 Substrait plan,然后再傳遞給底層的 Native 執行引擎(如 Velox 或 ClickHouse)
- 開發語言:Blaze + DataFusion 是基于 Rust 編寫;Gluten + Velox 是基于 C++ 編寫
- 執行引擎:Blaze 依賴 DataFusion 引擎;Gluten 支持 Velox 和 ClickHouse 雙引擎
- 序列化協議:Blaze 在物理執行計劃傳遞部分采用 ProtoBuf 格式;Gluten 在物理執行計劃傳遞部分采用 Substrait 格式
- 內存管理:Blaze 實現了二級 Spill 策略;Gluten 采用統一的 Off Heap 內存管理
三、性能對比與優化效果
3.1 Blaze 性能表現與優化效果
Blaze 在多種基準測試和實際生產環境中表現出顯著的性能提升
3.1.1 基準測試結果
在 TPC-DS 1TB 數據測試中,Blaze 展現出了優異的性能表現:
- 單個查詢最高能達到 10 倍的性能提升
- 整體平均性能提升超過 2 倍
- 在 80 個 Task 并發的測試環境下,Blaze 能夠跑通所有的 TPC-DS 查詢,并且在多個查詢中表現突出。這一結果證明了 Blaze 在復雜數據分析場景下的高效性。
3.1.2 生產環境收益
Blaze 在快手內部生產環境的實際落地情況如下:
- 目前已在一部分生產 ETL 任務上灰度上線
- 單個任務最大可以達到四倍多的性能提升
- 平均性能提升已經達到兩倍以上
- 已覆蓋近一半的例行作業,每天使用的資源開銷占據整個集群總量的 30%(優化前這部分作業占資源達 40-50%)
這些數據表明,Blaze 不僅在基準測試中表現優異,在實際生產環境中也能帶來顯著的性能提升和資源節省。
3.1.3 內存使用與 API 復雜度
Blaze 在內存使用方面也表現出色。在單機測試中,Blaze 在 PageRank、KMeans 和 GMM 等算法上的內存消耗比 Spark 低 10 倍。這主要得益于 Blaze 的向量化執行和高效的內存管理機制。
此外,Blaze 在 API 復雜度方面也有優勢。Blaze 使用的不同 API 數量遠少于 Spark,降低了認知負擔。Spark 的內置實現使用約 30 個不同的并行原語來完成不同的任務,而 Blaze 只使用 MapReduce 函數和不到 5 個實用函數。
3.2 Apache Gluten 性能表現與優化效果
Apache Gluten 在多種測試環境和實際應用中也表現出了顯著的性能提升:
3.2.1 基準測試結果
Gluten 在 TPC-H 和 TPC-DS 等基準測試中表現優異:
- 在 TPC-H 測試中,Gluten 比原生 Spark 快 3.3 倍
- 在 TPC-DS 測試中,Gluten 比原生 Spark 快 2.7 倍
- TPC-H 測試單查詢最高加速 14.5 倍
- 用戶不用修改一行代碼就可以帶來 Spark SQL 任務性能 2 倍左右的提升
在英特爾的協助下,Gluten 已被 18 家客戶采用,其中包括 2024 年新增的 8 家。美團在私有云環境中,已經有超過 10 萬個任務采用 Gluten。
3.2.2 生產環境收益
Gluten 在生產環境中的實際應用效果如下:
- 可使 ETL 任務成本降低 40% 以上
- 在 CPU 使用率方面,使用 Gluten 后,CPU 使用率明顯降低,從 80%-90% 降至更合理的水平
- 實現了對 92% 的 Spark 通用函數和 84% 的操作符的支持
3.2.3 硬件加速與能效比
Gluten 特別針對 Intel CPU 進行了優化,能夠充分發揮現代 CPU 的特性:
- 在英特爾 ? 至強 ? 6960P 處理器上實現了最高 3.3 倍性能提升
- 在英特爾 ? 至強 ? 6780E 上實現了每瓦性能 2.74 倍提升
- Intel QAT 技術可帶來額外 20% 的性能提升(須搭配 Intel 最新硬件平臺)
3.3 性能對比分析
將 Blaze 和 Apache Gluten 的性能數據進行對比,可以發現以下特點:
- 相同點:
- 兩者在 TPC-DS 和 TPC-H 等基準測試中都表現出比原生 Spark 顯著的性能提升
- 在實際生產環境中都能帶來 2 倍以上的平均性能提升
- 都能顯著降低資源消耗和作業成本
- 差異點:
- 峰值性能:Blaze 在單個查詢上最高可達 10 倍性能提升,而 Gluten 在 TPC-H 單查詢上最高加速 14.5 倍,兩者在不同測試場景中表現出不同的峰值性能
- 平均性能:Blaze 的平均性能提升約為 2 倍,Gluten 的平均性能提升約為 2-5 倍,Gluten 在某些場景下的平均性能提升更顯著
- 硬件優化:Gluten 特別針對 Intel CPU 進行了優化,能更好地發揮 Intel 架構的特性,在 Intel 平臺上的能效比提升更為明顯
內存使用:Blaze 在內存使用方面表現更為出色,特別是在 PageRank、KMeans 和 GMM 等算法上的內存消耗比 Spark 低 10 倍
四、社區生態與發展現狀
4.1 Blaze 社區生態與發展
Blaze 社區經歷了從相對不活躍到逐漸活躍的發展過程:
4.1.1 社區參與度
Blaze 開源社區的發展歷程如下:
- 前期活躍度不高,國內參與公司較少
- 最近有開始活躍的趨勢
- 已吸引了一些社區用戶貢獻,如對 ORC 文件格式的集成和 Paimon Scan 算子的實現
快手 Blaze 團隊在開發過程中也向 DataFusion 社區反饋了很多代碼,包括內存管理機制、支持 HDFS 讀寫的 Remote Storage API、以及各種關于 sort 的深度優化。
4.1.2 功能擴展與生態建設
Blaze 的功能覆蓋和生態建設進展如下:
- 算子覆蓋度:開發工作基本是按照線上使用頻率來推進的,最常見的算子基本都支持;已支持 Parquet 格式,但文本、ORC 等格式暫時還沒有支持;SortMergeJoin 暫時還不支持 Post Filter;BroadcastHashJoin 暫時還不支持在 Driver 端構建 HashMap 和內存管理
數據類型支持:復雜數據類型 Struct、List 等已開發完成,正在進行全面測試 - 生態擴展:2024Q4 與阿里云進行合作共建,完成了 Blaze 對 Celeborn 的支持;社區用戶貢獻了對 ORC 文件格式的集成;社區用戶實現了 Paimon Scan 算子,支持 Blaze 讀取 Paimon 表功能
4.1.3 版本更新與功能演進
Blaze 的版本演進和功能更新情況如下:
- 最新版本:v5.0.0(2024 年 11 月 15 日發布)
- 新功能:支持 UDAF falling back;支持原生 round-robin partitioner 和 range partitioner;支持 Spark 3.5 引入的 WindowGroupLimitExec;支持當構建側過大時將 SHJ 回退到 SMJ;完全支持 Apache Celeborn shuffle 服務;初步支持 Apache Uniffle shuffle 服務;初步支持 Apache Paimon 數據源
- 改進:改進了 AggExec/SortMergeJoinExec 中的內存管理,減少 OOM 發生次數;改進了指標統計
- 修復:修復了字符串到數據類型轉換不一致問題;修復了 Bloom Filter Join 不一致問題;修復了動態分區寫入時的排序順序錯誤;修復了 sha2x 函數不一致問題
4.2 Apache Gluten 社區生態與發展
Apache Gluten 作為 Apache 項目,擁有更為活躍的社區生態和更廣泛的參與度:
4.2.1 社區規模與貢獻
Gluten 社區的規模和貢獻情況如下:
- 已獲得 1300+ stars
- 吸引了來自超過 25 家公司的 163 位以上的貢獻者參與
- 英特爾 Gluten 團隊主導委員會并領導該項目
已被 18 家客戶采用,其中包括 2024 年新增的 8 家
4.2.2 功能覆蓋與生態集成
Gluten 的功能覆蓋和生態集成情況如下:
- 算子覆蓋:實現了對 84% 的 Spark 操作符的支持
- 函數支持:實現了對 92% 的 Spark 通用函數的支持
- 數據類型支持:實現了對 93% 的常見數據類型的支持
- 安裝與文檔:安裝和文檔覆蓋率達到 60%
- 云原生集成:與 Apache Celeborn 集成,通過 Remote Shuffle Service 解決本地 Shuffle 的存算耦合問題
- 生態支持:支持 DeltaLake、Iceberg 和 Hudi 等數據湖格式,主要支持 Read 功能,Write 功能正在與特定客戶合作定制化開發
4.2.3 版本演進與未來規劃
Gluten 的版本演進和未來規劃如下:
- 最新版本:v1.4.0(2024 年 12 月 20 日發布)
- 新功能:添加了更多 Spark 算子支持,包括 range、collect limit 等;更新了 OAP 的 Velox 代碼庫到 2025/05/12 版本
- 未來計劃:2025 年上半年聚焦于對 Spark 4.0 框架的支持;持續提升性能表現,包括 BHJ、SMJ 等;處理階段 fallback 中涉及到 OnHeap/OffHeap 的內存管理工作;持續推進 shuffle 優化;實現對 Flink 的支持,將 Gluten 打造成流批一體的框架
4.3 社區生態對比分析
將 Blaze 和 Apache Gluten 的社區生態進行對比,可以發現以下特點:
- 相同點:
- 都在不斷擴展功能覆蓋和生態支持
- 都在積極與其他大數據組件集成,如 Celeborn 和數據湖格式
- 都在持續優化性能和穩定性
- 差異點:
- 社區活躍度:Blaze 社區前期活躍度不高,最近開始活躍;Gluten 作為 Apache 項目,社區活躍度更高,參與公司和貢獻者更多
- 功能覆蓋:Gluten 的算子、函數和數據類型覆蓋度更高,達到 80% 以上;Blaze 的算子覆蓋度按使用頻率推進,部分格式和功能尚未支持
- 生態集成:Gluten 支持更多的數據湖格式和更完善的云原生集成;Blaze 雖然也在擴展生態,但目前支持的生態系統相對較少
- 版本演進:Gluten 有更明確的版本發布計劃和未來路線圖;Blaze 的版本更新相對不那么規律
五、部署與使用對比
5.1 Blaze 部署與使用
Blaze 的部署和使用流程相對復雜,需要一定的技術基礎:
5.1.1 部署流程
Blaze 的部署主要包括以下步驟:
- 環境準備:
- 需要安裝 Rust 環境
- 需要編譯 Blaze 的 Native 庫
- Spark 配置:
- 通過 Spark 的 Session Extension 機制配置 Blaze 插件
- 配置 Blaze 相關參數,如是否啟用 Blaze、內存分配等
- 執行計劃轉換:
- Blaze 通過 Spark 3.0 引入的 Session Extension 機制,在生成物理執行計劃到每個 Stage 實際執行之前,對整個 Stage 中的所有算子進行檢查和翻譯
- 對于無法轉換為 Native 執行的算子,Blaze 會在算子前后加入列轉行和行轉列的算子,通過 FFI 實現數據在 Native 和 JVM 之間的交換
5.1.2 使用難度
Blaze 的使用難度主要體現在以下幾個方面:
- 技術棧要求:需要對 Rust 和 DataFusion 有一定的了解,因為 Blaze 是基于 Rust 和 DataFusion 開發的
- 算子轉換:需要將 Spark 生成的物理執行計劃轉換為 Rust DataFusion 的向量化執行計劃,通過 JNI 方式傳遞給底層的 DataFusion 執行
- 兼容性處理:對于不支持的算子,需要處理行列轉換帶來的性能開銷,Blaze 實現了基于規則的策略來決策部分算子是否需要翻譯
5.1.3 最佳實踐與優化建議
Blaze 的使用最佳實踐和優化建議包括:
- 算子選擇:優先選擇 Blaze 支持的算子,以獲得最佳性能
- 數據格式:優先使用 Parquet 格式,因為 Blaze 對 Parquet 的支持最為完善
- 內存管理:合理配置堆外內存和堆內內存的比例,避免 OOM 問題
- 調試與監控:利用 Blaze 提供的指標統計功能,監控執行性能和資源使用情況
5.2 Apache Gluten 部署與使用
Apache Gluten 的部署和使用相對簡單,對用戶透明性更高:
5.2.1 部署流程
Gluten 的部署流程非常簡單,主要包括以下步驟:
依賴添加:
在 Spark 的配置文件中添加 Gluten 插件依賴
示例配置:
spark.jars.packages=org.apache.gluten:gluten-spark3.5_2.12:1.1.0
spark.plugins=org.apache.gluten.GlutenPlugin
注:需根據 Spark 版本選擇適配的 Gluten 包
后端引擎選擇:
通過配置選擇 Velox 或 ClickHouse 后端:
Velox后端
spark.gluten.sql.enable.native.engine=velox
spark.gluten.sql.velox.execution.mode=auto
ClickHouse后端
spark.gluten.sql.enable.native.engine=ch
spark.gluten.sql.ch.worker.id=ch01
內存配置優化:
調整 Native 與 JVM 內存比例(建議 Native 占 70%):
spark.memory.offHeap.size=20g
spark.gluten.memory.allocator.reserved=2g
spark.gluten.memory.task.ratio=0.7
5.2.2 使用難度
Apache Gluten 的使用難度顯著低于 Blaze,主要體現在:
- 零代碼修改:用戶不需要修改一行代碼,只需要在 Spark 的配置文件中添加 Gluten 插件依賴,并根據需求選擇后端引擎即可
- 自動轉換:Gluten 本質上是基于 Spark 插件接口開發的項目,自動將 Spark 的物理執行計劃轉換為 Substrait 格式,交由后端引擎執行
- 自動回退:當遇到不支持的算子時,Gluten 會自動回退到 Spark 原生執行,保證任務執行的連續性
5.2.3 最佳實踐與優化建議
Gluten 的使用最佳實踐和優化建議包括:
性能調優配置:
啟用向量化執行加速:
spark.sql.inMemoryColumnarStorage.enabled=true
spark.sql.parquet.filterPushdown=true
spark.gluten.sql.columnar.batchscan.enabled=true
使用列式 Shuffle 減少序列化開銷:
spark.shuffle.manager=org.apache.spark.shuffle.sort.ColumnarShuffleManager
spark.gluten.sql.columnar.shuffle.prefer.direct=true
配置動態回退機制:
spark.gluten.sql.fallback.strategy=auto
spark.gluten.sql.fallback.threshold=3
- 生產環境實踐:
- 資源隔離:在 YARN/K8s 中為 Native 進程預留資源
- 監控告警:集成 Prometheus 監控 Native 內存使用
- 版本兼容性:根據 Spark 版本選擇合適的 Gluten 版本
- 問題排查:
- Native OOM 錯誤:檢查內存配置比例,增加 spark.gluten.memory.task.ratio 值
- 算子回退頻繁:查看日志中的 Fallback occurred 警告,更新 Gluten 版本或改寫 SQL
- 性能未達預期:確認是否啟用 Columnar Shuffle,檢查數據傾斜情況
5.3 部署與使用對比分析
將 Blaze 和 Apache Gluten 的部署與使用進行對比,可以發現以下特點:
- 相同點:
- 都需要在 Spark 配置中添加插件依賴
- 都需要進行內存配置優化
- 都提供了回退機制,確保任務執行的連續性
- 差異點:
- 部署復雜度:Blaze 的部署需要編譯 Native 庫和配置 Rust 環境,相對復雜;Gluten 的部署只需要添加依賴和配置參數,相對簡單
- 代碼修改:Blaze 可能需要對某些算子進行特殊處理;Gluten 用戶不需要修改一行代碼,完全透明
- 學習成本:Blaze 需要了解 Rust 和 DataFusion;Gluten 需要了解 Substrait 和 Velox/ClickHouse,但整體學習成本較低
- 調試難度:Blaze 的調試可能涉及 JNI 和 Rust 代碼,較為復雜;Gluten 提供了更完善的監控和調試工具,調試相對容易
- 配置靈活性:Blaze 提供了更多底層配置選項,靈活性更高;Gluten 的配置相對標準化,靈活性較低但更容易上手
六、應用場景與選型建議
6.1 適用場景分析
Blaze 和 Apache Gluten 各自適用于不同的應用場景:
6.1.1 Blaze 適用場景
Blaze 特別適合以下場景:
- Rust 技術棧環境:
- 團隊熟悉 Rust 語言,希望利用 Rust 的高性能和內存安全特性
- 已經在使用 DataFusion 或計劃引入 Rust 技術棧的組織
- 特定計算密集型任務:
- 數據挖掘任務:Blaze 在常見數據挖掘任務(包括詞頻統計、PageRank、k-means、期望最大化和 k - 最近鄰)上比 Spark 快 10 倍
- 復雜分析查詢:在 TPC-DS 測試中,單個查詢最高能達到 10 倍的性能提升
- 內存敏感型應用:Blaze 在內存使用方面表現出色,特別是在 PageRank、KMeans 和 GMM 等算法上的內存消耗比 Spark 低 10 倍
- 快手生態系統:
- 已經在使用快手生態系統(如 Paimon)的用戶
- 計劃與阿里云 Celeborn 集成的場景
6.1.2 Apache Gluten 適用場景
Apache Gluten 更適合以下場景:
- Intel CPU 環境:
- 運行在 Intel 架構服務器上的 Spark 集群
- 希望充分利用 Intel CPU 特性(如 AVX 指令集)的場景
- 多樣化計算需求:
- 混合工作負載:同時處理批處理和流處理任務
- 需要支持多種數據湖格式(如 DeltaLake、Iceberg、Hudi)的場景
- 計劃擴展到流計算的組織
- 生產穩定性要求高:
- 大規模生產環境,美團等公司已在私有云環境中使用 Gluten 處理超過 10 萬個任務
- 對任務穩定性和兼容性要求高的場景,Gluten 的自動回退機制保障了任務的連續性
- 多語言生態系統:
- 需要與多種語言和工具集成的大數據平臺
- 計劃使用 Flink 等其他計算框架的組織
6.2 選型決策框架
在 Blaze 和 Apache Gluten 之間進行選擇,可以考慮以下決策框架:
6.2.1 技術棧適配度
技術棧適配度是首要考慮因素:
- 開發語言匹配:
- 如果團隊熟悉 Rust 語言,并且希望引入或已經在使用 Rust 技術棧,Blaze 可能更容易上手和進行二次開發
- 如果團隊熟悉 C++ 和 Java 生態系統,Gluten 在技術理解和集成上可能更具優勢
- 現有架構兼容性:
- 如果現有架構中已經使用 DataFusion 或計劃引入 Rust 技術棧,Blaze 是更好的選擇
- 如果現有架構基于 C++ 和 Java,并且希望利用 Intel CPU 的特性,Gluten 可能更適合
6.2.2 性能需求與優化目標
性能需求和優化目標是關鍵決策因素:
- 計算密集型任務:
- 對于數據挖掘任務,Blaze 在常見數據挖掘任務上比 Spark 快 10 倍
- 對于 TPC-H 和 TPC-DS 等基準測試,Gluten 在 TPC-H 測試中比原生 Spark 快 3.3 倍,在 TPC-DS 測試中比原生 Spark 快 2.7 倍
- 資源優化目標:
- 如果主要目標是減少內存使用,Blaze 在內存使用方面表現更為出色
- 如果主要目標是降低 CPU 使用率和提高能效比,Gluten 在 Intel 平臺上的表現更為突出
6.2.3 生態系統與集成需求
生態系統和集成需求也會影響選擇:
- 數據格式支持:
- 如果主要使用 Parquet 格式,Blaze 已經提供了良好的支持
- 如果需要支持多種數據湖格式,Gluten 支持 DeltaLake、Iceberg 和 Hudi 等多種格式
- Shuffle 服務集成:
- 如果計劃使用 Celeborn 或 Uniffle 作為 Shuffle 服務,Blaze 已經提供了支持
- 如果關注 Shuffle 優化和存算分離,Gluten 與 Apache Celeborn 的集成提供了更完善的解決方案
6.2.4 團隊資源與運維能力
團隊資源和運維能力是長期成功的關鍵:
- 技術能力:
- Blaze 需要團隊對 Rust 和 DataFusion 有一定的了解
- Gluten 的部署和使用相對簡單,對團隊的技術要求較低
- 運維資源:
- Blaze 社區相對較小,技術支持可能有限
- Gluten 作為 Apache 項目,社區活躍度高,技術支持更為充分
6.3 綜合選型建議
基于上述分析,我們提出以下綜合選型建議:
6.3.1 優先選擇 Blaze 的情況
建議優先選擇 Blaze 的情況包括:
- 團隊技術棧:
- 團隊熟悉 Rust 語言
- 已經在使用或計劃引入 Rust 技術棧
- 希望利用 Rust 的內存安全和高性能特性
- 應用場景:
- 主要處理數據挖掘任務和復雜分析查詢
- 對內存使用效率有較高要求
- 已經在使用或計劃使用快手生態系統組件(如 Paimon)
- 部署環境:
- 有能力和資源進行較為復雜的部署和維護
- 需要高度定制化和靈活性的解決方案
6.3.2 優先選擇 Apache Gluten 的情況
建議優先選擇 Apache Gluten 的情況包括:
- 團隊技術棧:
- 團隊熟悉 Java 和 C++ 生態系統
- 希望最小化學習成本和技術棧變更
- 需要穩定的社區支持和完善的文檔
- 應用場景:
- 主要處理 ETL 和數據分析任務
- 需要支持多種數據湖格式和流計算
- 對任務穩定性和兼容性要求高
- 部署環境:
- 運行在 Intel CPU 平臺上
- 需要簡單部署和維護
- 大規模生產環境,對資源管理和監控有較高要求
6.3.3 混合使用策略
在某些情況下,混合使用 Blaze 和 Apache Gluten 可能是最佳選擇:
- 任務特定優化:
- 對計算密集型和內存敏感型任務使用 Blaze
- 對通用 ETL 和數據分析任務使用 Gluten
- 分階段遷移:
- 先在部分任務上使用 Blaze 或 Gluten 進行測試和驗證
- 根據測試結果逐步擴展到其他任務
- 技術探索:
- 同時評估兩種技術,根據團隊反饋和性能結果決定最終選擇
- 關注兩種技術的發展動態,隨時調整技術路線
6.4 最終建議
綜合本研究的分析和結論,對考慮采用 Blaze 或 Apache Gluten 的企業提出以下最終建議:
- 技術選型:
- 根據團隊技術棧、應用場景和部署環境,選擇最適合的技術
- 避免一刀切,可考慮混合使用策略,根據任務特點選擇最優技術
- 實施路徑:
- 采用分階段評估和實施策略,從試點到全面推廣
- 建立明確的評估指標和成功標準
- 確保有回滾計劃,降低實施風險
- 長期規劃:
- 將技術選擇與企業整體技術戰略對齊
- 關注技術發展趨勢,保持技術靈活性
- 投資團隊技能培養,提升技術能力
Blaze 和 Apache Gluten 代表了 Spark 性能優化的重要方向,通過將部分計算任務下推到 Native 引擎執行,能夠充分發揮現代硬件的性能潛力。隨著技術的不斷發展和社區的成熟,它們將在大數據處理領域發揮越來越重要的作用。企業應根據自身需求和條件,選擇最適合的技術,并積極參與技術演進,獲取最大價值。