Hive總結(jié)

Hive總結(jié)

一颅拦、Hive架構(gòu)

1.架構(gòu)圖


2.Hive架構(gòu)解析

1)用戶接口

CLI:cli即shell命令。CLI最常用CLI啟動(dòng)的時(shí)候會(huì)同時(shí)啟動(dòng) 一個(gè)Hive 副本

Client: Client是Hive的客戶端,用戶連接HiveServer际度,并指出Hive Server 所在的節(jié)點(diǎn)以及在該節(jié)點(diǎn)啟動(dòng)它

WUI:WUI是通過瀏覽器啟動(dòng)Hive

2)元數(shù)據(jù)

Hive將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫中,如mysql、derby届氢。Hive的元數(shù)據(jù)信息包 括,表的名字覆旭、表的列退子、分區(qū)機(jī)器及其屬性岖妄、表的屬性、表的目錄等


3)Driver

解釋器寂祥、編譯器荐虐、優(yōu)化器完成HQL的查詢語句從詞法分析、語法分析丸凭、 編譯福扬、優(yōu)化以及查詢計(jì)劃的生成。生成的計(jì)劃存儲(chǔ)在HDFS中惜犀,并在MR 中調(diào)用執(zhí)行铛碑,Hive的數(shù)據(jù)存儲(chǔ)在HDFS中,大部分的查詢計(jì)算由MR完成

4)注意事項(xiàng)

Hive會(huì)不會(huì)轉(zhuǎn)換為MR取決于是否用了聚合函數(shù)

二虽界、Hive數(shù)據(jù)傾斜問題優(yōu)化

1.現(xiàn)象

當(dāng)Hive放生數(shù)據(jù)傾斜的時(shí)候汽烦,我們?cè)谑褂肏QL運(yùn)行mr的時(shí)候可以發(fā)現(xiàn),map是100%莉御,而reduce卡在99%

2.當(dāng)Hive發(fā)生數(shù)據(jù)傾斜的時(shí)候我應(yīng)該怎么辦呢撇吞?

第一種方案,數(shù)據(jù)傾斜五分就是key的數(shù)據(jù)量非常不均勻礁叔,我們可以開啟map聚合的參數(shù)(hive.map.aggr=ture)梢夯,開啟之后會(huì)把數(shù)據(jù)現(xiàn)在map端進(jìn)行聚合,當(dāng)reduce端聚合的時(shí)候就只需要聚合map端聚合完的參數(shù)就可以了

第二種是當(dāng)大表和小表進(jìn)行JOIN的時(shí)候晴圾,也可能導(dǎo)致數(shù)據(jù)傾斜颂砸。為了解決這個(gè)問題,考慮使用到mapjoin死姚,mapjoin會(huì)把小表全部讀入內(nèi)存中人乓,在map階段直接拿另外一個(gè)表的數(shù)據(jù)和在內(nèi)存中表的數(shù)據(jù)進(jìn)行匹配,由于mapjion是在map端進(jìn)行了join操作都毒,省去了reduce的運(yùn)行色罚,所以效率會(huì)快很多

第三種是當(dāng)大表和大表join的時(shí)候發(fā)生數(shù)據(jù)傾斜,具體操作室建立一個(gè)numbers表账劲,其值只有一列int 行戳护,比如從1到10(具體值可根據(jù)傾斜程度確定),然后放大B表10倍瀑焦,再取模join




三腌且、分區(qū)

1.Hive靜態(tài)分區(qū)

就是在不開啟動(dòng)態(tài)分區(qū)的條件下都是靜態(tài)分區(qū),使用方式就是HQL


[if !supportLists]2.?[endif]Hive動(dòng)態(tài)分區(qū)

1)參數(shù)設(shè)置

· 開啟動(dòng)態(tài)分區(qū)

啟用動(dòng)態(tài)分區(qū)功能hive> set hive.exec.dynamic.partition=true;

注:hive2.x該參數(shù)默認(rèn)為true榛瓮,1.x為false

· 模式設(shè)置(嚴(yán)選模式/非嚴(yán)選模式)


設(shè)置這個(gè)參數(shù)為nostrict

hive> set hive.exec.dynimac.partiton.mode=nostrict

?默認(rèn)情況下是strict

2)動(dòng)態(tài)分區(qū)的相關(guān)參數(shù)

hive.exec.max.dynimac.partition.pernode這個(gè)參數(shù)表示每個(gè)mr執(zhí)行的節(jié)點(diǎn)上铺董,能創(chuàng)建的最大分區(qū)數(shù)量(默認(rèn)100)

hive.exec.max.dynimac.partition這個(gè)參數(shù)表示所有mr執(zhí)行的節(jié)點(diǎn)上,能創(chuàng)建的最大分區(qū)數(shù)量(默認(rèn)1000)

hive.exec.max.creat.files這個(gè)參數(shù)代表所有mr job能創(chuàng)建文件的最大數(shù)量

3)動(dòng)態(tài)分區(qū)加載數(shù)據(jù)的方法

第一步:創(chuàng)建原數(shù)據(jù)表

第二部:load data加載數(shù)據(jù)到原數(shù)據(jù)表

第三部:使用from into table inset into table select禀晓。精续。坝锰。。加載數(shù)據(jù)

4)靜態(tài)分區(qū)與動(dòng)態(tài)分區(qū)的區(qū)別

靜態(tài)分區(qū)是手動(dòng)指定分區(qū)的重付,動(dòng)態(tài)分區(qū)是根據(jù)數(shù)據(jù)來判斷

5)靜態(tài)分區(qū)結(jié)合動(dòng)態(tài)分區(qū)使用

動(dòng)靜結(jié)合使用的話顷级,靜態(tài)分區(qū)值必須在動(dòng)態(tài)分區(qū)值的前面

四、Hive SQL

1.外部表和內(nèi)部表

區(qū)別在于刪除的時(shí)候只刪除元數(shù)據(jù)确垫,而內(nèi)部表刪除的時(shí)候連數(shù)據(jù)都給刪除了

2.Hive DDL

定義:Hive的數(shù)據(jù)定義語言 (LanguageManual DDL)

1)建表語句

· 創(chuàng)建普通的表: create table abc( id int ) ?row format delimited fields terminated by ',' stored as textFile

· 創(chuàng)建帶有分區(qū)的表:create table abc( id int ) ?partitioned by (dt String) row format delimited fields terminated by ','

· 創(chuàng)建外表:create external table abc( id int ) ?row format delimited fields terminated by ',' location'/home/hive/text.text';


3.Hive DML

定義:Hive數(shù)據(jù)操作語言(LanguageManual DML)

1)操作語句

HDFS上導(dǎo)入數(shù)據(jù):load data inpath 'filePath' into table table_name;

· 從別的表中導(dǎo)入:insert into table table_name1 [patition(dt '.....', value)] select id,name from table_name2

· 多重?cái)?shù)據(jù)插入:from table_name1 t1弓颈,table_name2 t2 insert overwrite table table_name3 [patition(col1=val1,col2=val2)] select t1.id, t2.id, .....................;



五、Hive優(yōu)化

1.優(yōu)化一:本地模式

· 開啟本地模式hive> set hive.exec.mode.local.auto=true

· 需要注意的是:hive.exec.mode.local.auto.inputbytes.max這個(gè)參數(shù)默認(rèn) 是128M森爽,這個(gè)值表示了當(dāng)加載文件的值大于這個(gè)值的時(shí)候,該配置仍 會(huì)以集 群來運(yùn)行嚣镜;默認(rèn)就是集群運(yùn)行的爬迟;當(dāng)項(xiàng)目上線的時(shí)候開啟; 使 用本地模式 的話菊匿,小數(shù)據(jù)小表可以避免提交時(shí)間的延遲

2.優(yōu)化二:并行計(jì)算

· 開啟并行計(jì)算hive> set hive.exec.parallel=true

· 相關(guān)參數(shù)hive.exec.parallel.thread.number(一次sql計(jì)算中允許并執(zhí)行的 job 數(shù)量)

· 需要注意的是付呕,并行計(jì)算會(huì)加大集群的壓力

3.優(yōu)化三:嚴(yán)格模式

· 開啟嚴(yán)格模式hive> set hive.mapred.mode = strict

· 主要是防止一群sql查詢將集群壓力大大增加

· 同時(shí)它也有一些限制:1、對(duì)于分區(qū)表跌捆,必須添加where對(duì)于分區(qū)字段的 條件過濾1徽职、orderby語句必須包含limit輸出限制 ?3、限制執(zhí)行笛卡爾積 查詢

4.優(yōu)化四:排序

· order by對(duì)于查詢結(jié)果做全排序佩厚,只允許有一個(gè)reduce處理

· 需要注意的是:當(dāng)數(shù)據(jù)過大的時(shí)候謹(jǐn)慎使用姆钉,在嚴(yán)選模式下需要結(jié)合limit 來使用

· sort by是對(duì)單個(gè)reduce的數(shù)據(jù)進(jìn)行排序

· 只會(huì)在每個(gè)reducer中對(duì)數(shù)據(jù)進(jìn)行排序,也就是執(zhí)行局部排序過程抄瓦,只 能保證每個(gè)reducer的輸出數(shù)據(jù)都是有序的(但并非全局有序)

· distribut by是分區(qū)排序經(jīng)常結(jié)合sort by一起使用

· cluster by相當(dāng)于distribut br + sort by

· cluster by默認(rèn)是倒序排序潮瓶,不能用asc和desc來指定排序規(guī)則;可以通 過distribute by clumn sort by clumn asc|desc方式來指定排序方式

5.優(yōu)化五:JOIN

· join時(shí)將小表放在join的左邊

· mapjoin:在map端進(jìn)行join(可以省略shuffle和reduce提高性能)

1)實(shí)現(xiàn)方式1:mapJoin標(biāo)記

sql方式钙姊,在sql語句中添加mapjoin標(biāo)記(mapjoin hint) ???????select ?/*+mapjoin(smalltable)*/smalltable.key 毯辅,bigTable.value from smallTable join bigTable on smallTable.key=bigTable.key

2)實(shí)現(xiàn)方式2:開啟自動(dòng)的mapjoin

參數(shù)配置: 自動(dòng)對(duì)小表進(jìn)行mapjoin

hive> set hive.auto.convert.join=true

相關(guān)參數(shù)

· hive.mapjoin.smalltable.filesize這個(gè)值是大表和小表的判定閥值,小于這 個(gè)值就會(huì)被放入內(nèi)存

· hive.ignore.mapjoin.hint默認(rèn)為true煞额,是夠忽略mapjoin hint

· hive.aotu.caonvert.join.noconditionaltask默認(rèn)為true思恐,將普通的join轉(zhuǎn) 換為mapjoin的時(shí)候是否將多個(gè)mapjoin轉(zhuǎn)為一個(gè)mapjoin

· hive.aotu.caonvert.join.noconditionaltask.size將多個(gè)mapjoin轉(zhuǎn)為一個(gè) mapjoin的最大值

6.優(yōu)化六:聚合

開啟map聚合 ??hive> set hive.map.aggr=true

相關(guān)參數(shù)

· hive.groupby.mapaggr.checkinterval: map端group by執(zhí)行聚合時(shí)處理的多少行數(shù)據(jù)(默認(rèn):100000)

· hive.map.aggr.hash.min.reduction: 進(jìn)行聚合的最小比例(預(yù)先對(duì)100000條數(shù)據(jù)做聚合,若聚合之后的數(shù)據(jù)量 /100000的值大于該配置0.5膊毁,則不會(huì)聚合)

· hive.map.aggr.hash.percentmemory:map端聚合使用的內(nèi)存的最大值 ????????????????????????????????????????????????????

· hive.map.aggr.hash.force.flush.memory.threshold: map端做聚合操作是hash表的最大可用內(nèi)容胀莹,大于該值則會(huì)觸發(fā)flush

· hive.groupby.skewindata:是否對(duì)GroupBy產(chǎn)生的數(shù)據(jù)傾斜做優(yōu)化,默認(rèn)為false ???????????????????????

7.優(yōu)化七:控制Hive中map和reduce的數(shù)量

Map數(shù)量相關(guān)的參數(shù)

· mapred.max.split.size:一個(gè)split的最大值婚温,即每個(gè)map處理文件的最大值

· mapred.min.split.size.per.node:一個(gè)節(jié)點(diǎn)上split的最小值 ??????????????????????????

· mapred.min.split.size.per.rack:一個(gè)機(jī)架上split的最小值 ????????????????????

Reduce數(shù)量相關(guān)的參數(shù)

· mapred.reduce.tasks: 強(qiáng)制指定reduce任務(wù)的數(shù)量 ??????????

· hive.exec.reducers.bytes.per.reducer ?? 每個(gè)reduce任務(wù)處理的數(shù)據(jù)量

· hive.exec.reducers.max ?? 每個(gè)任務(wù)最大的reduce數(shù) [Map數(shù)量 >= Reduce數(shù)量 ]

8.優(yōu)化八:JVM的重用

適用場(chǎng)景: 1嗜逻、小文件個(gè)數(shù)過多 2、task個(gè)數(shù)過多

· 通過set mapred.job.reuse.jvm.num.tasks=n;來設(shè)置(n為task插槽個(gè)數(shù))

缺點(diǎn):設(shè)置開啟之后缭召,task插槽會(huì)一直占用資源栈顷,不論是否有task運(yùn)行逆日,直 到所有的task即整個(gè)job全部執(zhí)行完成時(shí),才會(huì)釋放所有的task插槽資源萄凤!

六室抽、Hive函數(shù)

1.函數(shù)自定義

1)UDF(常用) 一進(jìn)一出

http://blog.csdn.net/duan19056/article/details/17917253

<1>UDF函數(shù)可以直接應(yīng)用于 select 語句,對(duì)查詢結(jié)構(gòu)做格式化處理后靡努,再 輸出內(nèi)容坪圾。

<2>編寫UDF函數(shù)的時(shí)候需要注意一下幾點(diǎn):

?? a)自定義 UDF 需要繼承 org.apache.hadoop.hive.ql.UDF。

?? b)需要實(shí)現(xiàn) evaluate 函數(shù)惑朦,evaluate 函數(shù)支持重載兽泄。

<3>步驟

? a)把程序打包放到目標(biāo)機(jī)器上去;

? b)進(jìn)入 hive 客戶端漾月,添加 jar 包:hive>add jar /jar/udf_test.jar;(清除緩存 時(shí)記得刪除jar包delete jar /*)

? c)創(chuàng)建臨時(shí)函數(shù):hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';

d)查詢 HQL 語句:

SELECT ?add_example(8, ?9) ?FROM ?scores;

SELECT ?add_example(scores.math, ?scores.art) ?FROM ?scores;

SELECT ?add_example(6, ?7, ?8, ?6.8) ?FROM ?scores;

?? e)銷毀臨時(shí)函數(shù):hive> ?DROP ?TEMPORARY ?FUNCTION ?add_example;

2)UDAF聚集函數(shù)病梢,多進(jìn)一出

多行進(jìn)一行出,如sum()梁肿、min()蜓陌,用在 group ?by 時(shí)

<1>必須繼承org.apache.hadoop.hive.ql.exec.UDAF(函數(shù)類繼承)

org.apache.hadoop.hive.ql.exec.UDAFEvaluator(內(nèi)部類 Eval uator 實(shí)現(xiàn) UDAFEvaluator接口)

<2>Evaluator需要實(shí)現(xiàn) init、iterate吩蔑、terminatePartial钮热、merge、t erminate 這 幾個(gè)函數(shù)

???· init():類似于構(gòu)造函數(shù)烛芬,用于 UDAF 的初始化

???· iterate():接收傳入的參數(shù)隧期,并進(jìn)行內(nèi)部的輪轉(zhuǎn),返回 boolean

???· terminatePartial():無參數(shù)赘娄,其為 iterate 函數(shù)輪轉(zhuǎn)結(jié)束后厌秒,返回輪轉(zhuǎn)數(shù)據(jù), 類似于hadoop的 Combinermerge():接收 terminatePartial的返回結(jié)果擅憔, 進(jìn)行數(shù)據(jù)merge操作鸵闪,其返回類型為 boolean

·terminate():返回最終的聚集函數(shù)結(jié)果

3)UDTF一進(jìn)多出

一進(jìn)多出暑诸,如lateralview ?explore()

使用方式:在HIVE會(huì)話中add自定義函數(shù)的jar 文件蚌讼,然后創(chuàng)建 function 繼 而使用函數(shù);這些函數(shù)都是針對(duì)單元格值的个榕,并不是針對(duì)行的篡石。

七、Hive數(shù)據(jù)儲(chǔ)存

Hive沒有專門的存儲(chǔ)結(jié)構(gòu)西采,數(shù)據(jù)表凰萨,視圖,元數(shù)據(jù)等等都可以;而且也沒有專門的數(shù)據(jù)存儲(chǔ)格式胖眷,textFile武通、RCFile都可以的;

Hive只需要在創(chuàng)建表的時(shí)候告訴Hive數(shù)據(jù)中的列分隔符和行分隔符珊搀,Hive就可以解析數(shù)據(jù)冶忱。

那么分割符都有那些呢,默認(rèn)的話是列分隔符“ctrl+A”

默認(rèn)行分隔符是“/n”

八境析、Hive表

1.Hive表常用的存儲(chǔ)格式

textfile 默認(rèn)格式行存儲(chǔ)

sequencefile 二進(jìn)制文件行存儲(chǔ)

rcfile ? 按行分塊按列存儲(chǔ)

orc按行分塊 按列存儲(chǔ)

2.Hive索引(了解)

一個(gè)表上創(chuàng)建索引創(chuàng)建一個(gè)索引使用給定的列表的列作為鍵

3.Hive工作原理

首先用戶先將任務(wù)交給Diver

接著編譯器獲得這個(gè)用戶的plan囚枪,并根據(jù)這個(gè)用戶的任務(wù)去metaStore獲取需要的Hive元數(shù)據(jù)信息

然后進(jìn)行對(duì)任務(wù)的編譯,將HQL先后轉(zhuǎn)換為抽象語法樹劳淆、查詢塊链沼、邏輯計(jì)劃、最后轉(zhuǎn)為物理計(jì)劃(mapreduce)沛鸵,最終選擇最優(yōu)方案提交給Diver

Diver將這個(gè)最優(yōu)方案轉(zhuǎn)交給excutionengion執(zhí)行括勺,將獲得的元數(shù)據(jù)信息交給jobTracker或者sourceManager執(zhí)行該任務(wù)

最終這個(gè)任務(wù)會(huì)直接讀取HDFS中的文件進(jìn)行操作,取得并返回結(jié)果

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谒臼,一起剝皮案震驚了整個(gè)濱河市朝刊,隨后出現(xiàn)的幾起案子耀里,更是在濱河造成了極大的恐慌蜈缤,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冯挎,死亡現(xiàn)場(chǎng)離奇詭異底哥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)房官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門趾徽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翰守,你說我怎么就攤上這事孵奶。” “怎么了蜡峰?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵了袁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我湿颅,道長(zhǎng)载绿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任油航,我火速辦了婚禮崭庸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己怕享,他們只是感情好执赡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著熬粗,像睡著了一般搀玖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上驻呐,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天灌诅,我揣著相機(jī)與錄音,去河邊找鬼含末。 笑死猜拾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佣盒。 我是一名探鬼主播挎袜,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼肥惭!你這毒婦竟也來了盯仪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蜜葱,失蹤者是張志新(化名)和其女友劉穎全景,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牵囤,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爸黄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揭鳞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕贵。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖野崇,靈堂內(nèi)的尸體忽然破棺而出称开,到底是詐尸還是另有隱情,我是刑警寧澤乓梨,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布鳖轰,位于F島的核電站,受9級(jí)特大地震影響督禽,放射性物質(zhì)發(fā)生泄漏脆霎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一狈惫、第九天 我趴在偏房一處隱蔽的房頂上張望睛蛛。 院中可真熱鬧鹦马,春花似錦、人聲如沸忆肾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽客冈。三九已至旭从,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間场仲,已是汗流浹背和悦。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渠缕,地道東北人鸽素。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像亦鳞,于是被迫代替她去往敵國和親馍忽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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