高并发MPP查询引擎Impala初识
官網:http://impala.apache.org/
?
Apache Impala是高性能的專用SQL引擎,使用Impala SQL,因為Impala無需借助任何的框架,直接實現對數據塊的查詢,所以查詢延遲毫秒級。還是得放到和Hive一起說說,Impala適用實時查詢,因為比Hive查詢快多了。Impala是Cloudera公司主導開發的新型查詢系統,它提供SQL語義,能查詢存儲在Hadoop的HDFS和HBase中的PB級大數據。已有的Hive系統雖然也提供了SQL語義,但由于Hive底層執行使用的是MapReduce引擎,仍然是一個批處理過程,難以滿足查詢的交互性。
1、Impala即時查詢原理
Impala是架構于Hadoop之上的開源、高并發的MPP查詢引擎,被廣泛應用于各種行業。Impala是完全集成的,用以平衡Hadoop的靈活性和可擴展性,為BI/數據分析師提供低延遲、高并發的以讀為主的查詢。
Impala將傳統分析數據庫的SQL支持和多用戶性能與Hadoop的靈活性和可擴展性結合起來,它通過利用HDFS、HBase、Metastore、YARN、Sentry等標準組件能夠讀取大多數廣泛使用的文件格式比如Parquet、Avro、RCFile來維護Hadoop的靈活性;為了降低延遲,避免利用MR或者讀遠程數據,基于負責查詢執行所有方面、作為Hadoop基礎設施一部分運行于各臺服務器上的Deamon進程實現了一個分布式架構,在相同負載的情形下其性能相當或超過了商用MPP分析數據庫。
在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調度機制,盡可能地將數據和計算分配在同一臺機器上進行,減少了網絡開銷。
2、Impala架構
Impala是Cloudera在受到Google的Dremel啟發下開發的實時交互SQL大數據查詢工具(實時SQL查詢引擎Impala),Impala沒有再使用緩慢的Hive+MapReduce批處理,而是通過使用與商用并行關系數據庫中類似的分布式查詢引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分組成),可以直接從HDFS或HBase中用SELECT、JOIN和統計函數查詢數據,從而大大降低了延遲。
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服務。
2)Impala State Store: 跟蹤集群中的Impalad的健康狀態及位置信息,由statestored進程表示,它通過創建多個線程來處理Impalad的注冊訂閱和與各Impalad保持心跳連接,各Impalad都會緩存一份State Store中的信息,當State Store離線后(Impalad發現State Store處于離線時,會進入recovery模式,反復注冊,當State Store重新加入集群后,自動恢復正常,更新緩存數據)因為Impalad有State Store的緩存仍然可以工作,但會因為有些Impalad失效了,而已緩存數據無法更新,導致把執行計劃分配給了失效的Impalad,導致查詢失敗。
3)CLI: 提供給用戶查詢使用的命令行工具(Impala Shell使用python實現),同時Impala還提供了Hue,JDBC,ODBC使用接口。
?
3、與Hive關系
Impala與Hive都是構建在Hadoop之上的數據查詢工具各有不同的側重適應面,但從客戶端使用來看Impala與Hive有很多的共同之處,如數據表元數據、ODBC/JDBC驅動、SQL語法、靈活的文件格式、存儲資源池等。Hive適合于長時間的批處理查詢分析,而Impala適合于實時交互式SQL查詢,Impala給數據分析人員提供了快速實驗、驗證想法的大數據分析工具??梢韵仁褂胔ive進行數據轉換處理,之后使用Impala在Hive處理后的結果數據集上進行快速的數據分析。Impala與Hive在Hadoop中的關系如下圖。
4、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當所有輸入數據被消耗光,執行結束,之后注銷此次查詢服務?! ?/p>
?
Impala與標準的BI環境集成,客戶端通過ODBC或JDBC連接服務器、通過Kerberos或LDAP實現認證、遵循標準的SQL角色和權限實現權限管理。Impala的查詢處理流程大概如圖所示:
總結
以上是生活随笔為你收集整理的高并发MPP查询引擎Impala初识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式大数据sql查询引擎Presto初
- 下一篇: linux内存释放和使用限制