當使用Spark Streaming的Direct方式接受Kafka資料時, 如果kafka中的資料過多, 會導緻spark資料積壓, 無法準時完成作業, 甚至OOM。
Spark的運作名額及調優的目标
共兩個運作名額:排程延遲與執行延遲。
調優的目标是在SparkStreaming設定的批次時間間隔内, spark能夠完整處理完一個批次, 而不會出現無法準時完成作業, 資料堆壓等問題。
PS: 要提升資料處理的吞吐量, 就提升kafka的分區數
限制Kafka的最大流量
配置項
spark.streaming.kafka.maxRatePerPartition
, 設定了每秒鐘從每個分區中所獲得的資料條數的最大值, 每個批次處理的資料條數 = 批次時間 * 分區數 * N
背壓機制(back pressure) 彈性地調整Kafka的流量
在上一節中的配置項難以調控, 具體的值不易設定, 可以使用back pressure機制來動态地調整從kafka獲得的資料量。 back pressure機制會根據上一批次的運作情況來動态調整擷取的資料量。
打開back pressure: 設定
spark.streaming.backpressure.enabled
為
true
二者結合來調控kafka的流量
在開啟背壓機制時, 程式運作的第一個批次沒有其他批次的運作情況作為參考, 會擷取相當多的資料, 可能會導緻OOM, 是以需要設定kafka的最大流量。 在兩者均開啟的情況下, 背壓機制劃定了資料量的下限, 另一個劃定了上限, 可以有效控制SparkStreaming所接受到的資料量。
轉載于:https://my.oschina.net/dreamness/blog/3072799