① 大數據數倉建設性能優化方案
大數據數倉的性能優化主要圍繞以下四個方面:
在數據倉庫建設的過程中,我們不可避免的要執行數據任務,那麼這些任務如何進行配置才會是最優的?如果任務調度配置存在問題,將會導致出現瓶頸任務,或者無法及時提供業務所需的數據,這時我們就需要首先從調度方面來考慮,是不是有些任務的調度時間設置不合理?或者是不是有的任務的優先順序設置不合理?
對於數倉的建模而言,其實可以分為3NF建模和維度建模,推薦使用維度建模方式,可以按照星型模型或者雪花模型架構的方式去建模。3NF建模方式或者實體建模方式的應用性會差一點,在很多時候其性能也會差一點,但3NF會避免數據的冗餘,其擴展性會好一些。而維度建模會有一定的數據冗餘,並且冗餘程度會很高,但是對於上層使用者而言,其易用性要好很多,並且其查詢的性能也會好很多,雖然犧牲了一定的可擴展性,但是仍然在可接受的范圍之內。之所以在大數據的框架下推薦使用維度建模,是因為建模產生的數據冗餘對於大數據離線數倉來說,存儲的成本並不高,因為其都屬於SATA盤的存儲,這樣的存儲成本是很低的。
總之,在大數據框架下推薦大家使用維度建模,使用星型模型或者雪花模型建模的方式,這樣無論對於後續的運維還是後續的數據使用而言,都是比較便利的,並且性能會好一些。星型模型其實就是中間一個事實表,周邊圍繞著一堆維度表,其結構會簡單一些,使用比較方便,性能也比較好;對於雪花模型而言,維度表可能還會繼續關聯其他的維度表,這種方式就是雪花模型,它會略微比星型模型復雜一些。其實星型模型也可以理解為較為簡單的雪花模型。這里推薦大家使用星型模型,當然如果業務非常復雜,必須要使用雪花型也可以使用。這是因為星型模型雖然有數據冗餘,但是其結構比較簡單,容易理解,而且使用起來只需要A傳給B就可以了,不需要再關聯一個C。
除了上述兩個較大的關鍵點之外,還有一些需要注意的小點,比如中間表的使用。我們一般將數倉分為三層,第一層做緩沖,第二層做整合,第三層做應用。但是並不是嚴格的只能分為三層,中間可能會有一些中間表,用於存儲中間計算的結果,如果能夠利用好中間表則會增強數倉的易用性和整體的性能。中間表的使用主要在數倉的第二層裡面,因為需要整合數據,但整合後的數據仍是明細數據,對於這些表而言,數據量往往會比較大,而且會有見多的下游任務依賴這個表,因此可以做一些輕度的匯總,也就是做一些公共的匯總的中間表,這樣應用層可以節省很多的計算量和成本。此外,雖然建議使用中間表,但也要注意中間表的數量,因為中間表數量過多,就會有太多的依賴層級。
在某些業務場景下,我們還需要對寬表進行拆表,拆表的情況一般發生在該表的欄位較多,而其中幾個欄位的產出時間較晚,導致整個表的交付時間也會延遲,在這種情況下我們可以將這幾個欄位單獨拆出來處理,這樣就不會因為幾個欄位影響其餘業務的使用。
與拆表相對的情況是合表,隨著業務的增多,可能會有多個表中存放類似的數據指標,此時,我們可以將多個表整合到一個表中,減少數據任務的冗餘。
表分區的功能一定要合理利用,這對於性能會產生很大的影響,一級分區一般都是按照天劃分的,建議大家一天一個增量或者一天一個全量來做。二級分區的選擇反而會多一些,首先大家要烤爐是否建立二級分區,其次大家再選擇二級分區的建立方式。二級分區比較適合於在where語句中經常使用到的欄位,而且這個欄位應該是可枚舉的,比如部門名稱這樣的。這里還有一個前提,就是如果這個欄位的值的分布是非常不均勻的,那麼就不太建議做二級分區。
離線數倉的計算任務基本都是通過SQL實現,這里也只講在SQL部分如何進行優化。我們平時在進行數據處理,數據清洗,數據轉換,數據加工的過程中都會使用到SQL。對於大數據體系下的SQL的優化而言,主要集中在兩個大的方面進行:減少數據輸入和避免數據傾斜。減少數據輸入是最核心的一點,如果數據輸入量太大,就會佔用很多的計算資源。而數據傾斜是在離線數倉中經常會遇到的,數據傾斜分為幾種,需要針對性的進行優化。
對有分區的表,合理使用分區可以過濾數據,避免全表掃描,有效的降低計算的數據輸入。
SQL支持只讀取一次源數據,然後將其寫入到多個目標表,這樣就保證了只做一次查詢。語法如下
當我們在使用join,Rece或者UDF時,先對數據進行過濾也能有效的提高任務的效率
當發生數據再Map階段傾斜的情況,第一種處理方式反饋至業務層面,看能否通過業務層面的修改讓kv值均衡分布,如果業務層面無法處理,那麼可以調整Map的個數,也就是加大Map的計算節點,默認情況是每256M的數據為一個計算節點,我們可以將其調小,也就是加大Map處理的節點的個數,使得數據分割的更加均勻一些。
Join階段的傾斜也是比較常見的,其解決方案需要分鍾如下幾種情況處理:
Rece傾斜可能的情況有以下幾種:
總結一下,性能調優歸根結底還是資源不夠了或者資源使用的不合理,或者是因為任務分配的不好,使得某些資源分配和利用不合理。