微吼云上線多路互動直播服務 加速多場景互動直播落地
1827
2025-03-31
一、??????????? 什么是statebackend
狀態(State),Flink官方給出的解釋是:在工作流中,當算子只關心每一個獨立到來的事件并對其進行處理,這被稱為無狀態的算子;反之,如果算子需要記住多個事件的信息并對它們進行聯合處理時,它就是有狀態的算子。
狀態是需要存儲的,比如窗口聚合操作,當你開了一個5分鐘的窗口想要進行聚合計算,你需要先把這5分鐘內到來的事件相關信息先保存起來,以便于后面的計算。負責存儲狀態的模塊,就叫做狀態后端(Statebackend)。Flink目前支持3種Statebackend:Memory,Filesystem,Rocksdb。其中,最適合生產環境使用的,就是Rocksdb。因此,RocksdbStatebackend性能調優也是Flink流作業在生產中進行調優的關鍵環節。
二、??????????? 進一步思考的動力
三、??????????? 優化方法的總結
在這里我先對文章中的調優方法進行一下簡單的總結:
首先,Rocksdb數據存儲需要落盤,而在taskmanager中多個slot并發對state進行訪問的時候,由于磁盤的IO大小限制,可能導致某些讀寫狀態的操作需要排隊等待。
因此,為了解決這個問題,Flink中,允許對state存儲的地址配置多個路徑,而每個路徑可以掛載不同的磁盤,這樣可以分攤單個磁盤的IO壓力。
但是,在Flink中,分配state存儲路徑的方式是隨機的,經常會出現多個并發進行讀寫狀態還是分配到了同一塊磁盤上。
因此,我們可以對Flink中的代碼進行一些小改動,將隨機分配路徑的方式改成輪詢。如果同一個節點有多個taskmanager,需要跨進程進行輪詢分配的話,可以考慮zookeeper等第三方組件維護一個公用的DistributedAtomicInteger。
以上基本上對Statebackend的調優完成了,我按照這種方式進行了測試,key在隨機生成完全打散的情況下,性能大約能夠提升20%~50%,還是很可觀的:
圖 單磁盤情況下單并發性能大約11200 ~ 12700
圖 多磁盤分攤下單并發性能提升至13500 ~ 17000
但隨之而來還有一個問題,就是實際生產中,key不可能永遠都是打散并且平均分配的,經常會出現數據傾斜的問題,這樣很有可能造成某些Slot需要頻繁訪問State,而某些Slot訪問頻率相對較少,即多個磁盤的IO是不平衡的。那么我們能否做到在每次對State進行訪問的時候,根據磁盤的IO負載情況,動態選擇IO較小的磁盤呢?
四、??????????? 進一步思考
先從整體的宏觀系統來考慮,問題可以簡化為多個進程需要相互協調,以完成對多個物理磁盤的讀寫性能最優。而進程與磁盤之間,還夾雜著操作系統。就像上面提到的需要用到第三方zookeeper才能進行多進程協調一樣,操作系統能否提供一個管理者的角色,用于將slot的狀態訪問請求進行均衡地分發到不同的物理磁盤中執行?
答案是肯定的,以linux為例,這個管理者就是邏輯卷管理器(LVM),我們先來了解一下LVM:
邏輯卷管理器(LogicalVolumeManager)本質上是一個虛擬設備驅動,是在內核中塊設備和物理設備之間添加的一個新的抽象層次,如圖所示。它可以將幾塊磁盤(物理卷,PhysicalVolume)組合起來形成一個存儲池或者卷組(VolumeGroup)。LVM可以每次從卷組中劃分出不同大小的邏輯卷(LogicalVolume)創建新的邏輯設備。底層的原始的磁盤不再由內核直接控制,而由LVM層來控制。對于上層應用來說卷組替代了磁盤塊成為數據存儲的基本單元。LVM管理著所有物理卷的物理盤區,維持著邏輯盤區和物理盤區之間的映射。LVM邏輯設備向上層應用提供了和物理磁盤相同的功能,如文件系統的創建和數據的訪問等。但LVM邏輯設備不受物理約束的限制,邏輯卷不必是連續的空間,它可以跨越許多物理卷,并且可以在任何時候任意的調整大小。相比物理磁盤來說,更易于磁盤空間的管理。
圖 邏輯卷管理器原理圖
試想一下,如果LVM對上層進程屏蔽了多磁盤IO負載并負責進行數據的調度分配,那么slot只需要專職進行狀態的讀寫即可,職責專一,功能解耦。
那么LVM是否有多磁盤負載均衡管理的能力呢?答案還是肯定的——磁盤條帶化(striping)。讓我們再來了解一下條帶化:
大多數磁盤系統都對訪問次數(每秒的 I/O 操作,IOPS)和數據傳輸率(每秒傳輸的數據量,TPS)有限制。當達到這些限制時,后面需要訪問磁盤的進程就需要等待,這時就是所謂的磁盤沖突。
避免磁盤沖突是優化 I/O 性能的一個重要目標,而 I/O 性能的優化與其他資源(如CPU和內存)的優化有著很大的區別 ,I/O 優化最有效的手段是將 I/O 最大限度的進行平衡。
條帶化技術就是一種自動的將 I/O 的負載均衡到多個物理磁盤上的技術,條帶化技術就是將一塊連續的數據分成很多小部分并把他們分別存儲到不同磁盤上去。這就能使多個進程同時訪問數據的多個不同部分而不會造成磁盤沖突,而且在需要對這種數據進行順序訪問的時候可以獲得最大程度上的 I/O 并行能力,從而獲得非常好的性能。
圖 條帶化示意圖(圖片來自互聯網)
從概念上來看,條帶化已經完全滿足了我們的需求,而且對于目前的大多數的操作系統來說,是天然支持的。我在進行條帶化配置之后,經過簡單的測試,性能大約能夠提升50%甚至1x,由于篇幅原因下回再補上測試結果。附上條帶化的配置方式:
#1.創建物理卷PV
pvcreate?/dev/sd{b,c,d,e}1
#2.創建邏輯卷組VG
vgcreate?vg0?/dev/sd[bc]1
#3.創建LV并配置條帶化
lvcreate?-L?1G?-n?test2?-i?2?-I?64?vg0
五、??????????? 總結
本文用一句話來總結,就是利用磁盤條帶化技術實現Flink對RocksDB進行狀態訪問的優化。這樣做的好處就是:
1. 能夠更加充分利用磁盤IO
2. 不需要對Flink進行代碼改造
當然,最基本的條帶化是不保證可靠性的,如果一塊磁盤壞了有可能數據就全丟了。所以條帶化技術還有很多可靠性相關的調整以及進一步性能調優方式,大家可以查找相關資料進行深入研究。
華為云DLI服務已經實現了條帶化優化技術,歡迎體驗交流:https://www.huaweicloud.com/product/dli.html
數據湖探索 DLI
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。