Impala 介紹

1. Impala基本介紹

介紹 :
  impala是cloudera提供的一款高效率的sql查詢工具,提供實時的查詢效果,官方測試性能比hive快10到100倍,其sql查詢比sparkSQL還要更加快速,號稱是當前大數據領域最快的查詢sql工具,
  impala是參照谷歌的新三篇論文(Caffeine–網絡搜索引擎、Pregel–分佈式圖計算、Dremel–交互式分析工具)當中的Dremel實現而來,其中舊三篇論文分別是(BigTable,GFS,MapReduce)分別對應我們即將學的HBase和已經學過的HDFS以及MapReduce。
  impala是基於hive並使用內存進行計算,兼顧數據倉庫,具有實時,批處理,多併發等優點。

在這裏插入圖片描述

2. Impala與Hive關係

關係 :
  impala是基於hive的大數據分析查詢引擎,直接使用hive的元數據庫metadata,意味着impala元數據都存儲在hive的metastore當中,並且impala兼容hive的絕大多數sql語法。所以需要安裝impala的話,必須先安裝hive,保證hive安裝成功,並且還需要啓動hive的metastore服務
  Hive元數據包含用Hive創建的database、table等元信息。元數據存儲在關係型數據庫中,如Derby、MySQL等。
  客戶端連接metastore服務,metastore再去連接MySQL數據庫來存取元數據。有了metastore服務,就可以有多個客戶端同時連接,而且這些客戶端不需要知道MySQL數據庫的用戶名和密碼,只需要連接metastore 服務即可。
  nohup hive --service metastore >> ~/metastore.log 2>&1 &

在這裏插入圖片描述

Hive適合於長時間的批處理查詢分析,而Impala適合於實時交互式SQL查詢。可以先使用hive進行數據轉換處理,之後使用Impala在Hive處理後的結果數據集上進行快速的數據分析。

3. Impala與Hive異同

Impala
   Impala與Hive都是構建在Hadoop之上的數據查詢工具各有不同的側重適應面,但從客戶端使用來看Impala與Hive有很多的共同之處,如數據表元數據、ODBC/JDBC驅動、SQL語法、靈活的文件格式、存儲資源池等。
  但是Impala跟Hive最大的優化區別在於:沒有使用MapReduce進行並行計算,雖然MapReduce是非常好的並行計算框架,但它更多的面向批處理模式,而不是面向交互式的SQL執行。與 MapReduce相比,Impala把整個查詢分成一執行計劃樹,而不是一連串的MapReduce任務,在分發執行計劃後,Impala使用拉式獲取數據的方式獲取結果,把結果數據組成按執行樹流式傳遞彙集,減少的了把中間結果寫入磁盤的步驟,再從磁盤讀取數據的開銷。Impala使用服務的方式避免每次執行查詢都需要啓動的開銷,即相比Hive沒了MapReduce啓動時間。

在這裏插入圖片描述

3.1 Impala使用的優化技術

簡介:
  使用LLVM產生運行代碼,針對特定查詢生成特定代碼,同時使用Inline的方式減少函數調用的開銷,加快執行效率。(C++特性)
  充分利用可用的硬件指令(SSE4.2)。
  更好的IO調度,Impala知道數據塊所在的磁盤位置能夠更好的利用多磁盤的優勢,同時Impala支持直接數據塊讀取和本地代碼計算checksum。
  通過選擇合適數據存儲格式可以得到最好性能(Impala支持多種存儲格式)。
  最大使用內存,中間結果不寫磁盤,及時通過網絡以stream的方式傳遞。

3.2 執行計劃

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

3.3 數據流

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

3.4 內存使用

內存使用 :
   Hive: 在執行過程中如果內存放不下所有數據,則會使用外存,以保證Query能順序執行完。每一輪MapReduce結束,中間結果也會寫入HDFS中,同樣由於MapReduce執行架構的特性,shuffle過程也會有寫本地磁盤的操作。
   Impala:在遇到內存放不下數據時,版本1.0.1是直接返回錯誤,而不會利用外存,以後版本應該會進行改進。這使用得Impala目前處理Query會受到一定的限制,最好還是與Hive配合使用。

3.5 調度

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

3.6 容錯

容錯 :
   Hive: 依賴於Hadoop的容錯能力。
  Impala:在查詢過程中,沒有容錯邏輯,如果在執行過程中發生故障,則直接返回錯誤(這與Impala的設計有關,因爲Impala定位於實時查詢,一次查詢失敗,再查一次就好了,再查一次的成本很低)。

3.7 適用面

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

4. Impala架構

Impala主要由ImpaladState StoreCatalogdCLI組成。
在這裏插入圖片描述

4.1 Impalad

Impalad :
   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服務。

4.2 Impala State Store

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

4.3 CLI

CLI: 提供給用戶查詢使用的命令行工具(Impala Shell使用python實現),同時Impala還提供了Hue,JDBC,ODBC使用接口。

4.4 Catalogd(目錄)

Catalogd:作爲metadata訪問網關,從Hive Metastore等外部catalog中獲取元數據信息,放到impala自己的catalog結構中。impalad執行ddl命令時通過catalogd由其代爲執行,該更新則由statestored廣播。

5. Impala查詢處理過程

Impalad分爲Java前端C++處理後端,接受客戶端連接的Impalad即作爲這次查詢的Coordinator,Coordinator通過JNI調用Java前端對用戶的查詢SQL進行分析生成執行計劃樹。

在這裏插入圖片描述


  Java前端產生的執行計劃樹以Thrift數據格式返回給C++後端(Coordinator)(執行計劃分爲多個階段,每一個階段叫做一個PlanFragment,每一個PlanFragment在執行時可以由多個Impalad實例並行執行(有些PlanFragment只能由一個Impalad實例執行,如聚合操作),整個執行計劃爲一執行計劃樹)。
  Coordinator根據執行計劃,數據存儲信息(Impala通過libhdfs與HDFS進行交互。通過hdfsGetHosts方法獲得文件數據塊所在節點的位置信息),通過調度器(現在只有simple-scheduler,使用round-robin算法)Coordinator::Exec對生成的執行計劃樹分配給相應的後端執行器Impalad執行(查詢會使用LLVM進行代碼生成,編譯,執行),通過調用GetNext()方法獲取計算結果。
  如果是insert語句,則將計算結果通過libhdfs寫回HDFS當所有輸入數據被消耗光,執行結束,之後註銷此次查詢服務。

發佈了35 篇原創文章 · 獲贊 244 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章