HIVE面試題

萌哥-爱学习發表於2024-07-10

HIVE 最佳化:

場景1. 分組聚合group by 導致資料傾斜 -- map端聚合 :
aggr=true

  1. 會在mapper端先group by一次,最後再把結果merge起來,為了減少reducer處理的資料量
  2. 指令: Set hive.groupby.mapaggr.checkinterval=1000000
    Set hive.map.aggr = true
    set hive.groupby.skewindata=true; --啟用分組聚合資料傾斜最佳化

場景2. 大表和小表join 導致的資料傾斜. 將小表廣播到記憶體中不進行shuffle

  --啟用map join自動轉換
  set hive.auto.convert.join=true;

場景3. 兩張大表 join 發生資料傾斜[SMB JOIN]
使用分桶表,並且開啟SMB Join (Sort Merge Bucket Join)
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

	關聯鍵空值很多情況

SELECT ...
FROM (
SELECT *
FROM tbl1
WHERE ds = '${cur_date}'
) a
LEFT OUTER JOIN (
SELECT *
FROM tbl1
WHERE ds = '${cur_date}'
) b
ON coalesce(a.id,rand() * 9999) = b.id -- 透過coalesce對空值進行隨機分發,避免聚集

場景4. 小檔案合併最佳化
合併Map端輸入的小檔案,是指將多個小檔案劃分到一個切片中,進而由一個Map Task去處理。目的是防止為單個小檔案啟動一個Map Task,浪費計算資源。

  --可將多個小檔案切片,合併為一個切片,進而由一個map任務處理
  set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 

相關文章