從數據倉庫系統對比看Hive發展前景

jopen 13年前發布 | 18K 次閱讀 Hive

        文 / 楊棟

        大數據時代的信息爆炸,使得分布式/并行處理變得如此重要。無論是傳統行業,還是新興行業(特別是互聯網行業),日常業務運行所產生的海量用戶 和服務數據都需要更大的硬件資源來處理。需要并行處理的應用領域主要為網頁搜索、廣告投放和機器翻譯等。從單機應用到集群應用的過渡中,誕生了 MapReduce 這樣的分布式框架,簡化了并行程序的開發,提供了水平擴展和容錯能力。

        雖然 MapReduce(Hadoop)的應用非常廣泛,但這類框架暴露出來的編程接口仍然比較低級,編寫復雜處理程序或 Ad-hoc 查詢仍然十分耗時,并且代碼很難復用。目前,Google、非死book 和微軟等公司都在底層分布式計算框架之上又提供更高層次的編程模型,將開發者不關心的細節封裝起來,提供了更簡潔的編程接口。

        目前應用最廣泛的當屬 非死book 開源貢獻的 Hive。Hive 是一個基于 Hadoop 的數據倉庫平臺,通過 Hive,可以方便地進行數據提取轉化加載(ETL)的工作。Hive 定義了一個類似于 SQL 的查詢語言 HQL,能夠將用戶編寫的 SQL 轉化為相應的 MapReduce 程序。當然,用戶也可以自定義 Mapper 和 Reducer 來完成復雜的分析工作。從 2010 年下半年開始,Hive 成為 Apache 頂級項目。

        基于 MapReduce 的 Hive 具有良好的擴展性和容錯性。不過由于 MapReduce 缺乏結構化數據分析中有價值的特性,以及 Hive 缺乏對執行計劃的充分優化,導致 Hive 在很多場景下比并行數據倉庫慢(在幾十臺機器的小規模下可能相差更大),Hive 的架構如圖 1 所示。

從數據倉庫系統對比看Hive發展前景

圖 1 Hive 架構圖

        強大的數據倉庫和數據分析平臺至少需要具備以下幾點特性。

  • 靈活的存儲引擎
  • 高效的執行引擎
  • 良好的可擴展性
  • 強大的容錯機制
  • 多樣化的可視化

        本文將簡要闡述 Hive 是否完全具備了以上幾點,以及與傳統的并行數據倉庫對比優劣如何。

        存儲引擎

        Hive 沒有自己專門的數據存儲格式,也沒有為數據建立索引,用戶可以非常自由地組織 Hive 中的表,只要在創建表時告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。Hive 的元數據存儲在 RDBMS 中,所有數據都基于 HDFS 存儲。Hive 包含 Table、External Table、Partition 和 Bucket 等數據模型。

        并行數據倉庫需要先把數據裝載到數據庫中,按特定的格式存儲,然后才能執行查詢。每天需要花費幾個小時來將數據導入并行數據庫中,而且隨著數據量的增長和新的數據源加入,導入時間會越來越長。導入時大量的寫I/O與用戶查詢的讀I/O產生競爭,會導致查詢的性能很差。

        Hive 執行查詢前無需導入數據,執行計劃直接執行。Hive 支持默認的多種文件格式,同時也可以通過實現 MapReduce 的 InputFormat 或 OutputFormat 類,由用戶定制格式。因為公司的數據種類很多,存儲于不同的數據源系統,可能是 MySQL、HDFS 或者 Hypertable 等,很多時候 Hive 的分析過程會用到各種數據源的數據。當然使用多個存儲數據源,除了功能上要能夠支持導入/導出之外,如何根據各種存儲源的能力和執行流獲得最優執行計劃也 是件麻煩事兒。

        執行引擎

        并行數據倉庫使用優化器。在生成執行計劃時,利用元數據信息估算執行流上各個算子要處理的數據量和處理開銷,進而選取最優的執行計劃。并行數據 倉庫實現了各種執行算子(Sort、GroupBy、Union 和 Filter 等),它的執行優化器可以靈活地選擇這多個算子的不同實現。此外,并行數據倉庫還擁有完備的索引機制,包括磁盤布局、緩存管理和I/O管理等多個層面的優 化,這些都對查詢性能至關重要。而這恰恰是 Hive 的不足之處。

        Hive 的編譯器負責編譯源代碼并生成最終的執行計劃,包括語法分析、語義分析、目標代碼生成,所做的優化并不多。Hive 基于 MapReduce,Hive 的 Sort 和 GroupBy 都依賴 MapReduce。而 MapReduce 相當于固化了執行算子,Map 的 MergeSort 必須執行,GroupBy 算子也只有一種模式,Reduce 的 Merge-Sort 也必須可選。另外 Hive 對 Join 算子的支持也較少。另外,內存拷貝和數據預處理也會影響 Hive 的執行效率。當然,數據預處理可能會影響數據的導入效率,這需要根據應用特點進行權衡。

        擴展性

        并行數據倉庫可以很好地擴展到幾十或上百個節點的集群,并且達到接近線性的加速比。然而,今天的大數據分析需要的可擴展性遠遠超過這個數量,經 常需要達到數百甚至上千節點。目前,幾乎沒有哪個并行數據倉庫運行在這么大規模的集群上,這涉及多個方面的原因。并行數據倉庫假設底層集群節點完全同構; 并行數據倉庫認為節點故障是很少出現的;并行數據倉庫設計和實現基于的數據量并未達到 PB 級或者 EB 級。

        與并行數據倉庫不同的是,Hive 更加關注水平擴展性。簡單來講,水平擴展性指系統可以通過簡單的增加資源來支持更大的數據量和負載。

        Hive 處理的數據量是 PB 級的,而且每小時每天都在增長,這就使得水平擴展性成為一個非常重要的指標。Hadoop 系統的水平擴展性是非常好的,而 Hive 基 MapReduce 框架,因此能夠很自然地利用這點。

        容錯性

        Hive 有較好的容錯性。Hive 的執行計劃在 MapReduce 框架上以作業的方式執行,每個作業的中間結果文件寫到本地磁盤,最終輸出文件寫到 HDFS 文件系統,利用 HDFS 的多副本機制來保證數據的可靠性,從而達到作業的容錯性。如果在作業執行過程中某節點出現故障,那么 Hive 執行計劃基本不會受到影響。因此,基于 Hive 實現的數據倉庫可以部署在由普通機器構建的分布式集群之上。

        如果當某個執行計劃在并行數據倉庫上運行時,某節點發生故障,那么必須重新執行該計劃。所以,當集群中的單點故障(可能是磁盤故障等)發生率較 高時,并行數據倉庫的性能就會下降。在實際生產環境中,假設每個節點故障發生率是0.01%,那么 1000 個節點的集群中,單點故障發生率則為 10%。這個數字并不是聳人聽聞的,處理海量數據的I/O密集型應用集群,平均每月的機器故障率達到1%~10%。當然這些機器可能是2~3萬元的普通機 型。

        可視化

        Hive 的可視化界面基本屬于字符終端,用戶的技術水平一般比較高。面向不同的應用和用戶,提供個性化的可視化展現,是 Hive 改進的一個重要方向。個性化的可視化也可以理解為用戶群體的分層,例如,圖形界面方式提供初級用戶,簡單語言方式提供中級用戶,復雜程序方式提供高級用 戶。

        相關系統

        除了 Hive,近年來業界系統也誕生了其他各種類型的數據倉庫,像 Google 的 Tenzing、Dremel、微軟的 DryadLINQ、Hadapt 的 HadoopDB 等。Tenzing 和 DryadLINQ 在框架分層上類似于 Hive,Dremel 除了語言層還實現了計算執行層,而 HadoopDB 的目標是結合并行數據倉庫和 Hadoop 的優點。

        Tenzing 的目標是支持 Google 對數據的 Ad-hoc 分析,當然之前的分析都是基于傳統的關系數據庫的。Tenzing 在性能方面做了大量優化,包括編譯優化以及對 MapReduce 本身的增強等,這些都使得 Tenzing 的性能在很多方面接近甚至超過了并行數據倉庫。另外,基于 LLVM 的 Tenzing 執行引擎可以將單點執行性能提升 10 倍左右。

        DryadLINQ 的目標是對并行程序的開發進行抽象,使其和單機開發一樣。與 Hive 不同的是,DryadLINQ 并不是一種全新的語言,它將特定語法直接集成到宿主語言(C#等高級語言),充分利用宿主語言的抽象和組合等編程語言機制。與 Tenzing 類似,DryadLINQ 的擴展性和可用性都依賴于底層的執行系統 Dryad。

        Dremel 是 Google 用于滿足交互式查詢的系統,主要目標是執行一次性的、結果數據較小的聚合運算,不支持 join、update 等復雜算子。與 Tenzing 和 DryadLINQ 不同,Dremel 沒有基于 MapReduce 或 Dryad 之類的底層計算框架,它實現了一個樹狀的執行層,這個執行層管理節點的失效或競爭,包括優先級等,與 MapReduce 的實現機制相似。Dremel 的底層存儲系統是 GFS,基本概念是按列分割數據,把樹形結構的數據按列分割。

        HadoopDB 希望整合并行數據倉庫和 Hadoop 用于大數據分析,這既能保證高性能,又能提供可擴展和高可用能力。HadoopDB 的基本思想是在節點上運行并行數據庫實例,MapReduce 作為這些節點的執行層,盡可能地將執行計劃放到并行數據庫中完成,利用其已有的優化技術。當然,這會犧牲一部分導入數據的性能,導入數據時會執行一部分表 的布局和重組。

        總結

        作為互聯網領域應用最為廣泛的開源數據倉庫,Hive 是份免費的午餐,尤其它在擴展性和容錯性方面有強大的優勢,其前景被大家一致看好。不過對比傳統并行數據倉庫,Hive 在存儲引擎支持、執行引擎高效化以及多樣化接口等方面,還有很多工作要做。此外,業界的其他數據倉庫,像新興的 Tenzing、DryadLINQ、Dremel 或 HadoopDB 等,都有 Hive 值得借鑒的地方,Hive 原有的實現也還有很大的優化空間。

        Hive 的誕生帶動了 Hadoop 開源棧系統的進一步發展,也使得很多公司能夠從零開始快速搭建數據倉庫系統,推動了整個產業鏈的進步。真心地希望 Hive 能夠繼續成長,不斷演進,成為全面而強大的通用數據倉庫標準。

        作者楊棟,百度分布式高級研發工程師,從事 Hypertable、Hadoop 及流式計算的研究和開發。
來自: www.programmer.com.cn

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!