從不同的角度來認(rèn)識(shí)和理解Impala的架構(gòu)設(shè)計(jì)
我們知道,在實(shí)時(shí)性要求不是很高的應(yīng)用場(chǎng)景中,比如,月度統(tǒng)計(jì)報(bào)表生成等,我們基于傳統(tǒng)的Hadoop MapReduce來處理海量大數(shù)據(jù)(包括使用Hive),在各方面表現(xiàn)都還不錯(cuò),只需要離線處理數(shù)據(jù),然后存儲(chǔ)結(jié)果即可。但是如果在一些實(shí)時(shí)性要求相對(duì)較高的應(yīng)用場(chǎng)景中,哪怕處理時(shí)間能夠在原有的基礎(chǔ)有大幅度地減少,也能很好地提升用戶體驗(yàn)。對(duì)于大數(shù)據(jù)的實(shí)時(shí)性要求,其實(shí)是相對(duì)的,比如,傳統(tǒng)使用MapReduce計(jì)算框架處理PB級(jí)別的查詢分析請(qǐng)求,可能耗時(shí)30分鐘甚至更多,但是如果能夠使這個(gè)延遲大大降低,如3分鐘計(jì)算出結(jié)果,這是很令人震撼的。Impala就是基于這樣的需求驅(qū)動(dòng)而出現(xiàn)的。
Impala是Cloudera開發(fā)的一款用來進(jìn)行大數(shù)據(jù)實(shí)時(shí)查詢分析的開源工具,它能夠?qū)崿F(xiàn)通過我們熟悉的傳統(tǒng)關(guān)系數(shù)據(jù)庫的SQL風(fēng)格來操作大數(shù)據(jù),數(shù)據(jù)可以是存儲(chǔ)到HDFS或HBase中的。
下面,我們從不同的角度來認(rèn)識(shí)和理解Cloudera Impala:
設(shè)計(jì)目標(biāo)
官網(wǎng)給出的介紹是,使用Impala來實(shí)現(xiàn)SQL on Hadoop,實(shí)現(xiàn)對(duì)海量數(shù)據(jù)的實(shí)時(shí)查詢分析,它的優(yōu)勢(shì)有如下幾點(diǎn):
- 快速
可以方便地執(zhí)行SQL語句,在數(shù)秒內(nèi)返回查詢分析結(jié)果。
這一點(diǎn),其實(shí)還要依賴于你在HDFS或HBase上存儲(chǔ)的數(shù)據(jù)的規(guī)模,依賴于你對(duì)Impala系統(tǒng)的配置調(diào)優(yōu)情況,可能還依賴于你寫的SQL語句的執(zhí)行效率。
- 靈活
可以直接查詢存儲(chǔ)在HDFS上的原生數(shù)據(jù),也可以查詢經(jīng)過優(yōu)化設(shè)計(jì)而存儲(chǔ)的數(shù)據(jù),只要數(shù)據(jù)的格式它們能夠兼容MapReduce、Hive、Pig等等。
- 整合&開放
可以非常容易地與Hadoop系統(tǒng)整合,并使用Hadoop生態(tài)系統(tǒng)的資源和優(yōu)勢(shì),也不需要將數(shù)據(jù)遷移到特定的存儲(chǔ)系統(tǒng)就能滿足查詢分析的要求。
- 可伸縮性
可以很好地與一些BI應(yīng)用系統(tǒng)協(xié)同工作,如Microstrategy、Tableau、Qlikview,等等。
支持特性
Impala支持的特性,主要包括如下幾點(diǎn):
- 對(duì) ANSI-92 SQL標(biāo)準(zhǔn)的支持
Impala支持ANSI-92 SQL所有子集,包括CREATE、ALTER、SELECT、INSERT、JOIN、GROUP BY以及子查詢。它還支持分區(qū)JOIN、常用的聚合函數(shù)(SUM、COUNT、MAX、MIN、AVG等等)、topN查詢。你使用這些語句時(shí),可以像使用關(guān)系數(shù)據(jù)庫中使用的SQL語句一樣去設(shè)計(jì),很容易上手。
- 數(shù)據(jù)來源與數(shù)據(jù)格式
Impala可以操作HDFS、HBase中存儲(chǔ)的數(shù)據(jù),支持如下HDFS的支持文件格式:Text file、SequenceFile、RCFile、Avro file、Parquet,支持的壓縮格式有:Snappy、GZIP、Deflate、BZIP,其中Snappy壓縮格式的性能更好一些。
- 支持的數(shù)據(jù)訪問接口
主要包括Hive所支持的如下接口:JDBC Driver、ODBC Driver、Hue Beeswax、Cloudera Impala Query UI.,另外,還可以通過CLI接口(也就是Impala Shell)訪問。
架構(gòu)設(shè)計(jì)要點(diǎn)
Impala的架構(gòu)設(shè)計(jì)視圖,如圖所示:
上面可以看出,位于Datanode上的每個(gè)impalad進(jìn)程,都具有Query Planner、Query Coordinator、Query Exec Engine這幾個(gè)組件,每個(gè)Impala節(jié)點(diǎn)在功能集合上是對(duì)等的,也就是說,任何一個(gè)節(jié)點(diǎn)都能接收外部查詢請(qǐng)求。當(dāng)有一個(gè)節(jié)點(diǎn)發(fā)生故障后,其他節(jié)點(diǎn)仍然能夠接管,這還要得益于,在HDFS上,數(shù)據(jù)的副本是冗余的,只要數(shù)據(jù)能夠取到,某些掛掉的impalad進(jìn)程所在節(jié)點(diǎn)的數(shù)據(jù),在整個(gè)HDFS中只要還存在副本(impalad進(jìn)程正常的節(jié)點(diǎn)),還是可以提供計(jì)算的。除非,當(dāng)多個(gè)impalad進(jìn)程掛掉了,恰好此時(shí)的查詢請(qǐng)求要操作的數(shù)據(jù)所在的節(jié)點(diǎn),都沒有存在impalad進(jìn)程,這是肯定是無法計(jì)算了。
Cloudera Impala在實(shí)際應(yīng)用場(chǎng)景中所處的位置,如圖所示:
上圖展示了Impala方案的相關(guān)的各種組件,簡(jiǎn)單說明如下:
- 客戶端
有三類客戶端可以與Impala進(jìn)行交互:基于驅(qū)動(dòng)程序的客戶端(ODBC Driver和JDBC Driver,其中JDBC Driver支持Hive1與Hive2風(fēng)格的驅(qū)動(dòng)形式);Hue接口,可以通過Hue Beeswax接口來與Impala進(jìn)行交互;Impala Shell命令行接口,類似關(guān)系數(shù)據(jù)庫提供一些命令行即可,可以直接使用SQL語句與Impala交互。
- Hive Metastore
Impala使用Hive Metastore來存儲(chǔ)一些元數(shù)據(jù),為Impala所使用,通過存儲(chǔ)的元數(shù)據(jù),Impala可以更好地知道整個(gè)集群中數(shù)據(jù)以及節(jié)點(diǎn)的狀態(tài),從而實(shí)現(xiàn)集群并行計(jì)算,對(duì)外部提供查詢分析服務(wù)。
- Cloudera Impala
Impala會(huì)在HDFS集群的Datanode上啟動(dòng)進(jìn)程,協(xié)調(diào)位于集群上的多個(gè)Impala進(jìn)程(impalad),以及執(zhí)行查詢。在Impala架構(gòu)中,每個(gè)Impala節(jié)點(diǎn)都可以接收來自客戶端的查詢請(qǐng)求,然后負(fù)責(zé)解析查詢,生成查詢計(jì)劃,并進(jìn)行優(yōu)化,協(xié)調(diào)查詢請(qǐng)求在其他的多個(gè)Impala節(jié)點(diǎn)上并行執(zhí)行,最后有負(fù)責(zé)接收查詢請(qǐng)求的Impala節(jié)點(diǎn)來匯總結(jié)果,響應(yīng)客戶端。
- HBase和HDFS
HBase和HDFS存儲(chǔ)著實(shí)際需要查詢的大數(shù)據(jù)。
總結(jié)
Cloudera官網(wǎng)所言,使用Impala比使用Hive能提高3~90的效率,我們可以參考Cloudera的官網(wǎng)博客。我相信,使用Impala比使用Hive能大大提升計(jì)算性能,這是真實(shí)的。Impala從發(fā)布到現(xiàn)在也不過一年左右時(shí)間,它還在發(fā)展之中,能有這樣的表現(xiàn)我還是感覺很欣慰,至少讓我們看到了一些商業(yè)系統(tǒng)能夠?qū)崿F(xiàn)的功能已經(jīng)在開源項(xiàng)目中落地。
在我們使用Impala的過程中,我總結(jié)一下遇到的相關(guān)問題:
- SQL解析
我發(fā)現(xiàn)Impala目前在SQL解析方面還有優(yōu)化的余地,當(dāng)前的問題,一個(gè)是SQL解析速度很慢,另一個(gè)是如果SQL比較復(fù)雜的話存在硬解析的問題,非常耗時(shí)。雖然和現(xiàn)在更加成熟的關(guān)系數(shù)據(jù)庫Oracle、MySQL等還有一定差距,但是我相信這些只是時(shí)間問題。
- 穩(wěn)定性
可能是因?yàn)橐蕾囉贖ive的原因,通過Thrift接口來與后端進(jìn)行交互,并發(fā)性比較差。當(dāng)并發(fā)稍微高一點(diǎn)點(diǎn)的時(shí)候,就會(huì)出現(xiàn)impalad進(jìn)程掛掉的問題,有時(shí)候可能還會(huì)出現(xiàn)類似的僵尸進(jìn)程。