
一 問題回顧

-
本地盤依賴限制了存算分離。存算分離是近年來興起的新型架構,它解耦了計算和儲存,可以更靈活地做機型設計:計算節點強CPU弱磁碟,儲存節點強磁碟強網路弱CPU。計算節點無狀態,可根據負載彈性伸縮。儲存端,隨著物件儲存(OSS, S3)+資料湖格式(Delta, Iceberg, Hudi)+本地/近地快取等方案的成熟,可當作容量無限的儲存服務。使用者透過計算彈性+儲存按量付費獲得成本節約。然而,Shuffle對本地盤的依賴限制了存算分離。
-
寫放大。當Mapper Output資料量超過記憶體時觸發外排,從而引入額外磁碟IO。
-
大量隨機讀。Mapper Output屬於某個Reducer的資料量很小,如Output 128M,Reducer併發2000,則每個Reducer只讀64K,從而導致大量小粒度隨機讀。對於HDD,隨機讀效能極差;對於SSD,會快速消耗SSD壽命。
-
高網路連線數,導致執行緒池消耗過多CPU,帶來效能和穩定性問題。
-
Shuffle資料單副本,大規模叢集場景壞盤/壞節點很普遍,Shuffle資料丟失引發的Stage重算帶來效能和穩定性問題。
二 RSS發展歷程
1 Sailfish
2 Dataflow
3 Riffle
4 Cosco
5 Zeus
6 RPMP
7 Magnet
8 FireStorm
-
整合到Spark內部還是獨立服務。 -
RSS服務側架構,選項包括:Master-Worker,含輕量級狀態管理的去中心化,完全去中心化。 -
Shuffle資料的儲存,選項包括:記憶體,本地盤,DFS,物件儲存。 -
多副本的實現,選項包括:Client多推,服務端做Replication。
三 阿里雲RSS核心架構
-
獨立服務。考慮到將RSS整合到Spark內部無法滿足存算分離架構,阿里雲RSS將作為獨立服務提供Shuffle服務。 -
Master-Worker架構。透過Master節點做服務狀態管理非常必要,基於etcd的狀態狀態管理能力受限。 -
多種儲存方式。目前支援本地盤/DFS等儲存方式,主打本地盤,將來會往分層儲存方向發展。 -
服務端做Replication。Client多推會額外消耗計算節點的網路和計算資源,在獨立部署或者服務化的場景下對計算叢集不友好。
-
Mapper在首次PushData時請求Master分配Worker資源,Worker記錄自己所需要服務的Partition列表。 -
Mapper把Shuffle資料快取到記憶體,超過閾值時觸發Push。 -
隸屬同個Partition的資料被Push到同一個Worker做合併,主Worker記憶體接收到資料後立即向從Worker發起Replication,資料達成記憶體兩副本後即向Client傳送ACK,Flusher後臺執行緒負責刷盤。 -
Mapper Stage執行結束,MetaService向Worker發起CommitFiles命令,把殘留在記憶體的資料全部刷盤並返回檔案列表。 -
Reducer從對應的檔案列表中讀取Shuffle資料。

1 狀態下沉

2 Adaptive Pusher
3 磁碟容錯
4 滾動升級

5 混亂測試框架

6 多引擎支援
7 測試


四 阿里雲RSS在小米的實踐
1 現狀及痛點

2 RSS在小米的落地
3 效果




五 開源
-
AE -
Spark多版本支援
-
Better 流控 -
Better 監控
-
Better HA -
多引擎支援