1. 程式人生 > 其它 >Apache Impala架構解析及與Hive、SparkSQL的效能比較

Apache Impala架構解析及與Hive、SparkSQL的效能比較

一、Impala介紹

Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢儲存在Hadoop的HDFS和HBase中的PB級大資料。已有的Hive系統雖然也提供了SQL語義,但由於Hive底層執行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的互動性。相比之下,Impala的最大特點也是最大特點就是它的快速。

Impala是用於處理儲存在Hadoop叢集中的大量資料的MPP(大規模並行處理)SQL查詢引擎。 它是一個用C ++和Java編寫的開源軟體。 與其他Hadoop的SQL引擎相比,它提供了高效能和低延遲。換句話說,Impala是效能最高的SQL引擎(提供類似RDBMS的體驗),它提供了訪問儲存在Hadoop分散式檔案系統中的資料的最快方法。

二、Impala架構解析

從上圖(引用自Apache Impala官網)中看出,可以首先大體上描述下一個SQL從提交到獲取查詢結果是經歷了哪些步驟(下面的步驟和上圖中步驟不一一對應):

1、客戶端提交任務:客戶端通過beeswax或者HiveServer2介面傳送一個SQL查詢請求到Impalad節點,查詢包括一條SQL和相關的configuration資訊(只對本次查詢生效),查詢介面提供同步和非同步的方式執行,兩種介面都會返回一個queryId用於之後的客戶端操作。

2、查詢解析和分析: SQL提交到Impalad節點之後交由FE模組處理,由Analyser依次執行SQL的詞法分析、語法分析、語義分析、查詢重寫等操作,生成該SQL的Statement資訊。

3、單機執行計劃生成:根據上一步生成的Statement資訊,由Planner生成單機的執行計劃,該執行計劃是有PlanNode組成的一棵樹,這個過程中也會執行一些SQL優化,例如Join順序改變、謂詞下推等。

4、分散式執行計劃生成:由Planner將單機執行計劃轉換成分散式並行物理執行計劃,物理執行計劃由一個個的Fragment組成,Fragment之間有資料依賴關係,處理過程中需要在原有的執行計劃之上加入一些ExchangeNode和DataStreamSink資訊等。

5、任務排程和分發:由BE處理生成的分散式物理執行計劃,將Fragment根據資料分割槽資訊發配到不同的Impalad節點上執行。Impalad節點接收到執行Fragment請求交由Backend模組處理Fragment的執行。

6、子任務執行:每一個Fragment的執行輸出通過DataStreamSink傳送到下一個Fragment,由下一個Fragment的ExchangeNode接收,Fragment執行過程中不斷向coordinator節點彙報當前執行狀態。

7、結果彙總:查詢的SQL通常情況下需要有一個單獨的Fragment用於結果的彙總,它只在coordinator節點執行,將多個backend的最終執行結果彙總,轉換成ResultSet資訊。

8、客戶端查詢結果:客戶端呼叫獲取ResultSet的介面,讀取查詢結果。

9、關閉查詢:客戶端呼叫CloseOperation關閉本次查詢,標誌著本次查詢的結束。

三、Impala元件

1. Impala Daemon元件

  Impalad是Impala的核心程序,執行在所有的資料節點上,可以讀寫資料,並接收客戶端的查詢請求,並行執行來自叢集中其他節點的查詢請求,將中間結果返回給排程節點。呼叫節點將結果返回給客戶端。使用者在Impala叢集上的某個節點提交資料處理請求 則該節點稱為coordinator node(協調器節點),其他的叢集節點傳輸其中的處理的部分資料到該coordinator node,coordinator node負責構建最終的結果資料返回給使用者。
Impala 支援在提交任務的時候(採用JDBC ,ODBC 方式) 採用round-robin演算法來實現負載均衡,將任務提交到不同的節點上
Impalad 程序通過持續的和statestore 通訊來確認自己所在的節點是否健康 和是否可以接受新的任務請求

2. Impala Statestore(主要優化點,執行緒數)

  狀態管理程序,定時檢查The Impala Daemon的健康狀況,協調各個執行Impalad的例項之間的資訊關係,Impala正是通過這些資訊去定位查詢請求所要的資料,程序名叫作 statestored,在叢集中只需要啟動一個這樣的程序,如果Impala節點由於物理原因、網路原因、軟體原因或者其他原因而下線,Statestore會通知其他節點,避免查詢任務分發到不可用的節點上。

3. Impala Catalog Service(元資料管理和元儲存)

  元資料管理服務,程序名叫做catalogd,將資料表變化的資訊分發給各個程序。接收來自statestore的所有請求 ,每個Impala節點在本地快取所有元資料。 當處理極大量的資料和/或許多分割槽時,獲得表特定的元資料可能需要大量的時間。 因此,本地儲存的元資料快取有助於立即提供這樣的資訊。當表定義或表資料更新時,其他Impala後臺程序必須通過檢索最新元資料來更新其元資料快取,然後對相關表發出新查詢。

4. 其他元件列表

Impala client:將HiveQL請求送給Impalad,並等待結果返回給使用者
Impalad:

Planner > FE(JAVA):負責解析查詢請求,並生成執行計劃樹(Query Plan Tree)。

Coordinator > BE(C++):拆解請求(Fragment),負責定位資料位置,併發送請求到Exec Engine,匯聚請求結果上報。

Exec Engine > BE(C++):執行Fragment子查詢,比如scan,Aggregation,Merge etc。
statestore server:維護Impalad的夥伴關係,負責通知夥伴關係變化,類似於儀表盤的zk的故障監控功能。

meta server:

Hive Meta Storage:使用者維護表的schema資訊等元資料(存在於一個關係型資料庫)。

NameNode of HDFS:用於定位hdfs的資料位置。

HMaster of HBase:用於定位HBase的資料的位置。

storage server:

HDFS:HDFS的DataNode服務。

HBASE:HBase的RegionServer服務。

四、Impala的優缺點

1. 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排程機制,儘可能地將資料和計算分配在同一臺機器上進行,減少了網路開銷

2. Impala的缺點

1) Impala不提供任何對序列化和反序列化的支援。

2) Impala只能讀取文字檔案,而不能讀取自定義二進位制檔案。

3) 每當新的記錄/檔案被新增到HDFS中的資料目錄時,該表需要被重新整理

五、Impala的功能

1.Impala可以根據Apache許可證作為開源免費提供。

2.Impala支援記憶體中資料處理,它訪問/分析儲存在Hadoop資料節點上的資料,而無需資料移動。

3.Impala為HDFS中的資料提供了更快的訪問。

4.可以將資料儲存在Impala儲存系統中,如Apache HBase和Amazon s3。

5.Impala支援各種檔案格式,如LZO,序列檔案,Avro,RCFile和Parquet。

6.使用Impala,您可以使用傳統的SQL知識以極快的速度處理儲存在HDFS中的資料。

7.由於在資料駐留(在Hadoop叢集上)時執行資料處理,因此在使用Impala時,不需要對儲存在Hadoop上的資料進行資料轉換和資料移動。

8.使用Impala,您可以訪問儲存在HDFS,HBase和Amazon s3中的資料,而無需瞭解Java(MapReduce作業)。您可以使用SQL查詢的基本概念訪問它們。

9.為了在業務工具中寫入查詢,資料必須經歷複雜的提取 - 變換負載(ETL)週期。但是,使用Impala,此過程縮短了。載入和重組的耗時階段通過新技術克服,如探索性資料分析和資料發現,使過程更快。

六、Hive、SparkSQL、Impala效能對比

參照cloudera公司做的效能基準對比測試,大資料培訓所有測試都執行在一個完全相同的21節點叢集上,每個節點只配有64G記憶體。之所以記憶體不配大,就是為了消除人們對於Impala只有在非常大的記憶體上才有好效能的錯誤認識。

配置:

  • 雙物理CPU,每個12核,Intel Xeon CPU E5-2630L 0 at 2.00GHz

  • 12個磁碟驅動器,每個磁碟932G,1個用作OS,其它用作HDFS

  • 每節點64G記憶體

對比產品:

  • Impala

  • Hive-on-Tez

  • Spark SQL

  • Presto

查詢:

  1. 21個節點上的資料量為15T

  2. 測試場景取自TPC-DS,一個開放的決策支援基準(包括互動式、報表、分析式查詢)

  3. 由於除Impala外,其它引擎都沒有基於成本的優化器,本測試使用的查詢都使用SQL-92標準的連線

  4. 採用統一的Snappy壓縮編碼方式,各個引擎使用各自最優的檔案格式,Impala和Spark SQL使用Parquet,Hive-on-Tez使用ORC,Presto使用RCFile。

  5. 對每種引擎多次執行和調優

結果:
單使用者如下圖所示:

多使用者如下圖所示(引用自Apache Impala官網):

查詢吞吐率如下圖所示(引用自Apache Impala官網):

Imapal底層採用MPP技術,支援快速互動式SQL查詢。與Hive共享元資料儲存。Impalad是核心程序,負責接收查詢請求並向多個數據節點分發任務。statestored程序負責監控所有Impalad程序,並向叢集中的節點報告各個Impalad程序的狀態。catalogd程序負責廣播通知元資料的最新資訊。由測試結果可知,對於單使用者查詢,Impala比其它方案最多快13倍,平均快6.7倍。對於多使用者查詢,差距進一步拉大:Impala比其它方案最多快27.4倍,平均快18倍。