IoT資料傾斜如何解決

AIoT2688發表於2022-09-30

在開發實時Flink任務的時候,可能會出現任務業務延時較高,超出預期的時間範圍,導致資料無法及時正確產出的情景。比如摘要介紹的資料傾斜場景。這個時候就要從多個維度對任務進行調優。下面將介紹實時任務調優的一些方法。

 

定位效能瓶頸Vertex

首先要定位出現問題的Vertex。在 執行資訊 > Vertex拓撲中檢視節點的資訊。每個Vertex會有自己的健康分,當某個Vertex健康分過低時,該Vertex可能出現問題,從而影響整個鏈路。

圖片 1.png

鏈路中的 Vertex 也會出現反壓現象。反壓是指當下遊的Vertex處理資料的能力不足時,上游會停止傳送資料,避免資料丟失。定位反壓節點可以看IN_Q和OUT_Q指標。每個Vertex的資訊中,有IN_Q和OUT_Q指標,分別表示進入佇列和輸出佇列中元素個數/佇列總長度。當一個Vertex的IN_Q滿,OUT_Q空,則該節點有效能問題,會對上游的節點造成反壓。另外一種方式是, 節點資訊中,檢視BackPressure > Status,如果是綠色ok,則不存在反壓,如果是紅色high,則存在反壓,該節點的下游存在效能瓶頸。

圖片 2.png

找到效能出現瓶頸的節點後,開始對節點進行調優。

 

資源和引數調優

任務出現效能瓶頸一個很大的原因是資源分配不足,這個時候就需要對資源配置,例如 併發數(Parallelism)、CPU(Core)和堆記憶體(Heap Memory)進行調優。其中core的預設值是0.1,一般建議配置為0.25,除了當處理資料來源較小,且任務的計算邏輯不復雜的時候,可以為任務統一分配1CU,此時每個節點的core隨機根據節點的複雜度分配。

在core配置一定的情況下,調整節點的併發數,為節點分配資源。如果該節點是source節點,考慮資料來源表的大小和資料來源表分割槽的多少。根據資料來源表的大小分配併發數,且併發數不超過源表分割槽的數量。例如資料來源表是sls源表,只有兩個分割槽時,只用一個併發就夠了,最多兩個。如果該節點是中間的計算節點,預算計算節點的複雜度,根據複雜度分配併發數。儘量把含有複雜運算的節點拆解出來,為其獨立分配併發。

引數調優分為上下游引數的調優和作業引數的調優。針對上下游引數的調優主要是設定batchsize,因為flink處理流式資料,每條資料均會觸發上下讀寫,  為了降低上下游讀寫的壓力,設定batchsize可以批次讀寫資料。該引數在DDL的with引數中設定。

當任務涉及到聚合邏輯(group by, partition by等)時,需要加入任務調優引數。任務調優引數在作業引數中設定。

MiniBatch

提升吞吐,降低對下游壓力

LocalGlobal

最佳化資料傾斜問題

TTL

設定 State 狀態時間

 

程式碼調優

調整資源和引數後,如果任務仍存在效能瓶頸,需要最佳化程式碼。

資料傾斜問題

判斷資料傾斜:在執行資訊 > Vertex拓撲中選中一個節點後,在右側的詳細頁面中選擇SubTasks,檢視是否出現資料傾斜問題。觀察每個task的In Queue, Bytes Received和Records Received。如果某一兩個Task的In Queue百分比或者Bytes Received特別高,和其他的task的In Queue形成明顯差別,尤其當某個task In Queue的百分比長期為100%,其他的為0%,則出現了資料傾斜。

圖片 3.png 

解決方案

  1. 利用hashcode和MD5手動打散資料,儘量使資料均勻分佈。 Io T 資料 的一大特點就是資料傾斜比較嚴重,使用者的資料量差異較大,在進行聚合運算時,經常會出現 key 聚集的情況,這種現象反應到 flink 的任務劃分上,就是同一個 Vertex 拓撲 中,部分 subtasks 資源過載,無法快速處理完資料,造成整個任務的反壓現象。解決這個現象的辦法就是 進行資料的打散。

圖片 4.png

  1. 使用LocalGroupAggregate

在group by的時候開啟local aggregate。其中注意統計函式用sum的時候要配合filter,才能開啟local group aggregate。

 

分組排名問題TOPN

  1. TOPN 一共有三種演算法,效能從高到低分別是:UpdateFastRank、 UnaryUpdateRank和RetractRank。涉及TOP N函式時,內部演算法儘量使用UpdateFastRank。會使效能更好。下圖分別打散和不打散資料的效能對比和使用UpdateFastRank和RetractRank演算法時的效能對比。(上下兩個任務流程的資料來源完全相同)

 

圖片 5.png

 

  1. 在多個維度對指標進行排名時,儘量使程式並行化,多使用union all。例如 IoT 的資料層級細分很細,有云賬號,租戶,例項,產品, 裝置的層級概念,這些資料 具有地域特性,地域的粒度也可以層級細分到國家,省份,城市等。所以當需要在不同維度對指標進行不同地域粒度的排名時,可以分別進行類目處理,平行計算,再用union all的方式整合,提高資料處理效率。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70017009/viewspace-2916913/,如需轉載,請註明出處,否則將追究法律責任。

相關文章