hive調(diào)優(yōu)參數(shù)要點_第1頁
hive調(diào)優(yōu)參數(shù)要點_第2頁
hive調(diào)優(yōu)參數(shù)要點_第3頁
hive調(diào)優(yōu)參數(shù)要點_第4頁
hive調(diào)優(yōu)參數(shù)要點_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第一部分:Hadoop計算框架的特性什么是數(shù)據(jù)傾斜由于數(shù)據(jù)的不均衡原因, 點。導(dǎo)致數(shù)據(jù)分布不均勻,造成數(shù)據(jù)大量的集中到一點,造成數(shù)據(jù)熱Hadoop框架的特性1) 不怕數(shù)據(jù)大,怕數(shù)據(jù)傾斜2) jobs數(shù)比較多的作業(yè)運行效率相對比較低,比如即使有幾百行的表,如果多次關(guān)聯(lián)多次匯總,產(chǎn)生十幾個jobs,耗時很長。原因是 map reduce作業(yè)初始化的時間是比較長的3) sum,count,max,min等UDAF,不怕數(shù)據(jù)傾斜問題,hadoop在map端的匯總合并優(yōu)化,使數(shù)據(jù)傾斜不成問題4) count(distinet ),在數(shù)據(jù)量大的情況下,效率較低,因為count(distinet)是按gro

2、up by字段分組,按distinct字段排序,一般這種分布方式是很傾斜的。第二部分:優(yōu)化的常用手段優(yōu)化的常用手段1) 解決數(shù)據(jù)傾斜問題2) 減少job數(shù)3) 設(shè)置合理的 map reduce的task數(shù),能有效提升性能。4) 了解數(shù)據(jù)分布,自己動手解決數(shù)據(jù)傾斜問題是個不錯的選擇5) 數(shù)據(jù)量較大的情況下,慎用count(distinct)。6) 對小文件進(jìn)行合并,是行至有效的提高調(diào)度效率的方法。7) 優(yōu)化時把握整體,單個作業(yè)最優(yōu)不如整體最優(yōu)。第三部分:Hive的數(shù)據(jù)類型方面的優(yōu)化優(yōu)化原則按照一定規(guī)則分區(qū)(例如根據(jù)日期)。通過分區(qū),查詢的時候指定分區(qū),會大大減少在無 用數(shù)據(jù)上的掃描,同時也非常方

3、便數(shù)據(jù)清理。合理的設(shè)置Buckets。在一些大數(shù)據(jù)join的情況下,map join有時候會內(nèi)存不夠。如果使 用Bucket Map Join的話,可以只把其中的一個 bucket放到內(nèi)存中,內(nèi)存中原來放不下的內(nèi) 存表就變得可以放下。這需要使用buckets的鍵進(jìn)行join的條件連結(jié),并且需要如下設(shè)置set hive.optimize.bucketmapj oin = true第四部分:Hive的操作方面的優(yōu)化全排序Hive的排序關(guān)鍵字是 SORT BY,它有意區(qū)別于傳統(tǒng)數(shù)據(jù)庫的ORDER BY也是為了強調(diào)兩者的區(qū)別-SORT BY只能在單機范圍內(nèi)排序。怎樣做笛卡爾積當(dāng)Hive設(shè)定為嚴(yán)格模式

4、(hive.mapred.mode=strict)時,不允許在 HQL語句中出現(xiàn)笛卡爾 積,Map Join是的解決辦法。Map Join,顧名思義,會在 Map端完成Join操作。這需要將 Join操作的一個或多個表完 全讀入內(nèi)存 MapJoin的用法是在查詢/子查詢的SELECT 關(guān)鍵字后面添加/*+ MAPJOIN(tablelist) */提示優(yōu)化器轉(zhuǎn)化為MapJoin (目前 Hive的優(yōu)化器不能自動優(yōu)化MapJoin)其中tablelist可以是一個表,或以逗號連接的表的列表。tablelist中的表將會讀入內(nèi)存,應(yīng)該將小表寫在這里在大表和小表做笛卡爾積時,規(guī)避笛卡爾積的方法是,給

5、Join添加一個Join key,原理很簡單:將小表擴充一列join key,并將小表的條目復(fù)制數(shù)倍,joinkey各不相同;將大表擴充一列join key為隨機數(shù)??刂艸ive的Map數(shù)通常情況下,作業(yè)會通過in put的目錄產(chǎn)生一個或者多個map任務(wù)。主要的決定因素有:in put的文件總個數(shù),in put的文件大小,集群設(shè)置的文件塊大小(目前為128M,可在hive中通過set dfs.block.size;命令查看到,該參數(shù)不能自定義修改)。是不是map數(shù)越多越好?答案是否定的。如果一個任務(wù)有很多小文件(遠(yuǎn)遠(yuǎn)小于塊大小128m),則每個小文件也會被當(dāng)做一個塊,用一個map任務(wù)來完成,而

6、一個map任務(wù)啟動和初始化的時間遠(yuǎn)遠(yuǎn)大于邏輯處理的時間,就會造成很大的資源浪費。而且,同時可執(zhí)行的map數(shù)是受限的是不是保證每個map處理接近128m的文件塊,就高枕無憂了?答案也是不一定。 比如有一個127m的文件,正常會用一個 map去完成,但這個文件只有 一個或者兩個小字段,卻有幾千萬的記錄,如果map處理的邏輯比較復(fù)雜,用一個map任務(wù)去做,肯定也比較耗時。針對上面的問題 3和4,我們需要采取兩種方式來解決:即減少 map數(shù)和增加map數(shù); 是不是保證每個 map處理接近128m的文件塊,就高枕無憂了?答案也是不一定。 比如有一個127m的文件,正常會用一個 map去完成,但這個文件只

7、有 一個或者兩個小字段,卻有幾千萬的記錄,如果map處理的邏輯比較復(fù)雜,用一個map任務(wù)去做,肯定也比較耗時。針對上面的問題3和4,我們需要采取兩種方式來解決:即減少map數(shù)和增加map數(shù);舉例:a)假設(shè)in put目錄下有1個文件a,大小為780M,那么hadoop會將該文件a分隔成7 個塊(6個128m的塊和1個12m的塊),從而產(chǎn)生 7個map數(shù)。b)假設(shè)in put目錄下有3個文件a,b,c,大小分別為10m,20m,130m,那么hadoop會分 隔成4個塊(10m,20m,128m,2m),從而產(chǎn)生4個map數(shù)。即,如果文件大于塊大小 (128m), 那么會拆分,如果小于塊大小,則

8、把該文件當(dāng)成一個塊。怎樣決定reducer個數(shù)Hadoop MapReduce程序中,reducer個數(shù)的設(shè)定極大影響執(zhí)行效率,不指定 reducer個數(shù) 的情況下,Hive會猜測確定一個reducer個數(shù),基于以下兩個設(shè)定:參數(shù) 1: hive.exec.reducers.bytes.per.reducer (默認(rèn)為 1G)參數(shù) 2 : hive.exec.reducers.max (默認(rèn)為 999)計算reducer數(shù)的公式:N=min(參數(shù)2,總輸入數(shù)據(jù)量/參數(shù)1)依據(jù)Hadoop的經(jīng)驗,可以將參數(shù)2設(shè)定為0.95*(集群中TaskTracker個數(shù))reduce個數(shù)并不是越多越好。同m

9、ap 樣,啟動和初始化 reduce也會消耗時間和資源;另外,有多少個reduce,就會有多少個輸出文件,如果生成了很多個小文件,那么如果這些小文件作為下一個任務(wù)的輸入,則也會出現(xiàn)小文件過多的問題什么情況下只有一個reduce很多時候你會發(fā)現(xiàn)任務(wù)中不管數(shù)據(jù)量多大,不管你有沒有設(shè)置調(diào)整reduce個數(shù)的參數(shù),任務(wù)中一直都只有一個reduce任務(wù);其實只有一個 reduce任務(wù)的情況,除了數(shù)據(jù)量小于hive.exec.reducers.bytes.per.reducer參數(shù)值的情況外,還有以下原因:a)沒有g(shù)roup by的匯總b)用了 Order by合并 MapReduce 操作Multi-g

10、roup by是Hive的一個非常好的特性,它使得Hive中利用中間結(jié)果變得非常方便FROM log :in sert overwrite table test1 select log.id group by log.idin sert overwrite table test2 select log. name group by log. name上述查詢語句使用了Multi-group by特性連續(xù)group by 了 2次數(shù)據(jù),使用不同的 group bykey。這一特性可以減少一次MapReduce操作。Bucket 與 SamplingBucket是指將數(shù)據(jù)以指定列的值為key進(jìn)行h

11、ash, hash到指定數(shù)目的桶中。這樣就可以支持高效采樣了Sampling可以在全體數(shù)據(jù)上進(jìn)行采樣,這樣效率自然就低,它還是要去訪問所有數(shù)據(jù)。而如果一個表已經(jīng)對某一列制作了bucket,就可以采樣所有桶中指定序號的某個桶,這就減少了訪問量。如下例所示就是采樣了test中32個桶中的第三個桶。SELECT * FROM test 、TABLESAMPLE(BUCKET 3 OUT OF 32);JOIN原則在使用寫有 Join操作的查詢語句時有一條原則:應(yīng)該將條目少的表/子查詢放在 Join操作符的左邊,原因是在Join操作的Reduce階段,位于 Join操作符左邊的表的內(nèi)容會被加載進(jìn)內(nèi)存,

12、將條目少的表放在左邊,可以有效減少發(fā)生OOM錯誤的幾率。Map Joi nJoin操作在 Map階段完成,不再需要Reduce,前提條件是需要的數(shù)據(jù)在Map的過程中可以訪問到例如:INSERT OVERWRITE TABLE pho ne_traficSELECT /*+ MAPJOIN(pho ne_locatio n) */l.pho ne,p.locatio n,l.trafic from pho ne_locatio n pjoin log l on (p.ph on e=l.ph on e);相關(guān)的參數(shù)為:hive.joi n.emit.i nterval = 1000How man

13、y rows in the right-most join opera nd Hive should buffer before emitti ng the join result.hive.mapj oin. size.key = 10000hive.mapj oin .cache .num rows = 10000Group ByMap端部分聚合,并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端進(jìn)行部分聚合,最后在 Reduce端得出最終結(jié)果基于Hash參數(shù)包括:hive.map.aggr = true/是否在 Map端進(jìn)行聚合,默認(rèn)為 Truehive.gr

14、oupby.mapaggr.checkinterval = 100000 / 在 Map 端進(jìn)行聚合操作的條目數(shù)目有數(shù) 據(jù)傾斜的時候進(jìn)行負(fù)載均衡hive.groupby.skew in data = false當(dāng)選項設(shè)定為 true,生成的查詢計劃會有兩個MR Job。第一個 MR Job中,Map的輸出結(jié)果集合會隨機分布到Reduce中,每個Reduce做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的Group By Key有可能被分發(fā)到不同的Reduce中,從而達(dá)到負(fù)載均衡的目的;第二個 MR Job再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照Group By Key分布到 Reduce中(這個過程可以保

15、證相同的Group By Key被分布到同一個Reduce中),最后完成最終的聚合操作。合并小文件文件數(shù)目過多,會給 HDFS帶來壓力,并且會影響處理效率,可以通過合并Map和Reduce的結(jié)果文件來消除這樣的影響:hive.merge.mapfiles = true / 是否和并 Map 輸出文件,默認(rèn)為 Truehive.merge.mapredfiles = false / 是否合并 Reduce 輸出文件,默認(rèn)為 Falsehive.merge.size.per.task = 256*1000*1000/ 合并文件的大小排序優(yōu)化Order by實現(xiàn)全局排序,一個reduce實現(xiàn),效率低

16、Sort by實現(xiàn)部分有序,單個reduce輸出的結(jié)果是有序的,效率高,通常和DISTRIBUTE BY關(guān)鍵字一起使用(DISTRIBUTE BY 關(guān)鍵字 可以指定 map到reduce端的分發(fā)key) CLUSTER BY col1 等價于 DISTRIBUTE BY col1 SORT BY col1使用分區(qū)Hive中的每個分區(qū)都對應(yīng) hdfs上的一個目錄,分區(qū)列也不是表中的一個實際的字段,而 是一個或者多個偽列,在表的數(shù)據(jù)文件中實際上并不保存分區(qū)列的信息與數(shù)據(jù)。Partition關(guān)鍵字中排在前面的為主分區(qū)(只有一個),后面的為副分區(qū)靜態(tài)分區(qū):靜態(tài)分區(qū)在加載數(shù)據(jù)和使用時都需要在sql語句中

17、指定案例:(stat_date='20120625',provi nce='hu nan')動態(tài)分區(qū):使用動態(tài)分區(qū)需要設(shè)置hive.exec.dy namic.partiti on 參數(shù)值為true,默認(rèn)值為false,在默認(rèn)情況下,hive會假設(shè)主分區(qū)時靜態(tài)分區(qū),畐U分區(qū)使用動態(tài)分區(qū);如果想都使用 動態(tài)分區(qū),需要設(shè)置 set hive.exec.dynamic.partition.mode=nostrick,默認(rèn)為 strick案例:(stat_date='20120625',prov in ce)Dist inct 使用Hive支持在grou

18、p by時對同一列進(jìn)行多次 distinct操作,卻不支持在同一個語句中對多個 列進(jìn)行distinct操作。Hql使用自定義的 mapred腳本注意事項:在使用自定義的 mapred腳本時,關(guān)鍵字 MAP REDUCE 是語句 SELECT TRANSFORM (.)的語法轉(zhuǎn)換,并不意味著使用 MAP關(guān)鍵字時會強制產(chǎn)生一個新 的map過程,使用 REDUCE關(guān)鍵字時會產(chǎn)生一個red過程。自定義的mapred腳本可以是hql語句完成更為復(fù)雜的功能,但是性能比hql語句差了一些,應(yīng)該盡量避免使用,如有可能,使用UDTF函數(shù)來替換自定義的mapred腳本回到頂部。UDTFUDTF將單一輸入行轉(zhuǎn)化為多

19、個輸出行,并且在使用UDTF時,select語句中不能包含其他的列,UDTF不支持嵌套,也不支持group by、sort by等語句。如果想避免上述限制,需要使用lateral view語法,案例:select a.timestamp, get_js on_o bject(a.appeve nts, '$.eve ntid'), get_js on_o bject(a.appe nvets, '$.eve n tn ame') from log a;select a.timestamp, b.*from log a lateral view json _tup

20、le(a.appeve nt, 'eve ntid', 'eve ntn ame') b as f1, f2;其中,get_json_object 為 UDF 函數(shù),json_tuple 為 UDTF 函數(shù)。UDTF函數(shù)在某些應(yīng)用場景下可以大大提高h(yuǎn)ql語句的性能,如需要多次解析json或者xml數(shù)據(jù)的應(yīng)用場景。聚合函數(shù)count和sumCount和sum函數(shù)可能是在hql語句中使用的最為頻繁的兩個聚合函數(shù)了,但是在hive中count函數(shù)在計算distinet value時支持加入條件過濾。第五部分JVM重用、并行執(zhí)行、調(diào)整 reducer個數(shù)的用處JVM重用

21、JVM重用是hadoop調(diào)優(yōu)參數(shù)的內(nèi)容, 對hive的性能具有非常大的影響,特別是對于很難避免小文件的場景或者task特別多的場景,這類場景大多數(shù)執(zhí)行時間都很短。hadoop默認(rèn)配置是使用派生 JVM來執(zhí)行map和reduce任務(wù)的,這是jvm的啟動過程可能會造成相當(dāng)大 的開銷,尤其是執(zhí)行的job包含有成千上萬個task任務(wù)的情況。JVM重用可以使得JVM實例在同一個JOB中重新使用N次,N的值可以在Hadoop的 mapre-site.xml文件中進(jìn)行設(shè)置mapred.job.reuse.jvm. nu m.tasks也可在hive的執(zhí)行設(shè)置:set mapred.job.reuse.jvm

22、 .nu m.tasks=10;JVM的一個缺點是,開啟JVM重用將會一直占用使用到的task插槽,以便進(jìn)行重用,直到任務(wù)完成后才能釋放。如果某個"不平衡“的job中有幾個reduce task執(zhí)行的時間要比其他reduce task消耗的時間多得多的話,那么保留的插槽就會一直空閑著卻無法被其他的 job使用,直到所有的task都結(jié)束了才會釋放。并行執(zhí)行并行執(zhí)行,意思是同步執(zhí)行 hive的多個階段,hive在執(zhí)行過程,將一個查詢轉(zhuǎn)化成一個 或者多個階段。某個特定的job可能包含眾多的階段,而這些階段可能并非完全相互依賴的, 也就是說可以并行執(zhí)行的,這樣可能使得整個job的執(zhí)行時間縮短

23、hive 執(zhí)行開啟:set hive.exec.parallel=true調(diào)整reducer個數(shù)設(shè)置 hive.exec.reducers.bytes.per.reducer (默認(rèn)為 1GB),受 hive.exec.reducers.max (默認(rèn)為999)影響:mapred.reduce.tasks = min (參數(shù)2,總輸入數(shù)據(jù)量/參數(shù)1 )三個優(yōu)化的場景采用一個數(shù)據(jù)源多份處理的SQL來執(zhí)行:FROM TABLE1INSERT OVERWRITE LOCAL DIRECTORY 20140303, col1, col2, 2160701, COUNT(DISTINCT col3 &g

24、t;= 20140201 GROUP BY col1, col2INSERT OVERWRITE LOCAL DIRECTORY 20140302, col1, col2, 2160701, COUNT(DISTINCT col3 >= 20140131 GROUP BY col1, col2INSERT OVERWRITE LOCAL DIRECTORY 20140301, col1, col2, 2160701, COUNT(DISTINCT col3 >= 20140130 GROUP BY col1, col2INSERT OVERWRITE LOCAL DIRECTORY

25、 20140228, col1, col2, 2160701, COUNT(DISTINCT col3 >= 20140129 GROUP BY col1, col2INSERT OVERWRITE LOCAL DIRECTORY 20140227, col1, col2, 2160701, COUNT(DISTINCT col3 >= 20140128 GROUP BY col1, col27data/data_table/data_table1.txt' SELECT col) WHERE col3 <= 20140303 AND7data/data_table/

26、data_table2.txt' SELECT col) WHERE col3 <= 20140302 AND7data/data_table/data_table3.txt' SELECT col) WHERE col3 <= 20140301 AND7data/data_table/data_table4.txt' SELECT col) WHERE col3 <= 20140228 AND7data/data_table/data_table5.txt' SELECT col) WHERE col3 <= 20140227 AND7

27、data/data_table/data_table6.txt' SELECTcol) WHERE col3 <= 20140226 ANDINSERT OVERWRITE LOCAL DIRECTORY 20140226, col1, col2, 2160701, COUNT(DISTINCT col3 >= 20140127 GROUP BY col1, col2省略 沒設(shè)置前的,執(zhí)行時間是450s設(shè)置參數(shù):set mapred.job.reuse.jvm. nu m.tasks=20set hive.exec.reducers.bytes.per.reducer=15

28、0000000set hive.exec.parallel=true;執(zhí)行時間縮短到273s ,合理利用一個參數(shù)調(diào)整,可以達(dá)到部分調(diào)優(yōu)第六部分Hive的階段進(jìn)展Hive的基礎(chǔ)架構(gòu)基本組成1) 用戶接口主要有三個:CLI,Client和WUI。其中最常用的是 CLI,Cli啟動的時候,會同時啟動一個 Hive副本。Client是Hive的客戶端,用戶連接至 Hive Server。在啟動Client模式的時候,需要指出Hive Server所在節(jié)點,并且在該節(jié)點啟動 Hive Server。 WUI是通過瀏覽器訪問 Hive。2) Hive將元數(shù)據(jù)存儲在數(shù)據(jù)庫中,如mysql、derby。Hiv

29、e中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。3)解釋器、編譯器、優(yōu)化器完成HQL查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,并在隨后有 MapReduce調(diào)用執(zhí)行。4)Hive的數(shù)據(jù)存儲在 HDFS中,大部分的查詢、計算由Map Reduce完成(包含*的查詢,比如 select * from tbl不會生成 MapRedcue任務(wù))。5)Hive將元數(shù)據(jù)存儲在 RDBMS中1. 各組件的基本功能1)用戶接口主要有三個:CLI,JDBC/ODBC 和 WebUI2)CLI,即Shell命令行3)

30、JDBC/ODBC 是 Hive的JAVA,與使用傳統(tǒng)數(shù)據(jù)庫JDBC的方式類似4)WebGUI是通過瀏覽器訪問Hive5)Hive將元數(shù)據(jù)存儲在數(shù)據(jù)庫中,目前只支持mysql、derby,下一版本會支持更多的數(shù)據(jù)庫。Hive中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是 否為外部表等),表的數(shù)據(jù)所在目錄等6)解釋器、編譯器、優(yōu)化器完成HQL查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,并在隨后有MapReduce調(diào)用執(zhí)行7)Hive的數(shù)據(jù)存儲在 HDFS中,大部分的查詢由MapReduce完成(包含*的查詢,比如 select * fr

31、om table 不會生成 MapRedcue 任務(wù))。2. Metastore1)Metastore是系統(tǒng)目錄(catalog)用于保存Hive中所存儲的表的元數(shù)據(jù)(metadata)信息2)Metastore是Hive被用作傳統(tǒng)數(shù)據(jù)庫解決方案(如 oracle和db2 )時區(qū)別其它類似 系統(tǒng)的一個特征3)Metastore包含如下的部分:Database是表(table)的名字空間。默認(rèn)的數(shù)據(jù)庫(database)名為default '。Table表(table)的原數(shù)據(jù)包含信息有:列(list of colum ns )和它們的類型(types), 擁有者(owner),存儲空間

32、(storage)和SerDei信息。Partition每個分區(qū)(partition )都有自己的列(columns) , SerDe和存儲空間(storage) o 這一特征將被用來支持 Hive中的模式演變(schema evolution )。3. Compiler1)Driver調(diào)用編譯器(compiler)處理HiveQL字串,這些字串可能是一條 DDL、DML 或查詢語句2)編譯器將字符串轉(zhuǎn)化為策略(plan)3)策略僅由元數(shù)據(jù)操作和HDFS操作組成,元數(shù)據(jù)操作只包含DDL語句,HDFS操作只包含LOAD語句4)對插入和查詢而言,策略由map-reduce任務(wù)中的具有方向的非循環(huán)圖

33、(directedacyclic graph , DAG ) 組成Hive的數(shù)據(jù)元數(shù)據(jù)(表相關(guān)信息)存在關(guān)系數(shù)據(jù)庫中。為什么要存在 RDBMS中,獲取元數(shù)據(jù)信息需要很低的延時,這在hdfs上是無法滿足。分析HiveSQL之后生成的Map Reduce任務(wù)在運行的時候如果需要訪問元數(shù)據(jù)信息時,它并 不會直接去訪問 MetaStore。那么,他們是如何獲得需要的元數(shù)據(jù)信息的呢?原來,當(dāng)將生成的物理計劃序列化到 plan.xml的時候,已經(jīng)將相應(yīng)的元數(shù)據(jù)信息保存到了plan.xml中。而pla n.xml文件之后會被放入 Hadoop的分布式緩存中,所以Map Reduce任務(wù)就可以從分布 式緩存中

34、獲得需要的元數(shù)據(jù)信息。數(shù)據(jù)存在hdfs中。Hive沒有專門的數(shù)據(jù)存儲格式, 也沒有為數(shù)據(jù)建立索引, 用戶可以非常自由的組織 Hive 中的表,只需要在創(chuàng)建表的時候告訴Hive數(shù)據(jù)中的列分隔符和行分隔符,Hive就可以解析數(shù)據(jù)。第一,不加外部鏈接創(chuàng)建的表,數(shù)據(jù)存儲在 hive-site.xml配置的 $hive.metastore.warehouse.dir 指定的數(shù)據(jù)倉庫的目錄下;數(shù)據(jù)需要load。例子:<property><n ame>hive.metastore.warehouse.dir</name<value>/user/hive/wareho

35、use</value><descripti on> locatio n of default database for the warehouse</descripti on></property>第二,加外部鏈接穿件的表,數(shù)據(jù)存在創(chuàng)建表時指定的hdfs路徑下。數(shù)據(jù)的存儲關(guān)系Partition對應(yīng)于數(shù)據(jù)庫中的Partition列的密集索引,但是 Hive中Partition的組織方式和數(shù)據(jù)庫中的很不相同。在Hive中,表中的一個 Partition對應(yīng)于表下的一個目錄,所有的Partition的數(shù)據(jù)都存儲在對應(yīng)的目錄中。例如:pvs表中包含ds和

36、city 兩個 Partition ,則 對應(yīng)于 ds = 20090801, ctry = US 的 HDFS 子目 錄為: /wh/pvs/ds=20090801/ctry=US ;對應(yīng)于 ds = 20090801, ctry = CA 的 HDFS 子目錄為; /wh/pvs/ds=20090801/ctry=CA 。Buckets對指定列計算 hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個 Bucket對 應(yīng)一個文件。將user列分散至 32個bucket,首先對 user列的值計算 hash,對應(yīng)hash值 為 0 的 HDFS 目錄為:/wh/pvs/ds=200908

37、01/ctry=US/part-00000 ; hash 值為 20 的 HDFS 目錄為:/wh/pvs/ds=20090801/ctry=US/part-00020 這些信息屬于元數(shù)據(jù)信息,可以去 mysql 中查看。Hive的執(zhí)行原理HDFSHiveSQL的數(shù)據(jù)類型Primitive types:TINYINTSMALLINTINTBIGINTBOOLEANFLOATDOUBLESTRINGBINARY(Note: Only available starting with Hive 0.8.0) TIMESTAMP(Note: Only available starti ng with

38、Hive 0.8.0)Complex types:arrays: ARRAY<data_type>maps: MAP<primitive_type, data_type>structs: STRUCT<col_name : data_type COMMENT col_comme nt, .> un io n: UNIONTYPE<data_type, data_type, .>符合類型的應(yīng)用:CREATE TABLE un ion_test(foo UNIONTYPE<int, double, array<string>, st

39、ruct<a:int,b:string>>);SELECT foo FROM unio n_test;0:11202:"three","fouL3:"a":5,"b":"five"2:"six","seve n"3:"a":8,"b":"eight"0:91:10.0Hive的數(shù)據(jù)模型介紹1. Hive數(shù)據(jù)庫類似傳統(tǒng)數(shù)據(jù)庫的DataBase,在第三方數(shù)據(jù)庫里實際是一張表。簡單示例命令行hi

40、ve > create database test_database;2內(nèi)部表Hive的內(nèi)部表與數(shù)據(jù)庫中的 Table在概念上是類似。每一個Table在Hive中都有一個相應(yīng) 的目錄存儲數(shù)據(jù)。例如一個表pvs,它在HDFS中的路徑為/wh/pvs,其中wh是在hive-site.xml 中由$hive.metastore.warehouse.dir 指定的數(shù)據(jù)倉庫的目錄,所有的 Table數(shù)據(jù)(不包括 External Table)都保存在這個目錄中。刪除表時,元數(shù)據(jù)與數(shù)據(jù)都會被刪除。內(nèi)部表簡單示例:創(chuàng)建數(shù)據(jù)文件:test_i nn er_table.txt倉 U建表: create t

41、able test_i nn er_table (key stri ng)加載數(shù)據(jù):LOAD DA TA LOCAL INPATH filepath ' INTO TABLE test_inner_table查看數(shù)據(jù): select * from test_ inn er_table;select coun t(*) from test_i nn er_table刪除表: drop table test_ inn er_table3. 外部表外部表指向已經(jīng)在 HDFS中存在的數(shù)據(jù),可以創(chuàng)建Partition。它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的,而實際數(shù)據(jù)的存儲則有較大的差異。內(nèi)部表的創(chuàng)

42、建過程和數(shù)據(jù)加載過程這兩個過程可以分別獨立完成,也可以在同一個語句中完成,在加載數(shù)據(jù)的過程中,實際數(shù)據(jù)會被移動到數(shù)據(jù)倉庫目錄中;之后對數(shù)據(jù)對訪問將會直接在數(shù)據(jù)倉庫目錄中完成。刪除表時, 表中的數(shù)據(jù)和元數(shù)據(jù)將會被同時刪除。而外部表只有一個過程,加載數(shù)據(jù)和創(chuàng)建表同時完成(CREATE EXTERNAL TABLE LOCATION ),實際數(shù)據(jù)是存儲在 LOCATION 后面指 定的HDFS路徑中,并不會移動到數(shù)據(jù)倉庫目錄中。當(dāng)刪除一個External Table時,僅刪除該鏈接。外部表簡單示例:創(chuàng)建數(shù)據(jù)文件:test_external_table.txt倉 U建表: create exter n

43、al table test_external_table (key stri ng)加載數(shù)據(jù):LOAD DA TA INPATH filepath ' INTO TABLE test_inner_table查看數(shù)據(jù): select * from test_external_table;?select coun t(*) from test_external_table刪除表: drop table test_external_table4. 分區(qū)Partition對應(yīng)于數(shù)據(jù)庫中的 Partition列的密集索引,但是Hive中Partition的組織方式和 數(shù)據(jù)庫中的很不相同。在Hiv

44、e中,表中的一個 Partition對應(yīng)于表下的一個目錄,所有的Partition的數(shù)據(jù)都存儲在對應(yīng)的目錄中。例如pvs表中包含ds和city兩個Partition,則對應(yīng)于 ds = 20090801, ctry = US 的 HDFS 子目錄為 /wh/pvs/ds=20090801/ctry=US ;對應(yīng)于 ds = 20090801, ctry = CA 的 HDFS 子目錄為 /wh/pvs/ds=20090801/ctry=CA。分區(qū)表簡單示例:創(chuàng)建數(shù)據(jù)文件:test_partition_table.txt倉 U建表: create table test_partiti on _t

45、able (key stri ng) partiti oned by (dt stri ng)加載數(shù)據(jù):LOAD DA TA INPATH filepath ' INTO TABLE test_partition_table partition (dt= ' 2006')查看數(shù)據(jù): select * from test_partitio n_table;select coun t(*) from test_partiti on _table刪除表:drop table test_partiti on _table5. 桶Buckets是將表的列通過Hash算法進(jìn)一步分解成不同的文件存儲。它對指定列計算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個 Bucket對應(yīng)一個文件。例如將user列分散至32個bucket,首先對user列的值計算 hash,對應(yīng)hash值為0的HDFS目錄為 /wh/pvs/ds=20090801/ctry=US/part-00000; hash 值為 20 的 HDFS 目錄為/wh/pvs/ds=20090801/ctry=US/part-00020。如果想應(yīng)用很多的M

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論