impala-review

Impala是Cloudera公司主導(dǎo)開發(fā)的新型查詢系統(tǒng)趣倾,它提供SQL語義勺三,能查詢存儲(chǔ)在Hadoop的HDFS和HBase中的PB級(jí)大數(shù)據(jù)佣渴。已有的Hive系統(tǒng)雖然也提供了SQL語義坎弯,但由于Hive底層執(zhí)行使用的是MapReduce引擎,仍然是一個(gè)批處理過程五垮,難以滿足查詢的交互性。相比之下杜秸,Impala的最大特點(diǎn)也是最大賣點(diǎn)就是它的快速放仗。Impala是參照谷歌新三篇論文Impala是Cloudera在受到Google的Dremel啟發(fā)下開發(fā)的實(shí)時(shí)交互SQL大數(shù)據(jù)查詢工具,Impala沒有再使用緩慢的 Hive+MapReduce批處理撬碟,而是通過使用與商用并行關(guān)系數(shù)據(jù)庫中類似的分布式查詢引擎(由Query Planner诞挨、Query Coordinator和Query Exec Engine三部分組成),可以直接從HDFS或HBase中用SELECT呢蛤、JOIN和統(tǒng)計(jì)函數(shù)查詢數(shù)據(jù)惶傻,從而大大降低了延遲。其架構(gòu)如圖 1所示其障,Impala主要由Impalad银室, State Store和CLI組成。Dremel的開源實(shí)現(xiàn),和Shark蜈敢、Drill功能相似辜荠。Impala是Cloudera公司主導(dǎo)開發(fā)并開源∽ハ粒基于Hive并使用內(nèi)存進(jìn)行計(jì)算伯病,兼顧數(shù)據(jù)倉庫,具有實(shí)時(shí)否过、批處理午笛、多并發(fā)等優(yōu)點(diǎn)。是使用CDH的首選PB級(jí)大數(shù)據(jù)實(shí)時(shí)查詢分析引擎叠纹。Impala是Cloudera在受到Google的Dremel啟發(fā)下開發(fā)的實(shí)時(shí)交互SQL大數(shù)據(jù)查詢工具季研,Impala沒有再使用緩慢的 Hive+MapReduce批處理,而是通過使用與商用并行關(guān)系數(shù)據(jù)庫中類似的分布式查詢引擎(由Query Planner誉察、Query Coordinator和Query Exec Engine三部分組成)与涡,可以直接從HDFS或HBase中用SELECT、JOIN和統(tǒng)計(jì)函數(shù)查詢數(shù)據(jù)持偏,從而大大降低了延遲驼卖。其架構(gòu)如圖 1所示,Impala主要由Impalad鸿秆, State Store和CLI組成酌畜。

谷歌舊三篇論文:mapreduce(mapreduce) 、 bigtable(HBase) 卿叽、 gfs(HDFS)

谷歌新三篇論文:Dremel(Impala)桥胞、Caffeine、Pergel考婴。

同時(shí)贩虾,Impala由Cloudera公司開發(fā),可以對(duì)存儲(chǔ)在HDFS沥阱、HBase的海量數(shù)據(jù)提供交互式查詢的SQL接口缎罢。除了和Hive使用相同的統(tǒng)一存儲(chǔ)平臺(tái),Impala還提供了一個(gè)熟悉的面向批量或?qū)崟r(shí)查詢的統(tǒng)一平臺(tái)考杉。Impala的特點(diǎn)是查詢非常迅速策精,其性能大幅領(lǐng)先于Hive。

注意:Impala并沒有基于MapReduce的計(jì)算框架崇棠,這也是Impala可以大幅領(lǐng)先Hive的原因咽袜,Impala是定位是OLAP。

Impala是Cloudera在受到Google的Dremel啟發(fā)下開發(fā)的實(shí)時(shí)交互SQL大數(shù)據(jù)查詢工具易茬,Impala沒有再使用緩慢的 Hive+MapReduce批處理酬蹋,而是通過使用與商用并行關(guān)系數(shù)據(jù)庫中類似的分布式查詢引擎(由Query Planner及老、Query Coordinator和Query Exec Engine三部分組成),可以直接從HDFS或HBase中用SELECT范抓、JOIN和統(tǒng)計(jì)函數(shù)查詢數(shù)據(jù)骄恶,從而大大降低了延遲。其架構(gòu)如圖 1所示匕垫,Impala主要由Impalad僧鲁, State Store和CLI組成

Impalad: 與DataNode運(yùn)行在同一節(jié)點(diǎn)上象泵,由Impalad進(jìn)程表示寞秃,它接收客戶端的查詢請(qǐng)求(接收查詢請(qǐng)求的Impalad為 Coordinator,Coordinator通過JNI調(diào)用java前端解釋SQL查詢語句偶惠,生成查詢計(jì)劃樹春寿,再通過調(diào)度器把執(zhí)行計(jì)劃分發(fā)給具有相應(yīng) 數(shù)據(jù)的其它Impalad進(jìn)行執(zhí)行),讀寫數(shù)據(jù)忽孽,并行執(zhí)行查詢绑改,并把結(jié)果通過網(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)程表示辅鲸,它通過創(chuàng)建多個(gè)線程來處理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ù)無法更新先紫,導(dǎo)致把執(zhí)行計(jì)劃分配給了失效的Impalad治泥,導(dǎo)致查詢失敗。

CLI: 提供給用戶查詢使用的命令行工具(Impala Shell使用python實(shí)現(xiàn))遮精,同時(shí)Impala還提供了Hue居夹,JDBC败潦, ODBC使用接口。

Impala三大進(jìn)程由Impalad,statestored,catalogd

Impala和Hive的關(guān)系

Impala是基于Hive的大數(shù)據(jù)實(shí)時(shí)分析查詢引擎准脂,直接使用Hive的元數(shù)據(jù)庫Metadata,意味著impala元數(shù)據(jù)都存儲(chǔ)在Hive的metastore中劫扒。并且impala兼容Hive的sql解析,實(shí)現(xiàn)了Hive的SQL語義的子集狸膏,功能還在不斷的完善中沟饥。

與Hive的關(guān)系

Impala 與Hive都是構(gòu)建在Hadoop之上的數(shù)據(jù)查詢工具各有不同的側(cè)重適應(yīng)面,但從客戶端使用來看Impala與Hive有很多的共同之處湾戳,如數(shù)據(jù)表元數(shù) 據(jù)贤旷、ODBC/JDBC驅(qū)動(dòng)、SQL語法砾脑、靈活的文件格式幼驶、存儲(chǔ)資源池等Impala與Hive在Hadoop中的關(guān)系如下圖所示韧衣。Hive適合于長時(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ù)分析夸政。

Impala相對(duì)于Hive所使用的優(yōu)化技術(shù)

1、沒有使用

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é)果寫入磁盤的步驟攒巍,再從磁盤讀取數(shù)據(jù) 的開銷嗽仪。Impala使用服務(wù)的方式避免每次執(zhí)行查詢都需要啟動(dòng)的開銷,即相比Hive沒了MapReduce啟動(dòng)時(shí)間柒莉。(MapReduce啟動(dòng)時(shí)間指的是什么闻坚?)

2、使用LLVM產(chǎn)生運(yùn)行代碼兢孝,針對(duì)特定查詢生成特定代碼窿凤,同時(shí)使用Inline的方式減少函數(shù)調(diào)用的開銷仅偎,加快執(zhí)行效率。

3雳殊、充分利用可用的硬件指令(SSE4.2)橘沥。

4、更好的IO調(diào)度相种,Impala知道數(shù)據(jù)塊所在的磁盤位置能夠更好的利用多磁盤的優(yōu)勢(data locality -- 基本DataNode節(jié)點(diǎn)安裝了Imapla Daemon)威恼,同時(shí)Impala支持直接數(shù)據(jù)塊讀取和本地代碼計(jì)算checksum。

5寝并、通過選擇合適的數(shù)據(jù)存儲(chǔ)格式可以得到最好的性能(Impala支持多種存儲(chǔ)格式)箫措。

6、最大使用內(nèi)存衬潦,中間結(jié)果不寫磁盤斤蔓,及時(shí)通過網(wǎng)絡(luò)以stream的方式傳遞。

Impala與Hive的異同

數(shù)據(jù)存儲(chǔ):使用相同的存儲(chǔ)數(shù)據(jù)池都支持把數(shù)據(jù)存儲(chǔ)于HDFS, HBase镀岛。

元數(shù)據(jù):兩者使用相同的元數(shù)據(jù)弦牡。

SQL解釋處理:比較相似都是通過詞法分析生成執(zhí)行計(jì)劃。

執(zhí)行計(jì)劃

Hive: 依賴于MapReduce執(zhí)行框架漂羊,執(zhí)行計(jì)劃分成map->shuffle->reduce->map->shuffle->reduce…的模型驾锰。如果一個(gè)Query會(huì)被編譯成多輪MapReduce,則會(huì)有更多的寫中間結(jié)果走越。由于MapReduce執(zhí)行框架本身的特點(diǎn)椭豫,過多的中間過程會(huì)增加整個(gè)Query的執(zhí)行時(shí)間。

Impala:把執(zhí)行計(jì)劃表現(xiàn)為一棵完整的執(zhí)行計(jì)劃樹旨指,可以更自然地分發(fā)執(zhí)行計(jì)劃到各個(gè)Impalad執(zhí)行查詢(Impala查詢計(jì)劃解析器使用更智能的算法在多節(jié)點(diǎn)上分布式執(zhí)行各個(gè)查詢步驟)赏酥,而不用像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)通過getNext主動(dòng)向前面節(jié)點(diǎn)要數(shù)據(jù)呵晨,以此方式數(shù)據(jù)可以流式的返回給客戶端,且只要有1條數(shù)據(jù)被處理完熬尺,就可以立即展現(xiàn)出來何荚,而不用等到全部處理完成,更符合SQL交互式查詢使用猪杭。

內(nèi)存使用

Hive: 在執(zhí)行過程中如果內(nèi)存放不下所有數(shù)據(jù),則會(huì)使用外存妥衣,以保證Query能順序執(zhí)行完皂吮。每一輪MapReduce結(jié)束戒傻,中間結(jié)果也會(huì)寫入HDFS中,同樣由于MapReduce執(zhí)行架構(gòu)的特性蜂筹,shuffle過程也會(huì)有寫本地磁盤的操作需纳。

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í)行過程不會(huì)有寫磁盤的操作(insert除外)津坑。

調(diào)度

Hive: 任務(wù)調(diào)度依賴于Hadoop的調(diào)度策略妙蔗。(MR2 / Yarn)

Impala:調(diào)度由自己完成,目前只有一種調(diào)度器simple-schedule疆瑰,它會(huì)盡量滿足數(shù)據(jù)的局部性眉反,掃描數(shù)據(jù)的進(jìn)程盡量靠近數(shù)據(jù)本身所在的物理機(jī)器。(impala 守護(hù)進(jìn)程基本都會(huì)安裝在DataNode節(jié)點(diǎn))調(diào)度器目前還比較簡單穆役,在SimpleScheduler::GetBackend中可以看到寸五,現(xiàn)在還沒有考慮負(fù)載,網(wǎng)絡(luò)IO狀況等因素進(jìn)行調(diào)度耿币。但目前Impala已經(jīng)有對(duì)執(zhí)行過程的性能統(tǒng)計(jì)分析梳杏,應(yīng)該以后版本會(huì)利用這些統(tǒng)計(jì)信息進(jìn)行調(diào)度吧。

容錯(cuò)

Hive: 依賴于Hadoop的容錯(cuò)能力掰读。

Impala:在查詢過程中秘狞,沒有容錯(cuò)邏輯,如果在執(zhí)行過程中發(fā)生故障蹈集,則直接返回錯(cuò)誤(這與Impala的設(shè)計(jì)有關(guān)烁试,因?yàn)镮mpala定位于實(shí)時(shí)查詢,一次查詢失敗拢肆,再查一次就好了减响,再查一次的成本很低)。但從整體來看郭怪,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都緩存了StateStore的信息尖坤,只是不能再更新集群狀態(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,能處理的問題域有一定的限制俺榆,與Hive配合使用,對(duì)Hive的結(jié)果數(shù)據(jù)集進(jìn)行實(shí)時(shí)分析感昼。

Impala 與Hive都是構(gòu)建在Hadoop之上的數(shù)據(jù)查詢工具,但是各有不同側(cè)重罐脊,那么我們為什么要同時(shí)使用這兩個(gè)工具呢定嗓?單獨(dú)使用Hive或者Impala不可以嗎?

一萍桌、介紹Impala和Hive

(1)Impala和Hive都是提供對(duì)HDFS/Hbase數(shù)據(jù)進(jìn)行SQL查詢的工具宵溅,Hive會(huì)轉(zhuǎn)換成MapReduce,借助于YARN進(jìn)行調(diào)度從而實(shí)現(xiàn)對(duì)HDFS的數(shù)據(jù)的訪問上炎,而Impala直接對(duì)HDFS進(jìn)行數(shù)據(jù)查詢恃逻。但是他們都是提供如下的標(biāo)準(zhǔn)SQL語句,在機(jī)身里運(yùn)行藕施。

(2)Apache Hive是MapReduce的高級(jí)抽象寇损,使用HiveQL,Hive可以生成運(yùn)行在Hadoop集群的MapReduce或Spark作業(yè)。Hive最初由Facebook大約在2007年開發(fā),現(xiàn)在是Apache的開源項(xiàng)目裳食。

Apache Impala是高性能的專用SQL引擎矛市,使用Impala SQL,因?yàn)镮mpala無需借助任何的框架诲祸,直接實(shí)現(xiàn)對(duì)數(shù)據(jù)塊的查詢浊吏,所以查詢延遲毫秒級(jí)。Impala受到Google的Dremel項(xiàng)目啟發(fā)救氯,2012年由Cloudera開發(fā)找田,現(xiàn)在是Apache開源項(xiàng)目。

二着憨、Impala和Hive有什么不同墩衙?

(1)Hive有很多的特性:

1、對(duì)復(fù)雜數(shù)據(jù)類型(比如arrays和maps)和窗口分析更廣泛的支持 2、高擴(kuò)展性 3漆改、通常用于批處理

(2)Impala更快

1植袍、專業(yè)的SQL引擎,提供了5x到50x更好的性能 2籽懦、理想的交互式查詢和數(shù)據(jù)分析工具 3、更多的特性正在添加進(jìn)來

三氛魁、高級(jí)概述:

四暮顺、為什么要使用Hive和Impala?

1、為數(shù)據(jù)分析人員帶來了海量數(shù)據(jù)分析能力,不需要軟件開發(fā)經(jīng)驗(yàn),運(yùn)用已掌握的SQL知識(shí)進(jìn)行數(shù)據(jù)的分析秀存。

2捶码、比直接寫MapReduce或Spark具有更好的生產(chǎn)力,5行HiveQL/Impala SQL等同于200行或更多的Java代碼或链。

3惫恼、提供了與其他系統(tǒng)良好的互操作性,比如通過Java和外部腳本擴(kuò)展澳盐,而且很多商業(yè)智能工具支持Hive和Impala祈纯。

五、Hive和Impala使用案例

(1)日志文件分析

日志是普遍的數(shù)據(jù)類型叼耙,是當(dāng)下大數(shù)據(jù)時(shí)代重要的數(shù)據(jù)源腕窥,結(jié)構(gòu)不固定,可以通過Flume和kafka將日志采集放到HDFS筛婉,然后分析日志的結(jié)構(gòu)簇爆,根據(jù)日志的分隔符去建立一個(gè)表,接下來運(yùn)用Hive和Impala 進(jìn)行數(shù)據(jù)的分析爽撒。例如:

(2)情感分析:很多組織使用Hive或Impala來分析社交媒體覆蓋情況入蛆。例如:

(3)商業(yè)智能:很多領(lǐng)先的BI工具支持Hive和Impala


優(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)存要求高。

1岖瑰、Impala 外部 Shell

Impala外部Shell 就是不進(jìn)入Impala內(nèi)部叛买,直接執(zhí)行的ImpalaShell 例如通過外部Shell查看Impala幫助可以使用:$ impala-shell -h這樣就可以查看了;

再例如顯示一個(gè)SQL語句的執(zhí)行計(jì)劃:$ impala-shell -p select count(*) from t_stu

下面是Impala的外部Shell的一些參數(shù):

? -h (--help) 幫助

? -v (--version) 查詢版本信息

? -V (--verbose) 啟用詳細(xì)輸出

? --quiet 關(guān)閉詳細(xì)輸出

? -p 顯示執(zhí)行計(jì)劃

? -i hostname (--impalad=hostname) 指定連接主機(jī)格式hostname:port 默認(rèn)端口21000

? -r(--refresh_after_connect)刷新所有元數(shù)據(jù)

? -q query (--query=query) 從命令行執(zhí)行查詢蹋订,不進(jìn)入impala-shell

? -d default_db (--database=default_db) 指定數(shù)據(jù)庫

? -B(--delimited)去格式化輸出

? --output_delimiter=character 指定分隔符

? --print_header 打印列名

? -f query_file(--query_file=query_file)執(zhí)行查詢文件率挣,以分號(hào)分隔

? -o filename (--output_file filename) 結(jié)果輸出到指定文件

??-c 查詢執(zhí)行失敗時(shí)繼續(xù)執(zhí)行

? -k (--kerberos) 使用kerberos安全加密方式運(yùn)行impala-shell

? -l 啟用LDAP認(rèn)證

? -u 啟用LDAP時(shí),指定用戶名

2露戒、Impala內(nèi)部Shell

使用命令$ impala-sehll可以進(jìn)入impala椒功,在這里可以像Hive一樣正常使用SQL,而且還有一些內(nèi)部的impala命令:

? help

? connect 連接主機(jī)智什,默認(rèn)端口21000

? refresh 增量刷新元數(shù)據(jù)庫

? invalidate metadata 全量刷新元數(shù)據(jù)庫

? explain 顯示查詢執(zhí)行計(jì)劃动漾、步驟信息

? set explain_level 設(shè)置顯示級(jí)別(0,1,2,3)

? shell 不退出impala-shell執(zhí)行Linux命令

? profile (查詢完成后執(zhí)行) 查詢最近一次查詢的底層信息

例:查看幫助可以直接使用:help,要刷新一個(gè)表的增量元數(shù)據(jù)可以使用refresh t_stu;



hive的元數(shù)據(jù)存儲(chǔ)在/user/hadoop/warehouse

Impala的內(nèi)部表也在/user/hadoop/warehouse荠锭。

那兩者怎么區(qū)分旱眯,看前面的第一列。

下面是Impala對(duì)文件的格式及壓縮類型的支持

? 添加分區(qū)方式

– 1证九、partitioned by 創(chuàng)建表時(shí)删豺,添加該字段指定分區(qū)列表

– 2、使用alter table 進(jìn)行分區(qū)的添加和刪除操作

create table t_person(idint, namestring, ageint) partitioned by (typestring);

alter table t_person add partition (sex=‘man');alter table t_person drop partition (sex=‘man');alter table t_person drop partition (sex=‘man‘,type=‘boss’);

? 分區(qū)內(nèi)添加數(shù)據(jù)

insert into t_person partition (type='boss') values (1,’zhangsan’,18),(2,’lisi’,23)

insert into t_person partition (type='coder') values(3,wangwu’,22),(4,’zhaoliu’,28),(5,’tianqi’,24)

? 查詢指定分區(qū)數(shù)據(jù)

selectid,namefromt_personwheretype=‘coder

進(jìn)行數(shù)據(jù)分區(qū)將會(huì)極大的提高數(shù)據(jù)查詢的效率甫贯,尤其是對(duì)于當(dāng)下大數(shù)據(jù)的運(yùn)用吼鳞,是一門不可或缺的知識(shí)。那數(shù)據(jù)怎么創(chuàng)建分區(qū)呢叫搁?數(shù)據(jù)怎樣加載到分區(qū)

一赔桌、??Impala/Hive按State分區(qū)Accounts

(1)示例:accounts是非分區(qū)表

通過以上方式創(chuàng)建的話,數(shù)據(jù)就存放在accounts目錄里面渴逻。那么疾党,如果Loudacre大部分對(duì)customer表的分析是按state來完成的?比如:

這種情況下如果數(shù)據(jù)量很大惨奕,為了避免全表掃描的發(fā)生雪位,我們可以去創(chuàng)建分區(qū)。如果不創(chuàng)建分區(qū)的話梨撞,它會(huì)默認(rèn)所有查詢不得不掃描目錄的所有文件雹洗。創(chuàng)建分區(qū)按state將數(shù)據(jù)存儲(chǔ)到不同的子目錄,當(dāng)按照“NY”的條件進(jìn)行查詢的時(shí)候卧波,它只會(huì)掃描到子目錄时肿,下面我具體來看一下分區(qū)創(chuàng)建。

二港粱、分區(qū)創(chuàng)建

(1)使用PARTITIONED BY來創(chuàng)建分區(qū)表

在這里注意state是被刪除掉的螃成,因?yàn)樗鳛榉謪^(qū)字段旦签,我們知道分區(qū)數(shù)據(jù)是不會(huì)出現(xiàn)在實(shí)際的文件當(dāng)中的,所以state作為分區(qū)字段是不會(huì)出現(xiàn)在列當(dāng)中的寸宏。換句話說宁炫,分區(qū)鍵就是一個(gè)虛列,它是不會(huì)存在列當(dāng)中的氮凝。那么羔巢,如何去查看我們分區(qū)的列呢?它會(huì)出現(xiàn)在我們的結(jié)構(gòu)當(dāng)中嗎罩阵?會(huì)的朵纷。

三、查看分區(qū)列

使用DESCRIBE顯示分區(qū)列永脓,它會(huì)出現(xiàn)在結(jié)構(gòu)最后一列,它是一個(gè)虛列鞋仍,并不是真實(shí)在數(shù)據(jù)中存在的列常摧。

我們創(chuàng)建單個(gè)分區(qū),但有時(shí)候會(huì)有嵌套分區(qū)威创,如何來處理呢落午?

四、創(chuàng)建嵌套分區(qū):

創(chuàng)建好了分區(qū)肚豺,我們?cè)趺醇虞d數(shù)據(jù)到分區(qū)呢溃斋?有兩種方式動(dòng)態(tài)分區(qū)和靜態(tài)分區(qū)。動(dòng)態(tài)分區(qū)是指Impala/Hive在加載的時(shí)候自動(dòng)添加新的分區(qū)吸申,數(shù)據(jù)基于列值存儲(chǔ)到正確的分區(qū)(子目錄)梗劫。而靜態(tài)分區(qū)需要我們通過ADD PARTITION提前去定義分區(qū)的名稱,當(dāng)加載數(shù)據(jù)的時(shí)候截碴,指定存儲(chǔ)數(shù)據(jù)到哪個(gè)分區(qū)梳侨。


? 注意:

– 1)不能向impala的視圖進(jìn)行插入操作

– 2)insert 表可以來自視圖

? 數(shù)據(jù)文件處理

– 加載數(shù)據(jù):

? 1、insert語句:插入數(shù)據(jù)時(shí)每條數(shù)據(jù)產(chǎn)生一個(gè)數(shù)據(jù)文件日丹,不建議用此方式加載批量數(shù)據(jù)

? 2走哺、load data方式:再進(jìn)行批量插入時(shí)使用這種方式比較合適

? 3、來自中間表:此種方式使用于從一個(gè)小文件較多的大表中讀取文件并寫入新的表生產(chǎn)少量的數(shù)據(jù)文件哲虾。也可以通過此種方式進(jìn)行格式轉(zhuǎn)換丙躏。

– 空值處理:? impala將“\n”表示為NULL,在結(jié)合sqoop使用是注意做相應(yīng)的空字段過濾束凑,? 也可以使用以下方式進(jìn)行處理:alter table name set tblproperties(“serialization.null.format”=“null”)


--指定存儲(chǔ)方式:

create table t_person2(id int,name string)row format delimited fields terminated by ‘\0’ (impala1.3.1版本以上支持‘\0’ ) storedastextfile;--其他方式創(chuàng)建內(nèi)部表--使用現(xiàn)有表結(jié)構(gòu):create table tab_3 like tab_1;

--指定文本表字段分隔符:alter table tab_3setserdeproperties(‘serialization.format’=‘,’,’field.delim’=‘,’);

--插入數(shù)據(jù)--直接插入值方式:insert into t_person values (1,hex(‘hello world’));

--從其他表插入數(shù)據(jù):insert (overwrite) into tab_3select*form tab_2 ;

-批量導(dǎo)入文件方式方式:load data local inpath ‘/xxx/xxx’ into table tab_1;

--創(chuàng)建表(外部表)--默認(rèn)方式創(chuàng)建表:create external table tab_p1(id int,name string) location ‘/user/xxx.txt’

--指定存儲(chǔ)方式:create external table tab_p2 like parquet_tab ‘/user/xxx/xxx/1.dat’ partition (yearint, month tinyint, day tinyint) location ‘/user/xxx/xxx’ storedasparquet;

--視圖--創(chuàng)建視圖: create view v1asselectcount(id)astotalfromtab_3 ;--查詢視圖:select*fromv1;--查看視圖定義:describe formatted v1


數(shù)據(jù)文件處理:加載數(shù)據(jù):1/ insert語句 插入語句時(shí)每條數(shù)據(jù)產(chǎn)生一個(gè)數(shù)據(jù)文件 不建議使用此方式加載批量數(shù)據(jù)

2/ load data方式:在進(jìn)行批量插入時(shí)使用這種方式比較合適

3/? 來自中間表:此種方式使用于從一個(gè)小文件較多的大表中讀取文件并寫入新表產(chǎn)生少量的數(shù)據(jù)文件

空值處理:impala將"\n"表示為null 結(jié)合sqoop使用時(shí)注意做相應(yīng)的空字段過濾

使用以下方式進(jìn)行處理:alter table name set tblproperties("serialization.null.format"="null");

Impala可以通過Hive外部表方式和HBase進(jìn)行整合晒旅,步驟如下:

? 步驟1:創(chuàng)建hbase 表,向表中添加數(shù)據(jù)

create 'test_info', 'info'

put 'test_info','1','info:name','zhangsan’

put 'test_info','2','info:name','lisi'

步驟2:創(chuàng)建hive表

CREATE EXTERNAL TABLE test_info(key string,name string )

ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'

STORED by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,info:name")

TBLPROPERTIES

("hbase.table.name" = "test_info");

步驟3:刷新Impala表

invalidate metadata

impala jdbc 訪問:

? 配置:

– impala.driver=org.apache.hive.jdbc.HiveDriver

– impala.url=jdbc:hive2://node2:21050/;auth=noSasl

– impala.username=

– impala.password=

? 盡量使用PreparedStatement執(zhí)行SQL語句:

– 1.性能上PreparedStatement要好于Statement

– 2.Statement存在查詢不出數(shù)據(jù)的情況

性能優(yōu)化:

要點(diǎn):

? 1湘今、SQL優(yōu)化敢朱,使用之前調(diào)用執(zhí)行計(jì)劃

? 2、選擇合適的文件格式進(jìn)行存儲(chǔ)

? 3、避免產(chǎn)生很多小文件(如果有其他程序產(chǎn)生的小文件拴签,可以使用中間表)

? 4孝常、使用合適的分區(qū)技術(shù),根據(jù)分區(qū)粒度測算

? 5蚓哩、使用compute stats進(jìn)行表信息搜集

? 6构灸、網(wǎng)絡(luò)io的優(yōu)化:– a.避免把整個(gè)數(shù)據(jù)發(fā)送到客戶端

– b.盡可能的做條件過濾

– c.使用limit字句

– d.輸出文件時(shí),避免使用美化輸出

? 7岸梨、使用profile輸出底層信息計(jì)劃喜颁,在做相應(yīng)環(huán)境優(yōu)化

? 8、如果是刷新表的新增元數(shù)據(jù)要使用refresh 表名 來刷新曹阔,不要使用impala-shell -r 或? invalidate metadata

? 9半开、如果執(zhí)行SQL的結(jié)果內(nèi)容較多的話可以使用 impala-shell -B 將一些不必要的樣式輸出去掉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赃份,隨后出現(xiàn)的幾起案子寂拆,更是在濱河造成了極大的恐慌,老刑警劉巖抓韩,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纠永,死亡現(xiàn)場離奇詭異,居然都是意外死亡谒拴,警方通過查閱死者的電腦和手機(jī)尝江,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來英上,“玉大人炭序,你說我怎么就攤上這事〔匀眨” “怎么了少态?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長易遣。 經(jīng)常有香客問我彼妻,道長,這世上最難降的妖魔是什么豆茫? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任侨歉,我火速辦了婚禮,結(jié)果婚禮上揩魂,老公的妹妹穿的比我還像新娘幽邓。我一直安慰自己,他們只是感情好火脉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布牵舵。 她就那樣靜靜地躺著柒啤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畸颅。 梳的紋絲不亂的頭發(fā)上担巩,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音没炒,去河邊找鬼涛癌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛送火,可吹牛的內(nèi)容都是我干的拳话。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼种吸,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼弃衍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坚俗,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤笨鸡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后坦冠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哥桥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年辙浑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拟糕。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡判呕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出送滞,到底是詐尸還是另有隱情侠草,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布犁嗅,位于F島的核電站边涕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏褂微。R本人自食惡果不足惜功蜓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宠蚂。 院中可真熱鬧式撼,春花似錦、人聲如沸求厕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至美浦,卻和暖如春弦赖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抵代。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工腾节, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荤牍。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓案腺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親康吵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劈榨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容