成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Hive入門到剖析(三)

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下腳本介紹

Hive入門到剖析(三)


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)

h5響應(yīng)式網(wǎng)站建設(shè)
济阳县| 博兴县| 突泉县| 沙洋县| 铁力市| 遵化市| 松潘县| 嘉鱼县| 桦川县| 永清县| 东安县| 交口县| 彭阳县| 星子县| 铜川市| 巨鹿县| 资兴市| 定结县| 安新县| 沽源县| 娱乐| 大丰市| 连州市| 蒙自县| 通化县| 吉水县| 政和县| 连云港市| 崇阳县| 扶沟县| 滨州市| 乐平市| 磐石市| 杭锦旗| 民乐县| 怀化市| 临安市| 湾仔区| 内乡县| 长宁区| 长海县|