1. 程式人生 > >Impala與Hive的比較

Impala與Hive的比較

http://blog.jobbole.com/43233/

1. Impala架構

Impala是Cloudera在受到Google的Dremel啟發下開發的實時互動SQL大資料查詢工具,Impala沒有再使用緩慢的 Hive+MapReduce批處理,而是通過使用與商用並行關係資料庫中類似的分散式查詢引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分組成),可以直接從HDFS或HBase中用SELECT、JOIN和統計函式查詢資料,從而大大降低了延遲。其架構如圖 1所示,Impala主要由Impalad, State Store和CLI組成。

圖 1

Impalad: 與DataNode執行在同一節點上,由Impalad程序表示,它接收客戶端的查詢請求(接收查詢請求的Impalad為 Coordinator,Coordinator通過JNI呼叫java前端解釋SQL查詢語句,生成查詢計劃樹,再通過排程器把執行計劃分發給具有相應 資料的其它Impalad進行執行),讀寫資料,並行執行查詢,並把結果通過網路流式的傳送回給Coordinator,由Coordinator返回給 客戶端。同時Impalad也與State Store保持連線,用於確定哪個Impalad是健康和可以接受新的工作。在Impalad中啟動三個ThriftServer: beeswax_server(連線客戶端),hs2_server(借用Hive元資料), be_server(Impalad內部使用)和一個ImpalaServer服務。

Impala State Store: 跟蹤叢集中的Impalad的健康狀態及位置資訊,由statestored程序表示,它通過建立多個執行緒來處理Impalad的註冊訂閱和與各 Impalad保持心跳連線,各Impalad都會快取一份State Store中的資訊,當State Store離線後(Impalad發現State Store處於離線時,會進入recovery模式,反覆註冊,當State Store重新加入集群后,自動恢復正常,更新快取資料)因為Impalad有State Store的快取仍然可以工作,但會因為有些Impalad失效了,而已快取資料無法更新,導致把執行計劃分配給了失效的Impalad,導致查詢失敗。

CLI: 提供給使用者查詢使用的命令列工具(Impala Shell使用python實現),同時Impala還提供了Hue,JDBC, ODBC使用介面。

2. 與Hive的關係

Impala 與Hive都是構建在Hadoop之上的資料查詢工具各有不同的側重適應面,但從客戶端使用來看Impala與Hive有很多的共同之處,如資料表元數 據、ODBC/JDBC驅動、SQL語法、靈活的檔案格式、儲存資源池等。Impala與Hive在Hadoop中的關係如圖 2所示。Hive適合於長時間的批處理查詢分析,而Impala適合於實時互動式SQL查詢,Impala給資料分析人員提供了快速實驗、驗證想法的大數 據分析工具。可以先使用hive進行資料轉換處理,之後使用Impala在Hive處理後的結果資料集上進行快速的資料分析。

圖 2

3. Impala的查詢處理過程

Impalad分為Java前端與C++處理後端,接受客戶端連線的Impalad即作為這次查詢的Coordinator,Coordinator通過 JNI呼叫Java前端對使用者的查詢SQL進行分析生成執行計劃樹,不同的操作對應不用的PlanNode, 如:SelectNode, ScanNode, SortNode, AggregationNode, HashJoinNode等等。

執行計劃樹的每個原子操作由一個PlanFragment表示,通常一條查詢語句由多個Plan Fragment組成, Plan Fragment 0表示執行樹的根,匯聚結果返回給使用者,執行樹的葉子結點一般是Scan操作,分散式並行執行。

Java前端產生的執行計劃樹以Thrift資料格式返回給Impala C++後端(Coordinator)(執行計劃分為多個階段,每一個階段叫做一個PlanFragment,每一個PlanFragment在執行時可 以由多個Impalad例項並行執行(有些PlanFragment只能由一個Impalad例項執行,如聚合操作),整個執行計劃為一執行計劃樹),由 Coordinator根據執行計劃,資料儲存資訊(Impala通過libhdfs與HDFS進行互動。通過hdfsGetHosts方法獲得檔案資料 塊所在節點的位置資訊),通過排程器(現在只有simple-scheduler, 使用round-robin演算法)Coordinator::Exec對生成的執行計劃樹分配給相應的後端執行器Impalad執行(查詢會使用LLVM 進行程式碼生成,編譯,執行。

對於使用LLVM如何提高效能這裡有說明),通過呼叫GetNext()方法獲取計算結果,如果是insert語句,則將計算結果通過libhdfs寫回HDFS當所有輸入資料被消耗光,執行結束,之後登出此次查詢服務。

Impala的查詢處理流程大概如圖3所示:

圖 3

下面以一個SQL查詢語句為例分析Impala的查詢處理流程。如select sum(id), count(id), avg(id) from customer_small group by id; 以此語句生成的計劃為:

1234567891011121314151617181920212223242526272829PLAN FRAGMENT0PARTITION:UNPARTITIONED4:EXCHANGEtuple ids:1PLAN FRAGMENT1PARTITION:HASH_PARTITIONED:<slot1>STREAM DATA SINKEXCHANGE ID:4UNPARTITIONED3:AGGREGATE|output:SUM(<slot2>),SUM(<slot3>)|group by:<slot1>|tuple ids:1|2:EXCHANGEtuple ids:1PLAN FRAGMENT2PARTITION:RANDOMSTREAM DATA SINKEXCHANGE ID:2HASH_PARTITIONED:<slot1>1:AGGREGATE|output:SUM(id),COUNT(id)|group by:id|tuple ids:1|0:SCAN HDFStable=default.customer_small#partitions=1 size=193Btuple ids:0

執行行計劃樹如圖 4所示, 綠色的部分為可以分散式並行執行:


圖 4

4. Impala相對於Hive所使用的優化技術

  • 1、沒有使用 MapReduce進行平行計算,雖然MapReduce是非常好的平行計算框架,但它更多的面向批處理模式,而不是面向互動式的SQL執行。與 MapReduce相比:Impala把整個查詢分成一執行計劃樹,而不是一連串的MapReduce任務,在分發執行計劃後,Impala使用拉式獲取 資料的方式獲取結果,把結果資料組成按執行樹流式傳遞彙集,減少的了把中間結果寫入磁碟的步驟,再從磁碟讀取資料的開銷。Impala使用服務的方式避免 每次執行查詢都需要啟動的開銷,即相比Hive沒了MapReduce啟動時間。
  • 2、使用LLVM產生執行程式碼,針對特定查詢生成特定程式碼,同時使用Inline的方式減少函式呼叫的開銷,加快執行效率。
  • 3、充分利用可用的硬體指令(SSE4.2)。
  • 4、更好的IO排程,Impala知道資料塊所在的磁碟位置能夠更好的利用多磁碟的優勢,同時Impala支援直接資料塊讀取和原生代碼計算checksum。
  • 5、通過選擇合適的資料儲存格式可以得到最好的效能(Impala支援多種儲存格式)。
  • 6、最大使用記憶體,中間結果不寫磁碟,及時通過網路以stream的方式傳遞。

5. Impala與Hive的異同

  • 資料儲存:使用相同的儲存資料池都支援把資料儲存於HDFS, HBase。
  • 元資料:兩者使用相同的元資料。
  • SQL解釋處理:比較相似都是通過詞法分析生成執行計劃。

執行計劃

  • Hive: 依賴於MapReduce執行框架,執行計劃分成 map->shuffle->reduce->map->shuffle->reduce…的模型。如果一個Query會 被編譯成多輪MapReduce,則會有更多的寫中間結果。由於MapReduce執行框架本身的特點,過多的中間過程會增加整個Query的執行時間。
  • Impala: 把執行計劃表現為一棵完整的執行計劃樹,可以更自然地分發執行計劃到各個Impalad執行查詢,而不用像Hive那樣把它組合成管道型的 map->reduce模式,以此保證Impala有更好的併發性和避免不必要的中間sort與shuffle。

資料流

  • Hive: 採用推的方式,每一個計算節點計算完成後將資料主動推給後續節點。
  • Impala: 採用拉的方式,後續節點通過getNext主動向前面節點要資料,以此方式資料可以流式的返回給客戶端,且只要有1條資料被處理完,就可以立即展現出來,而不用等到全部處理完成,更符合SQL互動式查詢使用。

記憶體使用

  • Hive: 在執行過程中如果記憶體放不下所有資料,則會使用外存,以保證Query能順序執行完。每一輪MapReduce結束,中間結果也會寫入HDFS中,同樣由於MapReduce執行架構的特性,shuffle過程也會有寫本地磁碟的操作。
  • Impala: 在遇到記憶體放不下資料時,當前版本1.0.1是直接返回錯誤,而不會利用外存,以後版本應該會進行改進。這使用得Impala目前處理Query會受到一 定的限制,最好還是與Hive配合使用。Impala在多個階段之間利用網路傳輸資料,在執行過程不會有寫磁碟的操作(insert除外)。

排程

  • Hive: 任務排程依賴於Hadoop的排程策略。
  • Impala: 排程由自己完成,目前只有一種排程器simple-schedule,它會盡量滿足資料的區域性性,掃描資料的程序儘量靠近資料本身所在的物理機器。排程器 目前還比較簡單,在SimpleScheduler::GetBackend中可以看到,現在還沒有考慮負載,網路IO狀況等因素進行排程。但目前 Impala已經有對執行過程的效能統計分析,應該以後版本會利用這些統計資訊進行排程吧。

容錯

  • Hive: 依賴於Hadoop的容錯能力。
  • Impala: 在查詢過程中,沒有容錯邏輯,如果在執行過程中發生故障,則直接返回錯誤(這與Impala的設計有關,因為Impala定位於實時查詢,一次查詢失敗, 再查一次就好了,再查一次的成本很低)。但從整體來看,Impala是能很好的容錯,所有的Impalad是對等的結構,使用者可以向任何一個 Impalad提交查詢,如果一個Impalad失效,其上正在執行的所有Query都將失敗,但使用者可以重新提交查詢由其它Impalad代替執行,不 會影響服務。對於State Store目前只有一個,但當State Store失效,也不會影響服務,每個Impalad都快取了State Store的資訊,只是不能再更新叢集狀態,有可能會把執行任務分配給已經失效的Impalad執行,導致本次Query失敗。

適用面

  • Hive: 複雜的批處理查詢任務,資料轉換任務。
  • Impala:實時資料分析,因為不支援UDF,能處理的問題域有一定的限制,與Hive配合使用,對Hive的結果資料集進行實時分析。

6. Impala的優缺點

優點

  1. 支援SQL查詢,快速查詢大資料。
  2. 可以對已有資料進行查詢,減少資料的載入,轉換。
  3. 多種儲存格式可以選擇(Parquet, Text, Avro, RCFile, SequeenceFile)。
  4. 可以與Hive配合使用。

缺點

  1. 不支援使用者定義函式UDF。
  2. 不支援text域的全文搜尋。
  3. 不支援Transforms。
  4. 不支援查詢期的容錯。
  5. 對記憶體要求高。