最近讀的幾篇關(guān)于impala的文章,這篇良心不錯(cuò):https://www./impala.html(本文截取部分內(nèi)容)
Impala是Cloudera公司主導(dǎo)開發(fā)的新型查詢系統(tǒng),它提供SQL語(yǔ)義,能查詢存儲(chǔ)在Hadoop的HDFS和HBase中的PB級(jí)大數(shù)據(jù)。已有的Hive系統(tǒng)雖然也提供了SQL語(yǔ)義,但由于Hive底層執(zhí)行使用的是MapReduce引擎,仍然是一個(gè)批處理過(guò)程,難以滿足查詢的交互性。相比之下,Impala的最大特點(diǎn)也是最大賣點(diǎn)就是它的快速。
Impala相對(duì)于Hive所使用的優(yōu)化技術(shù)
- 沒(méi)有使用MapReduce進(jìn)行并行計(jì)算,雖然MapReduce是非常好的并行計(jì)算框架,但它更多的面向批處理模式,而不是面向交互式的SQL執(zhí)行。與MapReduce相比:Impala把整個(gè)查詢分成一執(zhí)行計(jì)劃樹,而不是一連串的MapReduce任務(wù),在分發(fā)執(zhí)行計(jì)劃后,Impala使用拉式獲取數(shù)據(jù)的方式獲取結(jié)果,把結(jié)果數(shù)據(jù)組成按執(zhí)行樹流式傳遞匯集,減少了把中間結(jié)果寫入磁盤的步驟,再?gòu)拇疟P讀取數(shù)據(jù)的開銷。Impala使用服務(wù)的方式避免每次執(zhí)行查詢都需要啟動(dòng)的開銷,即相比Hive沒(méi)了MapReduce啟動(dòng)時(shí)間。
- 使用LLVM產(chǎn)生運(yùn)行代碼,針對(duì)特定查詢生成特定代碼,同時(shí)使用Inline的方式減少函數(shù)調(diào)用的開銷,加快執(zhí)行效率。
- 充分利用可用的硬件指令(2)。
- 更好的IO調(diào)度,Impala知道數(shù)據(jù)塊所在的磁盤位置能夠更好的利用多磁盤的優(yōu)勢(shì),同時(shí)Impala支持直接數(shù)據(jù)塊讀取和本地代碼計(jì)算checksum。
- 通過(guò)選擇合適的數(shù)據(jù)存儲(chǔ)格式可以得到最好的性能(Impala支持多種存儲(chǔ)格式)。
- 最大使用內(nèi)存,中間結(jié)果不寫磁盤,及時(shí)通過(guò)網(wǎng)絡(luò)以stream的方式傳遞。
Impala與Hive的異同
相同點(diǎn):
- 數(shù)據(jù)存儲(chǔ):使用相同的存儲(chǔ)數(shù)據(jù)池都支持把數(shù)據(jù)存儲(chǔ)于HDFS, HBase。
- 元數(shù)據(jù):兩者使用相同的元數(shù)據(jù)。
- SQL解釋處理:比較相似都是通過(guò)詞法分析生成執(zhí)行計(jì)劃。
不同點(diǎn):
執(zhí)行計(jì)劃:
- Hive: 依賴于MapReduce執(zhí)行框架,執(zhí)行計(jì)劃分成map->shuffle->reduce->map->shuffle->reduce…的模型。如果一個(gè)Query會(huì)被編譯成多輪MapReduce,則會(huì)有更多的寫中間結(jié)果。由于MapReduce執(zhí)行框架本身的特點(diǎn),過(guò)多的中間過(guò)程會(huì)增加整個(gè)Query的執(zhí)行時(shí)間。
- Impala: 把執(zhí)行計(jì)劃表現(xiàn)為一棵完整的執(zhí)行計(jì)劃樹,可以更自然地分發(fā)執(zhí)行計(jì)劃到各個(gè)Impalad執(zhí)行查詢,而不用像Hive那樣把它組合成管道型的map->reduce模式,以此保證Impala有更好的并發(fā)性和避免不必要的中間sort與shuffle。
數(shù)據(jù)流:
- Hive: 采用推的方式,每一個(gè)計(jì)算節(jié)點(diǎn)計(jì)算完成后將數(shù)據(jù)主動(dòng)推給后續(xù)節(jié)點(diǎn)。
- Impala: 采用拉的方式,后續(xù)節(jié)點(diǎn)通過(guò)getNext主動(dòng)向前面節(jié)點(diǎn)要數(shù)據(jù),以此方式數(shù)據(jù)可以流式的返回給客戶端,且只要有1條數(shù)據(jù)被處理完,就可以立即展現(xiàn)出來(lái),而不用等到全部處理完成,更符合SQL交互式查詢使用。
內(nèi)存使用:
- Hive: 在執(zhí)行過(guò)程中如果內(nèi)存放不下所有數(shù)據(jù),則會(huì)使用外存,以保證Query能順序執(zhí)行完。每一輪MapReduce結(jié)束,中間結(jié)果也會(huì)寫入HDFS中,同樣由于MapReduce執(zhí)行架構(gòu)的特性,shuffle過(guò)程也會(huì)有寫本地磁盤的操作。
- Impala: 在遇到內(nèi)存放不下數(shù)據(jù)時(shí),當(dāng)前版本0.1是直接返回錯(cuò)誤,而不會(huì)利用外存,以后版本應(yīng)該會(huì)進(jìn)行改進(jìn)。這使用得Impala目前處理Query會(huì)受到一定的限制,最好還是與Hive配合使用。Impala在多個(gè)階段之間利用網(wǎng)絡(luò)傳輸數(shù)據(jù),在執(zhí)行過(guò)程不會(huì)有寫磁盤的操作(insert除外)。
調(diào)度:
- Hive: 任務(wù)調(diào)度依賴于Hadoop的調(diào)度策略。
- Impala: 調(diào)度由自己完成,目前只有一種調(diào)度器simple-schedule,它會(huì)盡量滿足數(shù)據(jù)的局部性,掃描數(shù)據(jù)的進(jìn)程盡量靠近數(shù)據(jù)本身所在的物理機(jī)器。調(diào)度器目前還比較簡(jiǎn)單,在SimpleScheduler::GetBackend中可以看到,現(xiàn)在還沒(méi)有考慮負(fù)載,網(wǎng)絡(luò)IO狀況等因素進(jìn)行調(diào)度。但目前Impala已經(jīng)有對(duì)執(zhí)行過(guò)程的性能統(tǒng)計(jì)分析,應(yīng)該以后版本會(huì)利用這些統(tǒng)計(jì)信息進(jìn)行調(diào)度吧。
容錯(cuò):
- Hive: 依賴于Hadoop的容錯(cuò)能力。
- Impala: 在查詢過(guò)程中,沒(méi)有容錯(cuò)邏輯,如果在執(zhí)行過(guò)程中發(fā)生故障,則直接返回錯(cuò)誤(這與Impala的設(shè)計(jì)有關(guān),因?yàn)镮mpala定位于實(shí)時(shí)查詢,一次查詢失敗,再查一次就好了,再查一次的成本很低)。但從整體來(lái)看,Impala是能很好的容錯(cuò),所有的Impalad是對(duì)等的結(jié)構(gòu),用戶可以向任何一個(gè)Impalad提交查詢,如果一個(gè)Impalad失效,其上正在運(yùn)行的所有Query都將失敗,但用戶可以重新提交查詢由其它Impalad代替執(zhí)行,不會(huì)影響服務(wù)。對(duì)于State
Store目前只有一個(gè),但當(dāng)State Store失效,也不會(huì)影響服務(wù),每個(gè)Impalad都緩存了State Store的信息,只是不能再更新集群狀態(tài),有可能會(huì)把執(zhí)行任務(wù)分配給已經(jīng)失效的Impalad執(zhí)行,導(dǎo)致本次Query失敗。
適用面:
- Hive: 復(fù)雜的批處理查詢?nèi)蝿?wù),數(shù)據(jù)轉(zhuǎn)換任務(wù)。
- Impala:實(shí)時(shí)數(shù)據(jù)分析,因?yàn)椴恢С諹DF,能處理的問(wèn)題域有一定的限制,與Hive配合使用,對(duì)Hive的結(jié)果數(shù)據(jù)集進(jìn)行實(shí)時(shí)分析。
Impala的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 支持SQL查詢,快速查詢大數(shù)據(jù)。
- 可以對(duì)已有數(shù)據(jù)進(jìn)行查詢,減少數(shù)據(jù)的加載,轉(zhuǎn)換。
- 多種存儲(chǔ)格式可以選擇(Parquet, Text, Avro, RCFile, SequeenceFile)。
- 可以與Hive配合使用。
缺點(diǎn):
- 不支持用戶定義函數(shù)UDF。
- 不支持text域的全文搜索。
- 不支持Transforms。
- 不支持查詢期的容錯(cuò)。
- 對(duì)內(nèi)存要求高。
在Cloudera的測(cè)試中,Impala的查詢效率比Hive有數(shù)量級(jí)的提升。從技術(shù)角度上來(lái)看,Impala之所以能有好的性能,主要有以下幾方面的原因。
- Impala不需要把中間結(jié)果寫入磁盤,省掉了大量的I/O開銷。
- 省掉了MapReduce作業(yè)啟動(dòng)的開銷。MapReduce啟動(dòng)task的速度很慢(默認(rèn)每個(gè)心跳間隔是3秒鐘),Impala直接通過(guò)相應(yīng)的服務(wù)進(jìn)程來(lái)進(jìn)行作業(yè)調(diào)度,速度快了很多。
- Impala完全拋棄了MapReduce這個(gè)不太適合做SQL查詢的范式,而是像Dremel一樣借鑒了MPP并行數(shù)據(jù)庫(kù)的思想另起爐灶,因此可做更多的查詢優(yōu)化,從而省掉不必要的shuffle、sort等開銷。
- 通過(guò)使用LLVM來(lái)統(tǒng)一編譯運(yùn)行時(shí)代碼,避免了為支持通用編譯而帶來(lái)的不必要開銷。
- 用C++實(shí)現(xiàn),做了很多有針對(duì)性的硬件優(yōu)化,例如使用SSE指令。
- 使用了支持Data locality的I/O調(diào)度機(jī)制,盡可能地將數(shù)據(jù)和計(jì)算分配在同一臺(tái)機(jī)器上進(jìn)行,減少了網(wǎng)絡(luò)開銷。
雖然Impala是參照Dremel來(lái)實(shí)現(xiàn)的,但它也有一些自己的特色,例如Impala不僅支持Parquet格式,同時(shí)也可以直接處理文本、SequenceFile等Hadoop中常用的文件格式。另外一個(gè)更關(guān)鍵的地方在于,Impala是開源的,再加上Cloudera在Hadoop領(lǐng)域的領(lǐng)導(dǎo)地位,其生態(tài)圈有很大可能會(huì)在將來(lái)快速成長(zhǎng)。
Impala與Shark,Drill等的比較
開源組織Apache也發(fā)起了名為Drill的項(xiàng)目來(lái)實(shí)現(xiàn)Hadoop上的Dremel,目前該項(xiàng)目正在開發(fā)當(dāng)中,相關(guān)的文檔和代碼還不多,可以說(shuō)暫時(shí)還未對(duì)Impala構(gòu)成足夠的威脅。從Quora上的問(wèn)答來(lái)看,Cloudera有7-8名工程師全職在Impala項(xiàng)目上,而相比之下Drill目前的動(dòng)作稍顯遲鈍。具體來(lái)說(shuō),截止到2012年10月底,Drill的代碼庫(kù)里實(shí)現(xiàn)了query parser, plan parser,及能對(duì)JSON格式的數(shù)據(jù)進(jìn)行掃描的plan evaluator;而Impala同期已經(jīng)有了一個(gè)比較完畢的分布式query
execution引擎,并對(duì)HDFS和HBase上的數(shù)據(jù)讀入,錯(cuò)誤檢測(cè),INSERT的數(shù)據(jù)修改,LLVM動(dòng)態(tài)翻譯等都提供了支持。當(dāng)然,Drill作為Apache的項(xiàng)目,從一開始就避免了某個(gè)vendor的一家獨(dú)大,而且對(duì)所有Hadoop流行的發(fā)行版都會(huì)做相應(yīng)的支持,不像Impala只支持Cloudera自己的發(fā)行版CDH。從長(zhǎng)遠(yuǎn)來(lái)看,誰(shuí)會(huì)占據(jù)上風(fēng)還真不一定。
除此之外,加州伯克利大學(xué)AMPLab也開發(fā)了名為Shark的大數(shù)據(jù)分析系統(tǒng)。從長(zhǎng)遠(yuǎn)目標(biāo)來(lái)看,Shark想成為一個(gè)既支持大數(shù)據(jù)SQL查詢,又能支持高級(jí)數(shù)據(jù)分析任務(wù)的一體化數(shù)據(jù)處理系統(tǒng)。從技術(shù)實(shí)現(xiàn)的角度上來(lái)看,Shark基于Scala語(yǔ)言的算子推導(dǎo)實(shí)現(xiàn)了良好的容錯(cuò)機(jī)制,因此對(duì)失敗了的長(zhǎng)任務(wù)和短任務(wù)都能從上一個(gè)“快照點(diǎn)”進(jìn)行快速恢復(fù)。相比之下,Impala由于缺失足夠強(qiáng)大的容錯(cuò)機(jī)制,其上運(yùn)行的任務(wù)一旦失敗就必須“從頭來(lái)過(guò)”,這樣的設(shè)計(jì)必然會(huì)在性能上有所缺失。而且Shark是把內(nèi)存當(dāng)作第一類的存儲(chǔ)介質(zhì)來(lái)做的系統(tǒng)設(shè)計(jì),所以在處理速度上也會(huì)有一些優(yōu)勢(shì)。實(shí)際上,AMPLab最近對(duì)Hive,Impala,Shark及Amazon采用的商業(yè)MPP數(shù)據(jù)庫(kù)Redshift進(jìn)行了一次對(duì)比試驗(yàn),在Scan
Query,Aggregation Query和Join Query三種類型的任務(wù)中對(duì)它們進(jìn)行了比較。圖2就是AMPLab報(bào)告中Aggregation Query的性能對(duì)比。在圖中我們可以看到,商業(yè)版本的Redshift的性能是最好的, Impala和Shark則各有勝負(fù),且兩者都比Hive的性能高出了一大截。

其實(shí)對(duì)大數(shù)據(jù)分析的項(xiàng)目來(lái)說(shuō),技術(shù)往往不是最關(guān)鍵的。例如Hadoop中的MapReduce和HDFS都是源于Google,原創(chuàng)性較少。事實(shí)上,開源項(xiàng)目的生態(tài)圈,社區(qū),發(fā)展速度等,往往在很大程度上會(huì)影響Impala和Shark等開源大數(shù)據(jù)分析系統(tǒng)的發(fā)展。就像Cloudera一開始就決定會(huì)把Impala開源,以期望利用開源社區(qū)的力量來(lái)推廣這個(gè)產(chǎn)品;Shark也是一開始就開源了出來(lái),更不用說(shuō)Apache的Drill更是如此。說(shuō)到底還是誰(shuí)的生態(tài)系統(tǒng)更強(qiáng)的問(wèn)題。技術(shù)上一時(shí)的領(lǐng)先并不足以保證項(xiàng)目的最終成功。雖然最后那一款產(chǎn)品會(huì)成為事實(shí)上的標(biāo)準(zhǔn)還很難說(shuō),但是,我們唯一可以確定并堅(jiān)信的一點(diǎn)是,大數(shù)據(jù)分析將隨著新技術(shù)的不斷推陳出新而不斷普及開來(lái),這對(duì)用戶永遠(yuǎn)都是一件幸事。舉個(gè)例子,如果讀者注意過(guò)下一代Hadoop(YARN)的發(fā)展的話就會(huì)發(fā)現(xiàn),其實(shí)YARN已經(jīng)支持MapReduce之外的計(jì)算范式(例如Shark,Impala等),因此將來(lái)Hadoop將可能作為一個(gè)兼容并包的大平臺(tái)存在,在其上提供各種各樣的數(shù)據(jù)處理技術(shù),有應(yīng)對(duì)秒量級(jí)查詢的,有應(yīng)對(duì)大數(shù)據(jù)批處理的,各種功能應(yīng)有盡有,滿足用戶各方面的需求。
|