hive、spark優化

胡大寶_fighting發表於2020-12-04

hive、spark優化

看了文章https://blog.csdn.net/qq_26442553/article/details/99438121,總結了的。感謝@滌生大大的精彩分享

小檔案過多

小檔案過多引起maptask太多,初始化時間遠大於邏輯處理時間。此時我們可以合併小檔案。

  1. hive,調節引數:
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --hive0.5開始就是預設值,執行map前進行小檔案合併
----------------------------------------------------------------------
set mapred.max.split.size=256000000  
set mapred.min.split.size=10000000
set mapred.min.split.size.per.node=8000000 --每個節點處理的最小split
set mapred.min.split.size.per.rack=8000000 --每個機架處理的最小slit.
------------------------------------------------------------------------
注意一般來說這四個引數的配置結果大小要滿足如下關係。
max.split.size >= min.split.size >= min.size.per.node >= min.size.per.node

注意,
1.調節上面四個引數控制map端任務個數時,如果檔案未使用壓縮,或者壓縮格式不支援split,那麼在檔案較大的情況下想要通過調節引數增加map數是無效的。
2.如果是可切分的壓縮格式,則需要上面?四個引數一起,進行精準控制調優。

  1. spark 。
    spark 可以通過/repartition(n)/,根據實際情況,對最終結果進行repartion進而達到控制最終落到hdfs的檔案數的目的
資料傾斜
1.join傾斜
  1. 小表join大表
    將小表寫在前面,通過/*map join */舍掉reduce操作,沒有reduce操作就不會有資料傾斜。並且map join的原理是將小表載入到每一個map節點上與大表進行關聯,所以對小表 join大表的笛卡爾積的情況,也十分有效。

  2. 大表join大表

    • null值引起的資料傾斜。
      預先過濾null值,或者將null處理成非關聯值的隨機值。
    • 非null的熱點值引起的傾斜
      將熱點值和非熱點值分開進行計算,最終合併到一起,
    • sql層面處理。
      1、 儘量避免distinct 用group by代替
      2、 儘可能的裁剪列和分割槽,縮小資料集
      3、 關聯key 的欄位型別保持一致。
      4、distribute by ()sort by 代替partition by () order by() 因為。orderby是全域性排序,只會起一個reduce任務,所以會很慢。
    • 引數調節
      1、設定每個reduce可處理的資料量大小
      set hive.exec.reducers.bytes.per.reducer = 1000000000
      2、控制傾斜的閾值
      ihve 在執行的時候沒有辦法判斷哪個key 會產生多大的傾斜,所以使用這個引數控制傾斜的閾值,如果超過這個值,新的值會傳送給那些還沒有達到的reduce, 一般可以設定成你處理的總記錄數/reduce個數的2-4倍都可以接受.
      set hive.optimize.skewjoin = true;
      set hive.skewjoin.key = skew_key_threshold (default = 100000)
      
3.group by 傾斜

首先配置允許在map端進行聚合,然後同樣調節傾斜的閾值。

hive.map.aggr=true  (預設true) 這個配置項代表是否在map端進行聚合,相當於Combiner

hive.groupby.skewindata=true(預設false)

相關文章