Impala是Cloudera在受到Google的Dremel啟發下開發的實時交互SQL大數據查詢工具,Impala沒有再使用緩慢的Hive+MapReduce批處理,而是通過使用與商用並行關系數據庫中類似的分布式查詢引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分組成),可以直接從HDFS或HBase中用SELECT、JOIN和統計函數查詢數據,從而大大降低了延遲。

Impala由三個服務組成:impalad, statestored, catalogd。
Impalad: 與DataNode運行在同一節點上,由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,導致查詢失敗。
Catalogd作為metadata訪問網關,從Hive Metastore等外部catalog中獲取元數據信息,放到impala自己的catalog結構中。impalad執行ddl命令時通過catalogd由其代為執行,該更新則由statestored廣播。
CLI: 提供給用戶查詢使用的命令行工具(Impala Shell使用python實現),同時Impala還提供了Hue,JDBC, ODBC使用接口。
執行計划:
Impala: 通過詞法分析生成執行計划,執行計划表現為一棵完整的執行計划樹,可以更自然地分發執行計划到各個Impalad執行查詢,在分發執行計划后,Impala使用拉式獲取數據的方式獲取結果,把結果數據組成按執行樹流式傳遞匯集,減少的了把中間結果寫入磁盤的步驟,再從磁盤讀取數據的開銷。
impala的前端負責將sql轉化成執行計划(java),包含兩個階段:單節點計划生成、並行化和分段。第一階段對sql進行解析、分析、優化(RBO和CBO,統計信息目前只有表大小和列的NDV,無histogram),第二階段生成分布式的執行計划,確定是否要加exchange節點(是否存在partitioned join或hash aggregation),選擇join strategy(partitioned join or broadcast join)等,最后以exchange為邊界將計划分段(fragment),作為impala的基本運行單元。
優點:
- 支持SQL查詢,快速查詢大數據。
- 可以對已有數據進行查詢,減少數據的加載,轉換。
- 多種存儲格式可以選擇(Parquet, Text, Avro, RCFile, SequeenceFile)。
- 可以與Hive配合使用。
缺點:
- 不支持用戶定義函數UDF。
- 不支持text域的全文搜索。
- 不支持Transforms。
- 不支持查詢期的容錯。
- 對內存要求高。