資料傾斜:在分布式程式分配任務的時候,任務分配的不平均。
資料傾斜,在企業開發中是經常遇到的,以及是非常影響效能的一種場景。資料傾斜一旦發生,橫向拓展只能緩解這個情況,而不能解決這個情況。
如果遇到資料傾斜,一定要從根本上去解決這個問題。而不是想著加機器來解決。
方案一用前面講過的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...