真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Hive調(diào)優(yōu)總結(jié)

一、查看執(zhí)行計(jì)劃
explain extended hql;可以看到掃描數(shù)據(jù)的hdfs路徑

二、hive表優(yōu)化

分區(qū)(不同文件夾):
動(dòng)態(tài)分區(qū)開(kāi)啟:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

在北流等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),全網(wǎng)整合營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站制作,北流網(wǎng)站建設(shè)費(fèi)用合理。

    默認(rèn)值:strict
   描述:strict是避免全分區(qū)字段是動(dòng)態(tài)的,必須有至少一個(gè)分區(qū)字段是指定有值的

   避免產(chǎn)生大量分區(qū)

分桶(不同文件):
set hive.enforce.bucketing=true;
set hive.enforce.sorting=true;開(kāi)啟強(qiáng)制排序,插數(shù)據(jù)到表中會(huì)進(jìn)行強(qiáng)制排序,默認(rèn)false;


三、Hive SQL優(yōu)化

groupby數(shù)據(jù)傾斜優(yōu)化
hive.groupby.skewindata=true;(多起一個(gè)job)1.join優(yōu)化

(1)數(shù)據(jù)傾斜
hive.optimize.skewjoin=true;
如果是join過(guò)程出現(xiàn)傾斜,應(yīng)該設(shè)置為true
set hive.skewjoin.key=100000;
這個(gè)是join的鍵對(duì)應(yīng)的記錄條數(shù)超過(guò)這個(gè)值則會(huì)進(jìn)行優(yōu)化
簡(jiǎn)單說(shuō)就是一個(gè)job變?yōu)閮蓚€(gè)job執(zhí)行HQL

(2)mapjoin(map端執(zhí)行join)
啟動(dòng)方式一:(自動(dòng)判斷)
set.hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize 默認(rèn)值是25mb
小表小于25mb自動(dòng)啟動(dòng)mapjoin 
啟動(dòng)方式二:(手動(dòng))
select /*+mapjoin(A)*/ f.a,f.b from A t join B f on (f.a=t.a)

mapjoin支持不等值條件
reducejoin不支持在ON條件中不等值判斷

(3)bucketjoin(數(shù)據(jù)訪問(wèn)可以精確到桶級(jí)別)
使用條件:1.兩個(gè)表以相同方式劃分桶
         2.兩個(gè)表的桶個(gè)數(shù)是倍數(shù)關(guān)系
例子:
create table order(cid int,price float) clustered by(cid)   into 32 buckets;
create table customer(id int,first string) clustered by(id)   into 32/64 buckets;

select price from order t join customer s on t.cid=s.id;

(4)where條件優(yōu)化
優(yōu)化前(關(guān)系數(shù)據(jù)庫(kù)不用考慮會(huì)自動(dòng)優(yōu)化):
select m.cid,u.id from order m join customer u on m.cid =u.id where m.dt='2013-12-12';

優(yōu)化后(where條件在map端執(zhí)行而不是在reduce端執(zhí)行):
select m.cid,u.id from (select * from order where dt='2013-12-12') m join customer u on m.cid =u.id;

(5)group by 優(yōu)化
hive.groupby.skewindata=true;
如果group by過(guò)程出現(xiàn)傾斜應(yīng)該設(shè)置為true
set hive.groupby.mapaggr.checkinterval=100000;
這個(gè)是group的鍵對(duì)應(yīng)的記錄條數(shù)超過(guò)這個(gè)值則會(huì)進(jìn)行優(yōu)化

也是一個(gè)job變?yōu)閮蓚€(gè)job
(6)count distinct優(yōu)化
優(yōu)化前(只有一個(gè)reduce,先去重再count負(fù)擔(dān)比較大):
select count(distinct id) from tablename;
優(yōu)化后(啟動(dòng)兩個(gè)job,一個(gè)job負(fù)責(zé)子查詢(xún)(可以有多個(gè)reduce),另一個(gè)job負(fù)責(zé)count(1)):
select count(1) from (select distinct id from tablename) tmp;

select count(1) from (select id from tablename group by id) tmp;

set mapred.reduce.tasks=3;

 (7)
優(yōu)化前:
select a,sum(b),count(distinct c),count(distinct d) from test group by a;

優(yōu)化后:
select a,sum(b) as b,count(c) as c,count(d) as d from

select a, 0 as b,c,null as d from test group by a,c
union all
select a,0 as b, null as c,d from test group by a,d
union all
select a, b,null as c ,null as d from test) tmp group by a;


四、Hive job優(yōu)化

1.并行化執(zhí)行
hive默認(rèn)job是順序進(jìn)行的,一個(gè)HQL拆分成多個(gè)job,job之間無(wú)依賴(lài)關(guān)系也沒(méi)有相互影響可以并行執(zhí)行
set hive.exec.parallel=true;

set hive.exec.parallel.thread.number=8;
就是控制對(duì)于同一個(gè)sql來(lái)說(shuō)同時(shí)可以運(yùn)行的job的最大值,該參數(shù)默認(rèn)為8.此時(shí)最大可以同時(shí)運(yùn)行8個(gè)job

2.本地化執(zhí)行(在存放數(shù)據(jù)的節(jié)點(diǎn)上執(zhí)行)

set hive.exec.mode.local.auto=true;

本地化執(zhí)行必須滿足條件:
(1)job的輸入數(shù)據(jù)大小必須小于參數(shù)
hive.exec.mode.local.auto.inputbytes.max(默認(rèn)128MB)
(2)job的map數(shù)必須小于參數(shù):
hive.exec.mode.local.auto.tasks.max(默認(rèn)為4)太多沒(méi)有足夠的slots
(3)job的reduce數(shù)必須為0或1


3.job合并輸入小文件
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
多個(gè)split合成一個(gè),合并split數(shù)由mapred.max.split.size限制的大小決定

4.job合并輸出小文件(為后續(xù)job優(yōu)化做準(zhǔn)備)
set hive.merge.smallfiles.avgsize=256000000;當(dāng)輸出文件平均大小小于該值,啟動(dòng)新job合并文件

set hive.merge.size.per.task=64000000;合并之后的每個(gè)文件大小

5.JVM重利用
set mapred.job.reuse.jvm.num.tasks=20;

每個(gè)jvm運(yùn)行多少個(gè)task;

JVM重利用可以使job長(zhǎng)時(shí)間保留slot,直到作業(yè)結(jié)束。
6.壓縮數(shù)據(jù)(多個(gè)job)
(1)中間壓縮處理hive查詢(xún)的多個(gè)job之間的數(shù)據(jù),對(duì)于中間壓縮,最好選擇一個(gè)節(jié)省cpu耗時(shí)的壓縮方式
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;按塊壓縮,而不是記錄 
(2)最終輸出壓縮(選擇壓縮效果好的,減少儲(chǔ)存空間) 
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set mapred.output.compression.type=BLOCK;按塊壓縮,而不是記錄 

五、Hive Map優(yōu)化

1.set mapred.map.tasks=10 無(wú)效
(1)默認(rèn)map個(gè)數(shù)
default_num=total_size/block_size;
 (2)期望大小(手動(dòng)設(shè)置的個(gè)數(shù))
goal_num =mapred.map.tasks;
(3)設(shè)置處理的文件大小(根據(jù)文件分片大小計(jì)算的map個(gè)數(shù))
split_size=max(block_size,mapred.min.split.size);
split_num=total_size/split_size;
(4)最終計(jì)算的map個(gè)數(shù)(實(shí)際map個(gè)數(shù))
compute_map_num=min(split_num,max(default_num,goal_num))

總結(jié):
(1)如果想增加map個(gè)數(shù),則設(shè)置mapred.map.tasks為一個(gè)較大的值;
(2)如果想減小map個(gè)數(shù),則設(shè)置mapred.min.split.size為一個(gè)較大的值。
 
2.map端聚合
set hive.map.aggr=true;相當(dāng)于map端執(zhí)行combiner

3.推測(cè)執(zhí)行(默認(rèn)為true)
mapred.map.tasks.speculative.execution


六、Hive Shuffle優(yōu)化
Map 端
io.sort.mb
io.sort.spill.percent
min.num.spill.for.combine
io.sort.factor
io.sort.record.percent

reduce端
mapred.reduce.parallel.copies
mapred.reduce.copy.backoff
io.sort.factor
mapred.job.shuffle.input.buffer.percent


七、HIve Reduce優(yōu)化
1.推測(cè)執(zhí)行(默認(rèn)為true)

mapred.reduce.tasks.speculative.execution(hadoop里面的)
hive.mapred.reduce.tasks.speculative.execution(hive里面相同的參數(shù),效果和hadoop里面的一樣)
兩個(gè)隨便哪個(gè)都行

2.Reduce優(yōu)化(reduce個(gè)數(shù)設(shè)置)
set mapred.reduce.tasks=10;直接設(shè)置

最大值
hive.exec.reducers.max 默認(rèn):999

每個(gè)reducer計(jì)算的文件量大小
hive.exec.reducers.bytes.per.reducer 默認(rèn):1G

計(jì)算公式:雖然設(shè)了這么多,但不一定用到這么多
numRTasks =min[maxReducers,input.size/perReducer]
maxReducers=hive.exec.reducers.max
perReducer=hive.exec.reducers.bytes.per.reducer

八、隊(duì)列
set mapred.queue.name=queue3;設(shè)置隊(duì)列queue3
set mapred.job.queue.name=queue3;設(shè)置使用queue3
set mapred.job.priority=HIGH;

隊(duì)列參考文章:
http://yaoyinjie.blog.51cto.com/3189782/872294



本文題目:Hive調(diào)優(yōu)總結(jié)
文章分享:http://weahome.cn/article/jhggsc.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部