1.使用explain查看執(zhí)行計劃
建表優(yōu)化
2.開啟動態(tài)分區(qū)配置,使用分區(qū)過濾
3.分桶表
select * from stu_buck tablesample(bucket 1 out of 4 on id)
例如涉枫,table總bucket數為32,tablesample(bucket 3 out of 16),表示總共抽取
(32/16=)2個bucket的數據仓洼,分別為第3個bucket和第(3+16=)19個bucket的數據
語法優(yōu)化
a. 分區(qū)過濾和列過濾,減少數據量和降低讀取開銷
b. group by分組聚合時使用map端聚合。
set hive.map.aggr=true;
set hive.groupby.mapaggr.checkinterval = 100000;
set hive.groupby.skewindata = true;
(有數據傾斜時負載均衡)
c. 矢量化查詢
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
d. 使用left semi join替換in/exists
e. 開啟基于成本的優(yōu)化
set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;
f.謂詞下推(PredicatePushDown)
set hive.optimize.ppd = true; #謂詞下推,默認是 true
g.大表join小表惹骂,使用mapjoin,避免reducer處理
set hive.auto.convert.join=true; #默認為 true
set hive.mapjoin.smalltable.filesize=100000000;
h.大表、大表 SMB Join(重點)
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set
hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
數據傾斜
1.單表傾斜
當任務中存在 GroupBy 操作同時聚合函數為 count 或者 sum 可以設置參數來處理數據
傾斜問題做瞪。
set hive.map.aggr = true;
set hive.groupby.mapaggr.checkinterval = 100000;
有數據傾斜的時候進行負載均衡(默認是 false)
set hive.groupby.skewindata = true;
增加reduce個數
2.多表傾斜
使用參數
join 的鍵對應的記錄條數超過這個值則會進行分拆对粪,值根據具體數據量設置
set hive.skewjoin.key=100000;
如果是 join 過程出現傾斜應該設置為 true
set hive.optimize.skewjoin=true;
Mapjoin
hive job優(yōu)化
復雜文件增加 Map 數
set mapreduce.input.fileinputformat.split.maxsize=100;
小文件進行合并
在map執(zhí)行前合并小文件
set hive.input.format=
org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
在 Map-Reduce 的任務結束時合并小文件的設置
在 map-only 任務結束時合并小文件,默認 true
set hive.merge.mapfiles = true;
在 map-reduce 任務結束時合并小文件穿扳,默認 false
set hive.merge.mapredfiles = true;
合并文件的大小衩侥,默認 256M
set hive.merge.size.per.task = 268435456;
當輸出文件的平均大小小于該值時,啟動一個獨立的 map-reduce 任務進行文件 merge
set hive.merge.smallfiles.avgsize = 16777216;
合理設置 Reduce 數
set mapreduce.job.reduces=10;
推測執(zhí)行
hive.mapred.reduce.tasks.speculative.execution=true
并行執(zhí)行
set hive.exec.parallel=true; //打開任務并行執(zhí)行矛物,默認為 false
set hive.exec.parallel.thread.number=16; //同一個 sql 允許最大并行度茫死,默認為 8
JVM 重用
set mapred.job.reuse.jvm.num.tasks=20
小文件過多的時候使用。
hive資源分配
set mapreduce.map.memory.mb=8192;
set mapreduce.reduce.memory.mb=8192;
set mapreduce.map.java.opts=-Xmx7200m;
set mapreduce.reduce.java.opts=-Xmx7200m;
set yarn.app.mapreduce.am.resource.mb=8192;