HIVE 最佳化:
場景1. 分組聚合group by 導致資料傾斜 -- map端聚合 :
aggr=true
- 會在mapper端先group by一次,最後再把結果merge起來,為了減少reducer處理的資料量
- 指令: 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;