當前位置:編程學習大全網 - 源碼下載 - Flink 精選如何分析及處理反壓?

Flink 精選如何分析及處理反壓?

反壓(backpressure)是流式計算中十分常見的問題。 反壓意味著數據管道中某個節點成為瓶頸,處理速率跟不上上遊發送數據的速率,而需要對上遊進行限速 。由於實時計算應用通常使用消息隊列來進行生產端和消費端的解耦,消費端數據源是 pull-based 的,所以 反壓通常是從某個節點傳導至數據源並降低數據源(比如 Kafka consumer)的攝入速率。

反壓並不會直接影響作業的可用性,它表明作業處於亞健康的狀態,有潛在的性能瓶頸並可能導致更大的數據處理延遲 。通常來說,對於壹些對延遲要求不高或者數據量較少的應用,反壓的影響可能並不明顯。然而對於規模比較大的 Flink 作業,反壓可能會導致嚴重的問題。

網絡流控的實現: 動態反饋/自動反壓

Flink 的數據交換有3種:① 同壹個 Task 的數據交換 ,② 不同 Task 同 JVM 下的數據交換 ,③ 不同 Task 且不同 TaskManager 之間的交換 。

通過 算子鏈 operator chain 串聯多個算子 ,主要作用是避免了 序列化 和 網絡通信 的開銷。

在 TaskA 中,算子輸出的數據首先通過 record Writer 進行序列化,然後傳遞給 result Partition 。接著,數據通過 local channel 傳遞給 TaskB 的 Input Gate,然後傳遞給 record reader 進行反序列。

與上述(2)的不同點是數據先傳遞給 netty ,通過 netty 把數據推送到遠程端的 Task 。

1.5 版本之前是采用 TCP 流控機制,而沒有采用feedback機制 。

發送端 Flink 有壹層Network Buffer,底層用Netty通信即有壹層Channel Buffer,最後Socket通信也有Buffer,同理接收端也有對應的3級 Buffer。Flink (before V1.5)實質是利用 TCP 的流控機制來實現 feedback ?。

TCP報文段首部有16位窗口字段,當接收方收到發送方的數據後,ACK響應報文中就將自身緩沖區的剩余大小設置到放入16位窗口字段 。該窗口字段值是隨網絡傳輸的情況變化的,窗口越大,網絡吞吐量越高。

參考:1. 計算機網絡3.1 運輸層 - TCP/UDP協議

2. Apache Flink 進階教程(七):網絡流控及反壓剖析

例子:TCP 利用滑動窗口限制流量

步驟1 :發送端將 4,5,6 發送,接收端也能接收全部數據。

步驟2 :consumer 消費了 2 ,接收端的窗口會向前滑動壹格,即窗口空余1格。接著向發送端發送 ACK = 7、window = 1 。

步驟3:發送端將 7 發送後,接收端接收到 7 ,但是接收端的 consumer 故障不能消費數據。這時候接收端向發送端發送 ACK = 8、window = 0 ,由於這個時候 window = 0,發送端是不能發送任何數據,也就會使發送端的發送速度降為 0。

在 Flink 層面實現反壓機制,通過 ResultPartition 和 InputGate 傳輸 feedback 。

? Storm 在每壹個 Bolt 都會有壹個監測反壓的線程(Backpressure Thread),這個線程壹但檢測到 Bolt 裏的接收隊列(recv queue)出現了嚴重阻塞就會把這個情況寫到 ZooKeeper 裏,ZooKeeper 會壹直被 Spout 監聽,監聽到有反壓的情況就會停止發送 。因此,通過這樣的方式匹配上下遊的發送接收速率。

組件 RateController 監聽負責監聽“OnBatchCompleted”事件,然後從中抽取processingDelay 及schedulingDelay信息。RateEstimator 依據這些信息估算出最大處理速度(rate),最後由基於Receiver的Input Stream?將 rate 轉發給 Executor 的 BlockGenerator,並更新RateLimiter 。

Flink、Storm、Spark Streaming 的反壓機制都采用動態反饋/自動反壓原理,可以動態反映節點限流情況,進而實現自動的動態反壓。

Flink Web UI 的反壓監控提供了 Subtask 級別 的反壓監控。監控的原理是 通過Thread.getStackTrace() 采集在 TaskManager 上正在運行的所有線程,收集在緩沖區請求中阻塞的線程數(意味著下遊阻塞),並計算緩沖區阻塞線程數與總線程數的比值 rate 。其中,rate < 0.1 為 OK,0.1 <= rate <= 0.5 為 LOW,rate > 0.5 為 HIGH。

Network ?和? task I/O ?metrics 是輕量級反壓監視器,用於正在持續運行的作業,其中壹下幾個 metrics 是最有用的反壓指標。

采用 Metrics 分析反壓的思路: 如果壹個 Subtask 的發送端 Buffer 占用率很高,則表明它被下遊反壓限速了;如果壹個 Subtask 的接受端 Buffer 占用很高,則表明它將反壓傳導至上遊 。

下表把 inPoolUsage 分為?floatingBuffersUsage 和 exclusiveBuffersUsage ,並且總結上遊 Task?outPoolUsage 與?floatingBuffersUsage 、 exclusiveBuffersUsage 的關系,進壹步的分析壹個 Subtask 和其上遊 Subtask 的反壓情況。

上述主要通過 TaskThread 定位反壓,而分析反壓原因 類似壹個普通程序的性能瓶頸 。

通過 Web UI 各個 SubTask 的 Records Sent 和 Record Received 來確認 ,另外 Checkpoint detail 裏不同 SubTask 的 State size 也是壹個分析數據傾斜的有用指標。解決方式把數據分組的 key 進行本地/預聚合來消除/減少數據傾斜。

對 TaskManager 進行 CPU profile ,分析 TaskThread 是否跑滿壹個 CPU 核:如果沒有跑滿,需要分析 CPU 主要花費在哪些函數裏面,比如生產環境中偶爾會卡在 Regex 的用戶函數(ReDoS);如果沒有跑滿,需要看 Task Thread 阻塞在哪裏,可能是 用戶函數本身有些同步的調用 ,可能是 checkpoint 或者 GC 等系統活動 。

TaskManager JVM 各區內存不合理導致的頻繁 Full GC 甚至失聯。可以加上?-XX:+PrintGCDetails 來打印 GC 日誌的方式來觀察 GC 的問題。推薦TaskManager 啟用 G1 垃圾回收器來優化 GC。

  • 上一篇:易經講解11位手機號,11位手機號碼每壹位的含義
  • 下一篇:單頁面seo優化方法有哪些?
  • copyright 2024編程學習大全網