起因sparkStream作為一個微流處理框架,每批次處理數據的時間應盡可能地接近批次間隔時間,才能保證流處理的高效和穩定。
批處理時間<<批間隔時間:流量太小,集群閑置,浪費資源,批處理時間>>批間隔時間:流量太大,集群繁忙,數據積壓導致系統崩潰#####通過設置spark.streaming.kafka.maxRatePerPartition可以靜態調整每次拉取的最大流量,但是需要重啟集群。
背壓機制,不需要重啟集群就能根據當前系統的處理速度智能地調節流量閾值的方案。
設置spark.streaming.backpressure.enabled為true開啟反壓機制后,sparkStreaming會根據上批次和本批次的處理速率,自動估算出下批次的流量閥值,我們可以通過改變幾個增益比例來調控它的自動估算模型。
它的底層采用的是Guava的令牌桶算法實現的限流:程序到桶里取令牌,如果取到令牌就緩存數據,取不到就阻塞等待。通過改變放令牌的速度即可實現流量控制。
其它方案 1. 如果增加kafka的分區數,spark也會增加相應數目的消費者去拉取,可以提升拉取效率;
2. 如果降低批次間隔時間,每次拉取的數據量會減少,可以提升處理數據的速度,差距的間隔時間可以通過窗口來彌補。