Impala架构和工作原理
1. Impala架構(gòu)??????
Impala是Cloudera在受到Google的Dremel啟發(fā)下開(kāi)發(fā)的實(shí)時(shí)交互SQL大數(shù)據(jù)查詢工具(實(shí)時(shí)SQL查詢引擎Impala),Impala沒(méi)有再使用緩慢的Hive+MapReduce批處理,而是通過(guò)使用與商用并行關(guān)系數(shù)據(jù)庫(kù)中類似的分布式查詢引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分組成),可以直接從HDFS或HBase中用SELECT、JOIN和統(tǒng)計(jì)函數(shù)查詢數(shù)據(jù),從而大大降低了延遲。
Impala架構(gòu)如圖所示
Impala主要由Impalad, State Store和CLI組成。
Impalad: 與DataNode運(yùn)行在同一節(jié)點(diǎn)上,由Impalad進(jìn)程表示,它接收客戶端的查詢請(qǐng)求(接收查詢請(qǐng)求的Impalad為Coordinator,Coordinator通過(guò)JNI調(diào)用java前端解釋SQL查詢語(yǔ)句,生成查詢計(jì)劃樹(shù),再通過(guò)調(diào)度器把執(zhí)行計(jì)劃分發(fā)給具有相應(yīng)數(shù)據(jù)的其它Impalad進(jìn)行執(zhí)行),讀寫(xiě)數(shù)據(jù),并行執(zhí)行查詢,并把結(jié)果通過(guò)網(wǎng)絡(luò)流式的傳送回給Coordinator,由Coordinator返回給客戶端。同時(shí)Impalad也與State Store保持連接,用于確定哪個(gè)Impalad是健康和可以接受新的工作。
在Impalad中啟動(dòng)三個(gè)ThriftServer: beeswax_server(連接客戶端),hs2_server(借用Hive元數(shù)據(jù)), be_server(Impalad內(nèi)部使用)和一個(gè)ImpalaServer服務(wù)。
Impala State Store: 跟蹤集群中的Impalad的健康狀態(tài)及位置信息,由statestored進(jìn)程表示,它通過(guò)創(chuàng)建多個(gè)線程來(lái)處理Impalad的注冊(cè)訂閱和與各Impalad保持心跳連接,各Impalad都會(huì)緩存一份State Store中的信息,當(dāng)State Store離線后(Impalad發(fā)現(xiàn)State Store處于離線時(shí),會(huì)進(jìn)入recovery模式,反復(fù)注冊(cè),當(dāng)State Store重新加入集群后,自動(dòng)恢復(fù)正常,更新緩存數(shù)據(jù))因?yàn)镮mpalad有State Store的緩存仍然可以工作,但會(huì)因?yàn)橛行㊣mpalad失效了,而已緩存數(shù)據(jù)無(wú)法更新,導(dǎo)致把執(zhí)行計(jì)劃分配給了失效的Impalad,導(dǎo)致查詢失敗。
CLI: 提供給用戶查詢使用的命令行工具(Impala Shell使用python實(shí)現(xiàn)),同時(shí)Impala還提供了Hue,JDBC, ODBC使用接口。
2. 與Hive的關(guān)系
? ? ? ? Impala與Hive都是構(gòu)建在Hadoop之上的數(shù)據(jù)查詢工具各有不同的側(cè)重適應(yīng)面,但從客戶端使用來(lái)看Impala與Hive有很多的共同之處,如數(shù)據(jù)表元數(shù)據(jù)、ODBC/JDBC驅(qū)動(dòng)、SQL語(yǔ)法、靈活的文件格式、存儲(chǔ)資源池等。Impala與Hive在Hadoop中的關(guān)系如圖 2所示。Hive適合于長(zhǎng)時(shí)間的批處理查詢分析,而Impala適合于實(shí)時(shí)交互式SQL查詢,Impala給數(shù)據(jù)分析人員提供了快速實(shí)驗(yàn)、驗(yàn)證想法的大數(shù)據(jù)分析工具。可以先使用hive進(jìn)行數(shù)據(jù)轉(zhuǎn)換處理,之后使用Impala在Hive處理后的結(jié)果數(shù)據(jù)集上進(jìn)行快速的數(shù)據(jù)分析。
3. Impala的查詢處理過(guò)程???????
Impalad分為Java前端與C++處理后端,接受客戶端連接的Impalad即作為這次查詢的Coordinator,Coordinator通過(guò)JNI調(diào)用Java前端對(duì)用戶的查詢SQL進(jìn)行分析生成執(zhí)行計(jì)劃樹(shù),不同的操作對(duì)應(yīng)不用的PlanNode, 如:SelectNode, ScanNode, SortNode, AggregationNode, HashJoinNode等等。
執(zhí)行計(jì)劃樹(shù)的每個(gè)原子操作由一個(gè)PlanFragment表示,通常一條查詢語(yǔ)句由多個(gè)Plan Fragment組成, Plan Fragment 0表示執(zhí)行樹(shù)的根,匯聚結(jié)果返回給用戶,執(zhí)行樹(shù)的葉子結(jié)點(diǎn)一般是Scan操作,分布式并行執(zhí)行。
? ? ? Java前端產(chǎn)生的執(zhí)行計(jì)劃樹(shù)以Thrift數(shù)據(jù)格式返回給Impala C++后端(Coordinator)(執(zhí)行計(jì)劃分為多個(gè)階段,每一個(gè)階段叫做一個(gè)PlanFragment,每一個(gè)PlanFragment在執(zhí)行時(shí)可以由多個(gè)Impalad實(shí)例并行執(zhí)行(有些PlanFragment只能由一個(gè)Impalad實(shí)例執(zhí)行,如聚合操作),整個(gè)執(zhí)行計(jì)劃為一執(zhí)行計(jì)劃樹(shù)),由Coordinator根據(jù)執(zhí)行計(jì)劃,數(shù)據(jù)存儲(chǔ)信息(Impala通過(guò)libhdfs與HDFS進(jìn)行交互。通過(guò)hdfsGetHosts方法獲得文件數(shù)據(jù)塊所在節(jié)點(diǎn)的位置信息),通過(guò)調(diào)度器(現(xiàn)在只有simple-scheduler, 使用round-robin算法)Coordinator::Exec對(duì)生成的執(zhí)行計(jì)劃樹(shù)分配給相應(yīng)的后端執(zhí)行器Impalad執(zhí)行(查詢會(huì)使用LLVM進(jìn)行代碼生成,編譯,執(zhí)行。對(duì)于使用LLVM如何提高性能這里有說(shuō)明),通過(guò)調(diào)用GetNext()方法獲取計(jì)算結(jié)果,如果是insert語(yǔ)句,則將計(jì)算結(jié)果通過(guò)libhdfs寫(xiě)回HDFS當(dāng)所有輸入數(shù)據(jù)被消耗光,執(zhí)行結(jié)束,之后注銷此次查詢服務(wù)。
Impala的查詢處理流程大概如圖所示:
下面以一個(gè)SQL查詢語(yǔ)句為例分析Impala的查詢處理流程。如select sum(id), count(id), avg(id) from customer_small ?group by id; 以此語(yǔ)句生成的計(jì)劃為:
PLAN?FRAGMENT?0??PARTITION:?UNPARTITIONED4:EXCHANGEtuple?ids:?1PLAN?FRAGMENT?1??PARTITION:?HASH_PARTITIONED:?<slot?1>??STREAM?DATA?SINKEXCHANGE?ID:?4????UNPARTITIONED3:AGGREGATE|??output:?SUM(<slot?2>),?SUM(<slot?3>)|??group?by:?<slot?1>??|??tuple?ids:?1??|??2:EXCHANGEtuple?ids:?1PLAN?FRAGMENT?2??PARTITION:?RANDOMSTREAM?DATA?SINKEXCHANGE?ID:?2????HASH_PARTITIONED:?<slot?1>??1:AGGREGATE|??output:?SUM(id),?COUNT(id)|??group?by:?id|??tuple?ids:?1??|??0:SCAN?HDFStable=default.customer_small?#partitions=1?size=193Btuple?ids:?0
執(zhí)行行計(jì)劃樹(shù)如圖所示, 綠色的部分為可以分布式并行執(zhí)行:
4. Impala相對(duì)于Hive所使用的優(yōu)化技術(shù)
1、沒(méi)有使用MapReduce進(jìn)行并行計(jì)算,雖然MapReduce是非常好的并行計(jì)算框架,但它更多的面向批處理模式,而不是面向交互式的SQL執(zhí)行。與MapReduce相比:Impala把整個(gè)查詢分成一執(zhí)行計(jì)劃樹(shù),而不是一連串的MapReduce任務(wù),在分發(fā)執(zhí)行計(jì)劃后,Impala使用拉式獲取數(shù)據(jù)的方式獲取結(jié)果,把結(jié)果數(shù)據(jù)組成按執(zhí)行樹(shù)流式傳遞匯集,減少的了把中間結(jié)果寫(xiě)入磁盤(pán)的步驟,再?gòu)拇疟P(pán)讀取數(shù)據(jù)的開(kāi)銷。Impala使用服務(wù)的方式避免每次執(zhí)行查詢都需要啟動(dòng)的開(kāi)銷,即相比Hive沒(méi)了MapReduce啟動(dòng)時(shí)間。
2、使用LLVM產(chǎn)生運(yùn)行代碼,針對(duì)特定查詢生成特定代碼,同時(shí)使用Inline的方式減少函數(shù)調(diào)用的開(kāi)銷,加快執(zhí)行效率。
3、充分利用可用的硬件指令(SSE4.2)。
4、更好的IO調(diào)度,Impala知道數(shù)據(jù)塊所在的磁盤(pán)位置能夠更好的利用多磁盤(pán)的優(yōu)勢(shì),同時(shí)Impala支持直接數(shù)據(jù)塊讀取和本地代碼計(jì)算checksum。
5、通過(guò)選擇合適的數(shù)據(jù)存儲(chǔ)格式可以得到最好的性能(Impala支持多種存儲(chǔ)格式)。
6、最大使用內(nèi)存,中間結(jié)果不寫(xiě)磁盤(pán),及時(shí)通過(guò)網(wǎng)絡(luò)以stream的方式傳遞。
5. Impala與Hive的異同
數(shù)據(jù)存儲(chǔ):使用相同的存儲(chǔ)數(shù)據(jù)池都支持把數(shù)據(jù)存儲(chǔ)于HDFS, HBase。
元數(shù)據(jù):兩者使用相同的元數(shù)據(jù)。
SQL解釋處理:比較相似都是通過(guò)詞法分析生成執(zhí)行計(jì)劃。
執(zhí)行計(jì)劃:
Hive: 依賴于MapReduce執(zhí)行框架,執(zhí)行計(jì)劃分成map->shuffle->reduce->map->shuffle->reduce…的模型。如果一個(gè)Query會(huì)被編譯成多輪MapReduce,則會(huì)有更多的寫(xiě)中間結(jié)果。由于MapReduce執(zhí)行框架本身的特點(diǎn),過(guò)多的中間過(guò)程會(huì)增加整個(gè)Query的執(zhí)行時(shí)間。
Impala: 把執(zhí)行計(jì)劃表現(xiàn)為一棵完整的執(zhí)行計(jì)劃樹(shù),可以更自然地分發(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ì)寫(xiě)入HDFS中,同樣由于MapReduce執(zhí)行架構(gòu)的特性,shuffle過(guò)程也會(huì)有寫(xiě)本地磁盤(pán)的操作。
Impala: 在遇到內(nèi)存放不下數(shù)據(jù)時(shí),當(dāng)前版本1.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ì)有寫(xiě)磁盤(pán)的操作(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í)分析。
6. 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)存要求高。
轉(zhuǎn)載于:https://blog.51cto.com/simplelife/2356069
總結(jié)
以上是生活随笔為你收集整理的Impala架构和工作原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为什么 JavaScript 的 thi
- 下一篇: 2月28日云栖精选夜读 | 阿里云率先达