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é)果