資料傾斜優化

2021-10-14 14:04:09 字數 2859 閱讀 5190

資料傾斜:在分布式程式分配任務的時候,任務分配的不平均。

資料傾斜,在企業開發中是經常遇到的,以及是非常影響效能的一種場景。

資料傾斜一旦發生,橫向拓展只能緩解這個情況,而不能解決這個情況。

如果遇到資料傾斜,一定要從根本上去解決這個問題。而不是想著加機器來解決。

方案一用前面講過的map join smb join 這些優化去解決。

效果不太好,本身這些提高執行效能的方案,順帶著將傾斜的效能也提公升一點,本質上不是解決傾斜的方案。

方案二

sekw join

方案的方式是:

對傾斜列的資料,進行單獨處理。也就是遇到傾斜列的資料的時候,直接找乙個中間目錄臨時儲存,當前mr不去處理

等當前mr完成後,在單獨處理這個傾斜的資料集。

這種解決方式有乙個前置條件,hive必須要知道,哪個列的資料傾斜了。

如何讓hive知曉哪個列是傾斜列,就有2種方式

方式1:執行時判斷

在執行mr的過程中,hive會對資料記錄計數器,當計數器的值大於某個閾值的時候,認為這個資料是傾斜的列,對其進行單獨處理。

方式2:編譯時判斷

指的就是,執行sql的人提前知曉某個列就是傾斜列。

在建表的時候,就指定某個列是傾斜列即可。

引數

# 開啟傾斜優化,針對傾斜優化的總開關

set hive.

optimize

.skewjoin=

true

;# 設定執行時判斷的時候,對傾斜資料量的閾值

set hive.skewjoin.

key=

100000

;# 開啟編譯時的傾斜優化,針對編譯時的開關

set hive.

optimize

.skewjoin.compiletime=

true

;# 示例語句,這個語句用於編譯時判斷,提前告知hive哪個列是傾斜的

create

table list_bucket_single (

key string,

value string)

-- 傾斜的字段和需要拆分的key值

skewed by

(id)on(

1,5,

6)-- 為傾斜值建立子目錄單獨存放

[stored as directories]

;-- 上面的引數可以組合一塊使用

-- 當表有skewed by的設定,走編譯時優化

-- 如果表沒有這個設定,就執行時優化

在企業場景中,滿足編譯時的判斷的場景不多,多數時候還是靠執行時來優化。

編譯時的一種場景舉例:

比如,傳智播客的北京和上海校區很火爆,90%的學生都來這倆校區。

學生報名的事實表,鐵定在北京和上海兩個校區的id上產生傾斜。

這樣的場景才是適合編譯時的,也就是在幹活之前就分析出來哪個地方是傾斜了。

資料傾斜,無法避免,這是事實產生事件的現實對映。

只要你沒有能力解決現實事件,那麼事件的產生就會傾斜。

我們要做的是,在資料傾斜的前提下,完成效能優化。

union優化

在前面的優化中,不管是執行時優化,還是編譯時優化,都會產生兩份結果。

這兩份結果最終都需要進行union操作合併為乙份結果

引數:set hive.optimize.union.remove=true;

開啟這個引數的時候,對中間資料進行重複性利用。提公升union的效能。

重複利用:不會單獨開啟任務對多份資料執行合併,而是每乙個任務在執行之後直接將結果輸出到目的地。

不開啟union合併優化:

mr1 對普通資料進行處理,輸入路徑:/tmp/1

mr2 對傾斜資料進行處理,輸入路徑:/tmp/2

合併後,資料寫入最終目的地:/user/hive/warehouse/***.db/***table/

如果開啟了優化:

mr1 對普通資料進行處理,輸入路徑:/user/hive/warehouse/***.db/***table/

mr2 對傾斜資料進行處理,輸入路徑:/user/hive/warehouse/***.db/***table/

對於資料傾斜,典型的兩個效能點:

分組聚合。

前提條件:對資料走平均打散,不按照hash雜湊

利用mapreduce的combina 機制,在map端完成預聚合操作。

因為,分組是必聚合的,所以,我們可以做預聚合

引數:

hive.map.aggr=

true

;

大combina機制,對預聚合產生在第乙個mr的reduce端。

最終聚合產生在第二個mr中

將map端的combina擴散到真個mr,最終的聚合交由第二個mr來做。

在絕對的效能上:優化1是效能最好的,因為節省了很多的中間資料傳輸。同時乙個mr搞定,不需要搞第二個mr來做。

但是,如果資料量巨大,這個mapreduce的任務的壓力就會很大,同時執行時間可能很長。

執行時間過長,中間的變數就不好控。一旦出現問題,重頭再來。

所以,對於海量資料一般使用優化2的方式,因為如果出現問題,起碼可以從第一階段的結果再來。

引數:

hive.groupby.skewindata=

true

;

mr資料傾斜優化

資料傾斜是資料中的常見情況。資料中不可避免地會出現離群值 outlier 並導致資料傾斜。這些離群值會顯著地拖慢mapreduce的執行。常見的資料傾斜有以下幾類 資料頻率傾斜 某乙個區域的資料量要遠遠大於其他區域。資料大小傾斜 部分記錄的大小遠遠大於平均值。在map端和reduce端都有可能發生資...

hive 資料傾斜優化

hive資料傾斜 group by 中的計算均衡優化 1.map端部分聚合 先看看下面這條sql,由於使用者的性別只有男和女兩個值 未知 如果沒有map端的部分聚合優化,map直接把groupby key 當作reduce key傳送給reduce做聚合,就會導致計算不均衡的現象。雖然map有100...

spark優化之資料傾斜

資料傾斜的概念 有的時候,我們可能會遇到大資料計算中乙個最棘手的問題 資料傾斜,此時spark作業的效能會比期望的差的多。資料傾斜調優,就是使用各種技術方案解決不同型別的資料傾斜問題以保證spark作業的效能 絕大多數task執行的都非常快,但個別task執行極慢,比如,總共有1000個task,9...