1、hive抓取策略
- hive.fetch.task.conversion = more/none
more不走mr,none走mr
2、explain 顯示執行計劃
3、設置本地運行模式
- set hive.exec.mode.local.auto = true
- hive.exec.mode.local.inputbytes.max 默認128M,表示加載文件的最大值,若大於該配置仍會以集羣方式運行
4、並行計算
- Set hive.exec.parallel = true/falses
- Set hive.exec.parallel.thread.number 默認8個
5、嚴格模式
- set hive.mapred.mode = strict/nonstrict
- 限制查詢:
對於分區表,必須添加where對於分區字段的過濾條件
order by語句必須包含limit輸出限制
限制執行笛卡爾積的查詢
6、hive排序
- order by:對於查詢結果做全排序,只允許一個reduce處理(當數據量較大時,慎用。嚴格模式下,必須結合limit來使用)
- sort by:對於單個reduce的數據進行排序
- distribute by:分區排序,經常和sort by結合使用
- cluster by:相當於sort by+distribute by
- cluster by不能通過asc、desc的方式指定排序順序,可通過distribute by column sort by column asc|desc的方式
7、hive join
- join計算時,將小表(驅動表)放在join的左邊
- Map join:在map端完成join
- SQL方式:在sql語句中添加map join的標記(mapjoin hint)
- 語法:select /* MAPJOIN(b) */ a.key, a.value from a join b on a.key = b.key
- 自動的mapjion
- 通過以後配置啓用自動的mapjion
- set hive.auto.convert.join = true (爲true時,hive自動對左邊的表統計量,如果時小表就加入內存,即對小表啓動mapjion)
- hive.mapjion.smalltable.filesize 默認25M
- Hive.ignore.mapjion.hint 是否忽略maojoin hint的標記
- 通過以後配置啓用自動的mapjion
- SQL方式:在sql語句中添加map join的標記(mapjoin hint)
- 儘可能使用相同的連接鍵(轉化爲一個mr)
- 大表join大表 (不一定有用)
- 空key過濾:有時join超時是因爲某些key對應的數據太多,而相同key對應的數據都會發送到相同的reducer上,從而導致內存不夠。此時我們應該仔細分析這些異常的key,很多情況下,這些key對應的數據是異常數據,我們需要在SQL語句中進行過濾。
- 空key轉換:有時雖然某個key爲空對應的數據很多,但是相應的數據不是異常數據,必須要包含在join的結果中,此時我們可以表a中key爲空的字段賦一個隨機的值,使得數據隨機均勻地分不到不同的reducer上
8、map-side聚合
- 通過設置參數開啓map端的聚合:set hive.map.aggr=true
- hive.groupby.mapaggr.checkinterval —map端gourp by執行聚合時處理的多少行數據(默認100000)
- hive.map.aggr.hash.min.reduction —進行聚合的最小比例(預先對100000條數據做聚合,若聚合之後的數據量/100000的值大於配置的0.5,則不會聚合)
- hive.map.aggr.hash.percentmemory —map端聚合使用的內存最大值
- hive.map.aggr.hash.force.flush.memory.threshold —map端做聚合操作時hash表的最大可用內容,大於該值出發flush
- hive.groupby.skewindata — 是否對groupby產生的數據傾斜做優化。默認false
9、合併小文件 文件數據小,容易在文件存儲端造成壓力,給hdfs造成壓力,影響效率
- 設置合併屬性
- 是否合併map輸出文件:hive.merge.mapfiles=true
- 是否合併reduce輸出文件:hive.merge.mapredfiles=true
- 合併文件的大小:hive.merge.size.per.task=25610001000
10、去重統計:數據量小的時候無所謂,數據量大的情況下,由於COUNT DISTINCT操作需要用一個Reduce Task來完成,這一個Reduce需要處理的數據量太大,就會導致整個Job很難完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替換
11、控制hive中map以及reduce的數量
-
Map數量相關的參數
* mapred.max.split.size 每個split的最大值,即每個map處理文件的最大值
* mapred.min.split.size.per.node 一個節點上split的最小值
* mapred.min.split.size.per.rack 一個機架上split的最小值 -
educe數量相關的參數
* mapred.reduce.tasks 強制指定reduce任務的數量
* hive.exec.reducers.bytes.per.reduce 每個reduce任務處理的數據量
* hive.exec.reduce.max 每個任務最大的reduce書
13、hive-JVM重用
-
適用場景
* 小文件個數過多
* task個數過多 -
通過set mapred.job.reuse.jvm.num.tasks=n來設置
-
缺陷:設置開啓之後,task插槽會一直佔用資源,無論是否有task運行,直到所有的task即整個job全部執行完成時,纔會釋放所有的task插槽的資源