hive.optimize.cp=true:列裁剪
hive.optimize.prunner:分區(qū)裁剪
hive.limit.optimize.enable=true:優(yōu)化LIMIT n語句
hive.limit.row.max.size=1000000:
hive.limit.optimize.limit.file=10:最大文件數(shù)
1. 本地模式(小任務):
需要滿足以下條件:
1.job的輸入數(shù)據(jù)大小必須小于參數(shù):hive.exec.mode.local.auto.inputbytes.max(默認128MB)
2.job的map數(shù)必須小于參數(shù):hive.exec.mode.local.auto.tasks.max(默認4)
3.job的reduce數(shù)必須為0或者1
hive.exec.mode.local.auto.inputbytes.max=134217728
hive.exec.mode.local.auto.tasks.max=4
hive.exec.mode.local.auto=true
hive.mapred.local.mem:本地模式啟動的JVM內(nèi)存大小
2. 并發(fā)執(zhí)行:
hive.exec.parallel=true 线梗,默認為false
hive.exec.parallel.thread.number=8
3.Strict Mode:
hive.mapred.mode=true,嚴格模式不允許執(zhí)行以下查詢:
分區(qū)表上沒有指定了分區(qū)
沒有l(wèi)imit限制的order by語句
笛卡爾積:JOIN時沒有ON語句
4.動態(tài)分區(qū):
hive.exec.dynamic.partition.mode=strict:該模式下必須指定一個靜態(tài)分區(qū)
hive.exec.max.dynamic.partitions=1000
hive.exec.max.dynamic.partitions.pernode=100:在每一個mapper/reducer節(jié)點允許創(chuàng)建的最大分區(qū)數(shù)
DATANODE:dfs.datanode.max.xceivers=8192:允許DATANODE打開多少個文件
5.推測執(zhí)行:
mapred.map.tasks.speculative.execution=true
mapred.reduce.tasks.speculative.execution=true
hive.mapred.reduce.tasks.speculative.execution=true;
6.Single MapReduce MultiGROUP BY
hive.multigroupby.singlemar=true:當多個GROUP BY語句有相同的分組列抢呆,則會優(yōu)化為一個MR任務
7. hive.exec.rowoffset:是否提供虛擬列
8. 分組
兩個聚集函數(shù)不能有不同的DISTINCT列,以下表達式是錯誤的:
INSERT OVERWRITE TABLE pv_gender_agg SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip) FROM pv_users GROUP BY pv_users.gender;
SELECT語句中只能有GROUP BY的列或者聚集函數(shù)宝泵。
9.
hive.map.aggr=true;在map中會做部分聚集操作,效率更高但需要更多的內(nèi)存。
hive.groupby.mapaggr.checkinterval:在Map端進行聚合操作的條目數(shù)目
10.
hive.groupby.skewindata=true:數(shù)據(jù)傾斜時負載均衡瓤鼻,當選項設(shè)定為true,生成的查詢計劃會有兩個MRJob。第一個MRJob 中沃粗,
Map的輸出結(jié)果集合會隨機分布到Reduce中,每個Reduce做部分聚合操作,并輸出結(jié)果盼产,這樣處理的結(jié)果是相同的GroupBy Key
有可能被分發(fā)到不同的Reduce中草穆,從而達到負載均衡的目的;第二個MRJob再根據(jù)預處理的數(shù)據(jù)結(jié)果按照GroupBy Key分布到
Reduce中(這個過程可以保證相同的GroupBy Key被分布到同一個Reduce中)段标,最后完成最終的聚合操作瞻赶。
11.Multi-Group-By Inserts:
FROM test
INSERT OVERWRITE TABLE count1
SELECT count(DISTINCT test.dqcode)
GROUP BY test.zipcode
INSERT OVERWRITE TABLE count2
SELECT count(DISTINCT test.dqcode)
GROUP BY test.sfcode;
12.排序
ORDER BY colName ASC/DESC
hive.mapred.mode=strict時需要跟limit子句
hive.mapred.mode=nonstrict時使用單個reduce完成排序
SORT BY colName ASC/DESC :每個reduce內(nèi)排序
DISTRIBUTE BY(子查詢情況下使用 ):控制特定行應該到哪個reducer痹兜,并不保證reduce內(nèi)數(shù)據(jù)的順序
CLUSTER BY :當SORT BY 对湃、DISTRIBUTE BY使用相同的列時。
13.合并小文件
hive.merg.mapfiles=true:合并map輸出
hive.merge.mapredfiles=false:合并reduce輸出
hive.merge.size.per.task=256*1000*1000:合并文件的大小
hive.mergejob.maponly=true:如果支持CombineHiveInputFormat則生成只有Map的任務執(zhí)行merge
hive.merge.smallfiles.avgsize=16000000:文件的平均大小小于該值時遗淳,會啟動一個MR任務執(zhí)行merge。
14.map/reduce數(shù)目
減少map數(shù)目:
set mapred.max.split.size
set mapred.min.split.size
set mapred.min.split.size.per.node
set mapred.min.split.size.per.rack
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
增加map數(shù)目:
當input的文件都很大拆讯,任務邏輯復雜种呐,map執(zhí)行非常慢的時候阔墩,可以考慮增加Map數(shù),來使得每個map處理的數(shù)據(jù)量減少柑土,從而提高任務的執(zhí)行效率蜀肘。
假設(shè)有這樣一個任務:
select data_desc, count(1), count(distinct id),sum(case when …),sum(case when ...),sum(…) from a group by data_desc
如果表a只有一個文件,大小為120M稽屏,但包含幾千萬的記錄,如果用1個map去完成這個任務获雕,肯定是比較耗時的薄腻,這種情況下,我們要考慮將這一個文件合理的拆分成多個届案,這樣就可以用多個map任務去完成庵楷。
set mapred.reduce.tasks=10;
create table a_1 as select * from a distribute by rand(123);
這樣會將a表的記錄,隨機的分散到包含10個文件的a_1表中楣颠,再用a_1代替上面sql中的a表尽纽,則會用10個map任務去完成。每個map任務處理大于12M(幾百萬記錄)的數(shù)據(jù)童漩,效率肯定會好很多弄贿。
reduce數(shù)目設(shè)置:
參數(shù)1:hive.exec.reducers.bytes.per.reducer=1G:每個reduce任務處理的數(shù)據(jù)量
參數(shù)2:hive.exec.reducers.max=999(0.95*TaskTracker數(shù)):每個任務最大的reduce數(shù)目
reducer數(shù)=min(參數(shù)2,總輸入數(shù)據(jù)量/參數(shù)1)
set mapred.reduce.tasks:每個任務默認的reduce數(shù)目。典型為0.99*reduce槽數(shù)矫膨,hive將其設(shè)置為-1差凹,自動確定reduce數(shù)目。
15.使用索引:
hive.optimize.index.filter:自動使用索引
hive.optimize.index.groupby:使用聚合索引優(yōu)化GROUP BY操作