天天看點

Impala:新一代開源大資料分析引擎

Impala 項目首頁在: https://github.com/cloudera/impala 大資料處理是雲計算中非常重要的問題,自Google公司提出MapReduce分布式處理架構以來,以Hadoop為代表的開源軟體受到越來越多公司的重視和青睐。以Hadoop為基礎,之後的HBase,Hive,Pig等系統如雨後春筍般的加入了Hadoop的生态系統中。今天我們就來談談Hadoop系統中的一個新成員 – Impala。

Impala架構分析

Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能夠查詢存儲在Hadoop的HDFS和HBase中的PB級大資料。已有的Hive系統雖然也提供了SQL語義,但是由于Hive底層執行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的互動性;相比之下,Impala的最大特點也是最大賣點就是它的快速。那麼Impala如何實作大資料的快速查詢呢?在回答這個問題之前,我們需要先介紹Google的Dremel系統[1],因為Impala最開始就是參照Dremel系統進行設計的。

 Dremel是Google的互動式資料分析系統,它建構于Google的GFS(Google File System)等系統之上,支撐了Google的資料分析服務BigQuery等諸多服務。Dremel的技術亮點主要有兩個:一個是實作了嵌套型資料的列存儲;二是使用了多層查詢樹,使得任務可以在數千個節點上的并行執行和聚合結果。列存儲在關系型資料庫中并不陌生,它可以減少查詢時處理的資料量,有效的提升查詢效率。Dremel的列存儲的不同之處在于它針對的并不是傳統的關系資料,而是針對嵌套結構的資料。Dremel可以将一條條的嵌套結構的記錄轉換成列存儲形式,查詢時根據查詢條件讀取需要的列,然後進行條件過濾,輸出時再将列組裝成嵌套結構的記錄輸出,記錄的正向和反向轉換都通過高效的狀态機實作。另一方面,Dremel的多層查詢樹則借鑒了分布式搜尋引擎的設計,查詢樹的根節點負責接收查詢,并将查詢分發到下一層節點,底層節點負責具體的資料讀取和查詢執行,然後将結果傳回上層節點。關于Dremel技術實作上的更多資訊,讀者可以參閱[9]。

Impala其實就是Hadoop的Dremel,Impala使用的列存儲格式是Parquet。Parquet實作了Dremel中的列存儲,未來還将支援Hive并添加字典編碼,遊程編碼等功能。Impala的系統架構如圖一所示。Impala使用了Hive 的SQL接口(包括SELECT,INSERT,Join等操作),但目前隻實作了Hive的SQL語義的子集(例如尚未對UDF提供支援),表的中繼資料資訊存儲在Hive的Metastore中。StateStore是Impala的一個子服務,用來監控叢集中各個節點的健康狀況,提供節點注冊,錯誤檢測等功能。Impala在每個節點運作了一個背景服務impalad,impalad用來響應外部請求,并完成實際的查詢處理。Impalad主要包含Query Planner,Query Coordinator和Query Exec Engine三個子產品。QueryPalnner接收來自SQL APP和 ODBC的查詢,然後将查詢轉換為許多子查詢,Query Coordinator将這些子查詢分發到各個節點上,由各個節點上的Query Exec Engine負責子查詢的執行,最後傳回子查詢的結果,這些中間結果經過聚集之後最終傳回給使用者。

圖1. Impala的系統架構圖 [2]

在Cloudera的測試中,Impala的查詢效率相比Hive,有數量級的提升。從技術角度上來看,Impala之是以能有好的性能,主要有如下幾方面的原因:

  1. Impala不需要把中間結果寫入磁盤,省掉了大量的I/O開銷。
  2. 省掉了MapReduce作業啟動的開銷。MapReduce啟動task的速度是很慢的(預設每個心跳間隔是3秒鐘),Impala直接通過相應的服務程序來進行作業排程,速度快了很多。
  3. Impala完全抛棄了MapReduce這個不太适合做SQL查詢的範式,而是像Dremel一樣借鑒了MPP并行資料庫的思想,從新另起爐竈,是以可以做更多的查詢優化,進而能省掉不必要的shuffle,sort等開銷;
  4. 通過使用LLVM來統一編譯運作時代碼,避免了為支援通用編譯而帶來的不必要開銷;
  5. 用C++實作,做了很多有針對性的硬體優化,例如使用SSE指令;
  6. 使用了支援Data locality的I/O排程機制,盡可能的将資料和計算配置設定在同一台機器上進行,減少了網絡開銷;

雖然Impala是參照Dremel來實作,但是Impala也有一些自己的特色,例如Impala不僅僅支援Parquet格式,同時也可以直接處理文本,SequenceFile等Hadoop中常用的檔案格式。另外一個更關鍵的地方在于,Impala是開源的,再加上Cloudera在Hadoop領域的上司地位,其生态圈有很大可能會在将來快速成長。可以預見在不久的未來,Impala很可能像之前的Hadoop和Hive一樣在大資料處理領域大展拳腳。Cloudera自己也說期待未來Impala能完全取代Hive。當然,使用者從Hive上遷移到Impala上來是需要時間的,而且Impala也隻是剛剛釋出1.0版,雖然号稱已經可以穩定的在生産環境上運作,但相信仍然有很多可改進的空間[7]。需要說明的是,Impala并不是用來取代已有的MapReduce系統,而是作為MapReduce的一個強力補充,總的來說Impala适合用來處理輸出資料适中或比較小的查詢,而對于大資料量的批處理任務,MapReduce依然是更好的選擇。另外一個花邊消息是,Cloudera裡負責Impala的架構師Marcel Komacker就曾在Google負責過F1系統的查詢引擎開發,可見Google确實為大資料的流行出錢出力。

Impala與Shark,Drill等的比較

開源組織Apache也發起了名為Drill的項目來實作Hadoop上的Dremel,目前該項目正在開發當中,相關的文檔和代碼還不多,可以說暫時還未對Impala構成足夠的威脅[10]。從Quora上的問答來看,Cloudera有7-8名工程師全職在Impala項目上,而相比之下Drill目前的動作稍顯遲鈍。具體來說,截止到2012年10月底,Drill的代碼庫裡實作了query parser, plan parser,及能對JSON格式的資料進行掃描的plan evaluator;而Impala同期已經有了一個比較完畢的分布式query execution引擎,并對HDFS和HBase上的資料讀入,錯誤檢測,INSERT的資料修改,LLVM動态翻譯等都提供了支援。當然,Drill作為Apache的項目,從一開始就避免了某個vendor的一家獨大,而且對所有Hadoop流行的發行版都會做相應的支援,不像Impala隻支援Cloudera自己的發行版CDH。從長遠來看,誰會占據上風還真不一定[10]。

除此之外,加州伯克利大學AMPLab也開發了名為Shark的大資料分析系統。在今天6月份的《程式員》上有一篇專門分析與Shark相關的Spark系統的文章,感興趣的讀者朋友可以參考。從長遠目标來看,Shark想成為一個既支援大資料SQL查詢,又能支援進階資料分析任務的一體化資料處理系統。從技術實作的角度上來看,Shark基于Scala語言的算子推導實作了良好的容錯機制,是以對失敗了的長任務和短任務都能從上一個“快照點”進行快速恢複。相比之下,Impala由于缺失足夠強大的容錯機制,其上運作的任務一旦失敗就必須“從頭來過”,這樣的設計必然會在性能上有所缺失。而且Shark是把記憶體當作第一類的存儲媒體來做的系統設計,是以在處理速度上也會有一些優勢[11]。實際上,AMPLab最近對Hive,Impala,Shark及Amazon采用的商業MPP資料庫Redshift進行了一次對比試驗,在Scan Query,Aggregation Query和Join Query三種類型的任務中對它們進行了比較。圖2就是AMPLab報告中Aggregation Query的性能對比。在圖中我們可以看到,商業版本的Redshift的性能是最好的, Impala和Shark則各有勝負,且兩者都比Hive的性能高出了一大截。更多相關的實驗結果讀者朋友可以參考[12]。

圖2. Redshift,Impala,Shark與Hive的Aggregation Query性能對比 [12]

以筆者愚見,其實對大資料分析的項目來說,技術往往不是最關鍵的。例如Hadoop中的MapReduce和HDFS都是源于Google,原創性較少。事實上,開源項目的生态圈,社群,發展速度等,往往在很大程度上會影響Impala和Shark等開源大資料分析系統的發展。就像Cloudera一開始就決定會把Impala開源,以期望利用開源社群的力量來推廣這個産品;Shark也是一開始就開源了出來,更不用說Apache的Drill更是如此。說到底還是誰的生态系統更強的問題。技術上一時的領先并不足以保證項目的最終成功。雖然最後那一款産品會成為事實上的标準還很難說,但是,我們唯一可以确定并堅信的一點是,大資料分析将随着新技術的不斷推陳出新而不斷普及開來,這對使用者永遠都是一件幸事。舉個例子,如果讀者注意過下一代Hadoop(YARN)的發展的話就會發現,其實YARN已經支援MapReduce之外的計算範式(例如Shark,Impala等),是以将來Hadoop将可能作為一個相容并包的大平台存在,在其上提供各種各樣的資料處理技術,有應對秒量級查詢的,有應對大資料批處理的,各種功能應有盡有,滿足使用者各方面的需求。

未來展望

其實除了Impala,Shark,Drill這樣的開源方案外,像Oracle,EMC等傳統廠商也沒在坐以待斃等着自己的市場被開源軟體侵吞。像EMC就推出了HAWQ系統,并号稱其性能比之Impala快上十幾倍,而前面提到的Amazon的Redshift也提供了比Impala更好的性能。雖然說開源軟體因為其強大的成本優勢而擁有極其強大的力量,但是傳統資料庫廠商仍會嘗試推出性能、穩定性、維護服務等名額上更加強大的産品與之進行差異化競争,并同時參與開源社群、借力開源軟體來豐富自己的産品線、提升自己的競争力,并通過更多的高附加值服務來滿足某些消費者需求。畢竟,這些廠商往往已在并行資料庫等傳統領域積累了大量的技術和經驗,這些底蘊還是非常深厚的。甚至現在還有像NuoDB(一個創業公司)這樣号稱既支援ACID,又有Scalability的NewSQL系統出來。總的來看,未來的大資料分析技術将會變得越來越成熟、越來越便宜、越來越易用;相應的,使用者将會更容易更友善地從自己的大資料中挖掘出有價值的商業資訊。

參考資料

  1. http://research.google.com/pubs/pub36632.html http://research.google.com/pubs/pub36632.html
  2. http://blog.cloudera.com/blog/2012/10/cloudera-impala-real-time-queries-in-apache-hadoop-for-real/ http://blog.cloudera.com/blog/2012/10/cloudera-impala-real-time-queries-in-apache-hadoop-for-real/
  3. http://www.slideshare.net/cloudera/data-science-on-hadoop http://www.slideshare.net/cloudera/data-science-on-hadoop
  4. Impala重點問題清單: http://yuntai.1kapp.com/?p=1089 http://yuntai.1kapp.com/?p=1089
  5. Hive原理與不足: http://www.ccplat.com/?p=1035 http://www.ccplat.com/?p=1035
  6. Impala/Hive現狀分析與前景展望: http://yanbohappy.sinaapp.com/?p=220 http://yanbohappy.sinaapp.com/?p=220
  7. What’s next for Cloudera Impala: http://blog.cloudera.com/blog/2012/12/whats-next-for-cloudera-impala/ http://blog.cloudera.com/blog/2012/12/whats-next-for-cloudera-impala/
  8. MapReduce:一個巨大的倒退: http://t.cn/zQLFnWs http://t.cn/zQLFnWs
  9. Google Dremel 原理 — 如何能3秒分析1PB: http://www.yankay.com/google-dremel-rationale/ http://www.yankay.com/google-dremel-rationale/
  10. Isn’t Cloudera Impala doing the same job as Apache Drill incubator project? http://www.quora.com/Cloudera-Impala/Isnt-Cloudera-Impala-doing-the-same-job-as-Apache-Drill-incubator-project http://www.quora.com/Cloudera-Impala/Isnt-Cloudera-Impala-doing-the-same-job-as-Apache-Drill-incubator-project
  11. Shark: https://github.com/amplab/shark/wiki https://github.com/amplab/shark/wiki
  12. Big Data Benchmark: https://amplab.cs.berkeley.edu/benchmark/ https://amplab.cs.berkeley.edu/benchmark/
  13. Impala wiki: http://dirlt.com/impala.html http://dirlt.com/impala.html
  14. How does Impala compare to Shark: http://www.quora.com/Apache-Hadoop/How-does-Impala-compare-to-Shark http://www.quora.com/Apache-Hadoop/How-does-Impala-compare-to-Shark
  15. EMC講解Hawq SQL性能:左手Hive右手Impala: http://stor-age.zdnet.com.cn/stor-age/2013/0308/2147607.shtml http://stor-age.zdnet.com.cn/stor-age/2013/0308/2147607.shtml

作者簡介

耿益鋒,清華大學計算機系博士研究所學生,主要研究方向包括大資料處理和雲計算中新應用和新場景下分布式系統的設計和優化。

陳冠誠,IBM中國研究院研究員,主要技術方向為大規模分布式系統中的軟硬體協同設計。個人部落格為并行實驗室(www.parallellabs.com),新浪微網誌

@冠誠