Hive性能優化【嚴格模式、join優化、Map-Side聚合、JVM重用】


一.嚴格模式

  通過設置以下參數開啟嚴格模式:

  >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插槽資源!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM