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