一.嚴格模式
通過設置以下參數開啟嚴格模式:
>set hive.mapred.mode=strict;【默認為nonstrict非嚴格模式】
查詢限制:
1.對於分區表,必須添加where查詢條件來對分區字段進行條件過濾。
2.order by語句必須包含limit輸出限制。
3.限制執行笛卡爾積的查詢。
二.Hive排序
1.order by:對於查詢結果做全排序只允許有一個reduce處理,當數據量較大時,應慎用。嚴格模式下必須結合limit來使用。
2.sort by:對於單個reduce的數據進行排序。
3.distribute by:分區排序,經常和sort by結合使用。
4.cluster by:相當於sort by + distribute by【cluster by不能通過asc,desc的方法指定排序規則,可通過distribute by column sort by column asc|desc的方式】
三.Hive Join
1.join計算時,將小表放在join的左邊。
2.map join,在Map端完成join,實現方式:
2.1sql方式,在sql語句中添加mapjoin標記【mapjoin hint】
語法:select /*+MAPJOIN(smallTable) */ smallTable.key,bigTable.value from smallTable JOIN btTable ON smallTable.key = bigTable.key;
2.2開啟自動mapjoin,通過設置一下配置啟動自動的mapjoin
set hive.auto.convert.join = true;【該參數為ture時,Hive自動對左邊的表統計量,如果是小表就加入內存,即對小表用mapjoin】
相關參數配置:
>hive.mapjoin.smalltable.filesize;【大小表判斷閾值,表的大小小於該值則為小表,加載到內存中】
>hive.ignore.mapjoin.hint;【默認值為true,是否忽略mapjoin hint即mapjoin標記】
>hive.auto.convert.join.noconditionaltask;【默認值為true,將普通的join轉化為普通的mapjoin時,是否將多個mapjoin轉化為一個mapjoin】
>hive.auto.convert.join.noconditionaltask.size;【將多個mapjoin轉化為一個mapjoin時,列表的最大值】
四.Map-Side聚合
通過設置以下參數開啟在map端的聚合:set hive.map.aggr=true;
相關參數配置:
>hive.groupby.mapaggr.checkinterval:map端group by執行聚合時處理的數據條數【默認100000】
>hive.map.aggr.hash.min.reduction:進行聚合的最小比例【預先對100000條數據做聚合,若聚合之后的數據量/100000的值大於該配置【默認0.5】則不聚合】
>hive.map.aggr.hash.percentmemeory:map端聚合使用的內存的最大值
>hive.map.aggr.hash.force.flush.memory.threshold:map端做聚合操作時hash表的最大可以容量,大於該值則會觸發flush
>hive.groupby.skewindata:是否對groupby產生的數據傾斜做優化,默認為false
五.控制hive中map和reduce的數量
map數量相關參數:
>mapred.max.split.size:一個split的最大值,即每個map處理文件的最大值
>maprd.min.split.size.per.node:一個節點上split的最小值
>mapred.min.split.size.per.rack:一個機架上split的最小值
reduce數量相關參數:
>mapred.reduce.tasks:強制指定reduce任務的數量
>hive.exec.reducers.bytes.per.reducer:每個reduce任務處理的數據量
>hive.exec.reducers.max:每個任務最大的reduce數
六.JVM重用
適用場景:
1.小文件個數過多
2.task個數過多
通過執行:set mapred.job.reuse.jvm.num.tasks=n;來設置task插槽個數
缺點:
設置開啟后,task插槽會一直占用資源,不論是否有task,直到所有的task即整個job執行完成后才會釋放所有的task插槽資源!