8 Hive Shell操作
創(chuàng)新互聯(lián)公司主要從事成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)青龍,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
8.1 Hive bin下腳本介紹
8.2 Hive Shell 基本操作
1、Hive 命令行
hive [-hiveconf x=y]* [<-ifilename>]* [<-f filename>|<-e query-string>] [-S]
-i 從文件初始化HQL
-e 從命令行執(zhí)行指定的HQL
-f 執(zhí)行HQL腳本
-v 輸出執(zhí)行的HQL語句到控制臺(tái)
-p <port> connect to HiveServer on port number -hiveconf x=y Use this to set hive/hadoop configurationvariables.
Hive 命令行示例
從命令行執(zhí)行指定的sql語句
$HIVE_HOME/bin/hive -e 'select a.colfrom tab1 a'
以指定的hive環(huán)境變量執(zhí)行指定的sql語句
$HIVE_HOME/bin/hive -e 'select a.colfrom tab1 a' -hiveconf hive.exec.scratchdir=/home/my/hive_scratch -hiveconfmapred.reduce.tasks=32
以沉默模式執(zhí)行指定的sql語句,并將執(zhí)行結(jié)果導(dǎo)出到指定文件:
HIVE_HOME/bin/hive -e'select a.col from tab1 a' > a.txt
以非交互式模式執(zhí)行sql文件
HIVE_HOME/bin/hive -f/home/my/hive-script.sql
在進(jìn)入交互模式之前,執(zhí)行初始化sql文件
HIVE_HOME/bin/hive -i/home/my/hive-init.sql
Hive 交互式Shell命令
當(dāng)命令 $HIVE_HOME/bin/hive以不帶 -e/-f 選項(xiàng)的方式運(yùn)行時(shí), hive將進(jìn)入到交互模式
以(;)冒號(hào)結(jié)束命令行
8.3 日志
Hive使用Log4J來處理日志
我們可以通過下面的命令設(shè)計(jì)Hive的日志級(jí)別
$HIVE_HOME/bin/hive -hiveconfhive.root.logger=INFO,console
hive.root.logger的有INFO,DEBUG, 等
8.4 資源
Hive添加資源
Hive可以動(dòng)態(tài)的添加資源,如文件
一般情況下,我們是在與Hive進(jìn)行交互時(shí)添加文件
實(shí)際上是使用Hadoop的 Distributed Cache來控制的
例子
ADD { FILE[S] | JAR[S] | ARCHIVE[S]} <filepath2> [<filepath3>]*
LIST { FILE[S] | JAR[S] | ARCHIVE[S]} [<filepath2> <filepath3> ..]
DELETE { FILE[S] | JAR[S] |ARCHIVE[S] } [<filepath2> <filepath3> ..]
9 Hive優(yōu)化
9.1 Hadoop 計(jì)算框架的特性
1、什么是數(shù)據(jù)傾斜
由于數(shù)據(jù)的不均衡原因,導(dǎo)致數(shù)據(jù)分布不均勻,造成數(shù)據(jù)大量的集中到一點(diǎn),造成數(shù)據(jù)熱點(diǎn)。
2、Hadoop框架的特性
不怕數(shù)據(jù)大,怕數(shù)據(jù)傾斜
jobs數(shù)比較多的作業(yè)運(yùn)行效率相對(duì)比較低,比如即使有幾百行的表,如果多次關(guān)聯(lián)多次匯總,產(chǎn)生十幾個(gè)jobs,耗時(shí)很長(zhǎng)。原因是map reduce作業(yè)初始化的時(shí)間是比較長(zhǎng)的
sum,count,max,min等UDAF,不怕數(shù)據(jù)傾斜問題,hadoop在map端的匯總合并優(yōu)化,使數(shù)據(jù)傾斜不成問題
count(distinct ),在數(shù)據(jù)量大的情況下,效率較低,因?yàn)閏ount(distinct)是按group by 字段分組,按distinct字段排序,一般這種分布方式是很傾斜的。
9.2 優(yōu)化的常用手段
解決數(shù)據(jù)傾斜問題
減少job數(shù)
設(shè)置合理的map reduce的task數(shù),能有效提升性能。
了解數(shù)據(jù)分布,自己動(dòng)手解決數(shù)據(jù)傾斜問題是個(gè)不錯(cuò)的選擇
數(shù)據(jù)量較大的情況下,慎用count(distinct)。
對(duì)小文件進(jìn)行合并,是行至有效的提高調(diào)度效率的方法。
優(yōu)化時(shí)把握整體,單個(gè)作業(yè)最優(yōu)不如整體最優(yōu)。
9.3 Hive的數(shù)據(jù)類型方面的優(yōu)化--優(yōu)化原則
按照一定規(guī)則分區(qū)(例如根據(jù)日期)。通過分區(qū),查詢的時(shí)候指定分區(qū),會(huì)大大減少在無用數(shù)據(jù)上的掃描, 同時(shí)也非常方便數(shù)據(jù)清理。
合理的設(shè)置Buckets。在一些大數(shù)據(jù)join的情況下,map join有時(shí)候會(huì)內(nèi)存不夠。如果使用Bucket Map Join的話,可以只把其中的一個(gè)bucket放到內(nèi)存中,內(nèi)存中原來放不下的內(nèi)存表就變得可以放下。這需要使用buckets的鍵進(jìn)行join的條件連結(jié),并且需要如下設(shè)置
set hive.optimize.bucketmapjoin = true
9.4 Hive的操作方面的優(yōu)化
全排序
怎樣做笛卡爾積
怎樣決定map個(gè)數(shù)
怎樣決定reducer個(gè)數(shù)
合并MapReduce操作
Bucket 與sampling
Partition
JOIN
Group By
合并小文件
1、全排序
Hive的排序關(guān)鍵字是SORTBY,它有意區(qū)別于傳統(tǒng)數(shù)據(jù)庫的ORDER BY也是為了強(qiáng)調(diào)兩者的區(qū)別–SORT BY只能在單機(jī)范圍內(nèi)排序。
2、怎樣做笛卡爾積
當(dāng)Hive設(shè)定為嚴(yán)格模式(hive.mapred.mode=strict)時(shí),不允許在HQL語句中出現(xiàn)笛卡爾積
MapJoin是的解決辦法
MapJoin,顧名思義,會(huì)在Map端完成Join操作。這需要將Join操作的一個(gè)或多個(gè)表完全讀入內(nèi)存
MapJoin的用法是在查詢/子查詢的SELECT關(guān)鍵字后面添加/*+MAPJOIN(tablelist) */提示優(yōu)化器轉(zhuǎn)化為MapJoin(目前Hive的優(yōu)化器不能自動(dòng)優(yōu)化MapJoin)
其中tablelist可以是一個(gè)表,或以逗號(hào)連接的表的列表。tablelist中的表將會(huì)讀入內(nèi)存,應(yīng)該將小表寫在這里
在大表和小表做笛卡爾積時(shí),規(guī)避笛卡爾積的方法是,給Join添加一個(gè)Join key,原理很簡(jiǎn)單:將小表擴(kuò)充一列join key,并將小表的條目復(fù)制數(shù)倍,join key各不相同;將大表擴(kuò)充一列join key為隨機(jī)數(shù)
3、控制Hive的Map數(shù)
通常情況下,作業(yè)會(huì)通過input的目錄產(chǎn)生一個(gè)或者多個(gè)map任務(wù)
主要的決定因素有: input的文件總個(gè)數(shù),input的文件大小,集群設(shè)置的文件塊大小(目前為128M, 可在hive中通過setdfs.block.size;命令查看到,該參數(shù)不能自定義修改)
是不是map數(shù)越多越好
答案是否定的。如果一個(gè)任務(wù)有很多小文件(遠(yuǎn)遠(yuǎn)小于塊大小128m),則每個(gè)小文件也會(huì)被當(dāng)做一個(gè)塊,用一個(gè)map任務(wù)來完成,而一個(gè)map任務(wù)啟動(dòng)和初始化的時(shí)間遠(yuǎn)遠(yuǎn)大于邏輯處理的時(shí)間,就會(huì)造成很大的資源浪費(fèi)。而且,同時(shí)可執(zhí)行的map數(shù)是受限的
是不是保證每個(gè)map處理接近128m的文件塊,就高枕無憂了?
答案也是不一定。比如有一個(gè)127m的文件,正常會(huì)用一個(gè)map去完成,但這個(gè)文件只有一個(gè)或者兩個(gè)小字段,卻有幾千萬的記錄,
如果map處理的邏輯比較復(fù)雜,用一個(gè)map任務(wù)去做,肯定也比較耗時(shí)。
針對(duì)上面的問題3和4,我們需要采取兩種方式來解決:即減少map數(shù)和增加map數(shù);
是不是保證每個(gè)map處理接近128m的文件塊,就高枕無憂了?
答案也是不一定。比如有一個(gè)127m的文件,正常會(huì)用一個(gè)map去完成,但這個(gè)文件只有一個(gè)或者兩個(gè)小字段,卻有幾千萬的記錄,
如果map處理的邏輯比較復(fù)雜,用一個(gè)map任務(wù)去做,肯定也比較耗時(shí)。
針對(duì)上面的問題3和4,我們需要采取兩種方式來解決:即減少map數(shù)和增加map數(shù);
舉例
a) 假設(shè)input目錄下有1個(gè)文件a,大小為780M,那么hadoop會(huì)將該文件a分隔成7個(gè)塊(6個(gè)128m的塊和1個(gè)12m的塊),從而產(chǎn)生7個(gè)map數(shù)
b) 假設(shè)input目錄下有3個(gè)文件a,b,c,大小分別為10m,20m,130m,那么hadoop會(huì)分隔成4個(gè)塊(10m,20m,128m,2m),從而產(chǎn)生4個(gè)map數(shù)
即,如果文件大于塊大小(128m),那么會(huì)拆分,如果小于塊大小,則把該文件當(dāng)成一個(gè)塊
4、怎樣決定reducer個(gè)數(shù)
Hadoop MapReduce程序中,reducer個(gè)數(shù)的設(shè)定極大影響執(zhí)行效率
不指定reducer個(gè)數(shù)的情況下,Hive會(huì)猜測(cè)確定一個(gè)reducer個(gè)數(shù),基于以下兩個(gè)設(shè)定:
參數(shù)1:hive.exec.reducers.bytes.per.reducer(默認(rèn)為1G)
參數(shù)2 :hive.exec.reducers.max(默認(rèn)為999)
計(jì)算reducer數(shù)的公式
N=min(參數(shù)2,總輸入數(shù)據(jù)量/參數(shù)1)
依據(jù)Hadoop的經(jīng)驗(yàn),可以將參數(shù)2設(shè)定為0.95*(集群中TaskTracker個(gè)數(shù))
reduce個(gè)數(shù)并不是越多越好
同map一樣,啟動(dòng)和初始化reduce也會(huì)消耗時(shí)間和資源;
另外,有多少個(gè)reduce,就會(huì)有多少個(gè)輸出文件,如果生成了很多個(gè)小文件,那么如果這些小文件作為下一個(gè)任務(wù)的輸入,則也會(huì)出現(xiàn)小文件過多的問題
什么情況下只有一個(gè)reduce
很多時(shí)候你會(huì)發(fā)現(xiàn)任務(wù)中不管數(shù)據(jù)量多大,不管你有沒有設(shè)置調(diào)整reduce個(gè)數(shù)的參數(shù),任務(wù)中一直都只有一個(gè)reduce任務(wù);
其實(shí)只有一個(gè)reduce任務(wù)的情況,除了數(shù)據(jù)量小于
hive.exec.reducers.bytes.per.reducer參數(shù)值的情況外,還有以下原因:
a) 沒有g(shù)roup by的匯總
b) 用了Order by
5、合并 MapReduce操作
Multi-group by
Multi-group by是Hive的一個(gè)非常好的特性,它使得Hive中利用中間結(jié)果變得非常方便
FROM log
insert overwrite table test1 select log.id group by log.id
insert overwrite table test2select log.name group by log.name
上述查詢語句使用了Multi-group by特性連續(xù)group by了2次數(shù)據(jù),使用不同的groupby key。這一特性可以減少一次MapReduce操作。
6、Bucket 與 Sampling
Bucket是指將數(shù)據(jù)以指定列的值為key進(jìn)行hash,hash到指定數(shù)目的桶中。這樣就可以支持高效采樣了
Sampling可以在全體數(shù)據(jù)上進(jìn)行采樣,這樣效率自然就低,它還是要去訪問所有數(shù)據(jù)。而如果一個(gè)表已經(jīng)對(duì)某一列制作了bucket,就可以采樣所有桶中指定序號(hào)的某個(gè)桶,這就減少了訪問量。
如下例所示就是采樣了test中32個(gè)桶中的第三個(gè)桶。
SELECT * FROM test 、、、TABLESAMPLE(BUCKET 3 OUT OF 32);
7、JOIN 原則
在使用寫有 Join 操作的查詢語句時(shí)有一條原則:應(yīng)該將條目少的表/子查詢放在 Join 操作符的左邊
原因是在 Join 操作的 Reduce 階段,位于 Join 操作符左邊的表的內(nèi)容會(huì)被加載進(jìn)內(nèi)存,將條目少的表放在左邊,可以有效減少發(fā)生 OOM 錯(cuò)誤的幾率。
8、Map Join
Join 操作在 Map階段完成,不再需要Reduce,前提條件是需要的數(shù)據(jù)在 Map的過程中可以訪問到
例如:
INSERT OVERWRITE TABLE phone_traffic SELECT /*+MAPJOIN(phone_location) */ l.phone,p.location,l.traffic from phone_location p join log l on(p.phone=l.phone)
相關(guān)的參數(shù)為:
hive.join.emit.interval = 1000How many rows in the right-most join operand Hive should buffer before emittingthe join result. hive.mapjoin.size.key = 10000 hive.mapjoin.cache.numrows =10000
9、Group By
Map 端部分聚合
并不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以先在 Map 端進(jìn)行部分聚合,最后在 Reduce 端得出最終結(jié)果
基于 Hash
參數(shù)包括:
hive.map.aggr = true 是否在 Map 端進(jìn)行聚合,默認(rèn)為 True
hive.groupby.mapaggr.checkinterval =100000 在 Map 端進(jìn)行聚合操作的條目數(shù)目
有數(shù)據(jù)傾斜的時(shí)候進(jìn)行負(fù)載均衡
hive.groupby.skewindata = false
當(dāng)選項(xiàng)設(shè)定為 true,生成的查詢計(jì)劃會(huì)有兩個(gè) MR Job。第一個(gè) MR Job 中,Map 的輸出結(jié)果集合會(huì)隨機(jī)分布到 Reduce 中,每個(gè) Reduce 做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的 Group ByKey 有可能被分發(fā)到不同的 Reduce 中,從而達(dá)到負(fù)載均衡的目的;第二個(gè) MR Job 再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照 Group By Key 分布到 Reduce 中(這個(gè)過程可以保證相同的 Group By Key 被分布到同一個(gè) Reduce 中),最后完成最終的聚合操作。
10、合并小文件
文件數(shù)目過多,會(huì)給 HDFS 帶來壓力,并且會(huì)影響處理效率,可以通過合并 Map 和 Reduce 的結(jié)果文件來消除這樣的影響:
hive.merge.mapfiles = true 是否和并 Map 輸出文件,默認(rèn)為 True
hive.merge.mapredfiles = false 是否合并 Reduce 輸出文件,默認(rèn)為 False
hive.merge.size.per.task =256*1000*1000 合并文件的大小
標(biāo)題名稱:Hive入門到剖析(三)
URL地址:http://jinyejixie.com/article6/psisog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、云服務(wù)器、動(dòng)態(tài)網(wǎng)站、做網(wǎng)站、、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
移動(dòng)網(wǎng)站建設(shè)知識(shí)