hive工作中用到的一些優化策略

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的標記
  • 儘可能使用相同的連接鍵(轉化爲一個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插槽的資源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章