spark反壓速率計算

當spark開啓反壓之後,將會在PIDRateEstimator中根據上一批任務的處理延時情況計算下一批接收數據的大小。

def compute(
    time: Long,
    elements: Long,
    processingDelay: Long,
    schedulingDelay: Long): Option[Double]

計算需要四個參數,該批數據處理結束時間time,該批處理元素個數elements,以及處理時間和調度延遲時間。

val delaySinceUpdate = (time - latestTime).toDouble / 1000

首先計算本次結束時間相比上一批數據處理結束相差的時間delaySinceUpdate,單位秒。

val processingRate = numElements.toDouble / processingDelay * 1000

之後用總處理數量除以總處理時間得到該批的單秒處理速率processingRate,單位數據量/秒。

val error = latestRate - processingRate

error則爲上次處理速率與本次速率之差,可以理解爲上次預估處理性能與本次實際處理性能的誤差,單位數據量/秒,默認權重1。

val historicalError = schedulingDelay.toDouble * processingRate / batchIntervalMillis

histoticalError則爲調度延遲乘本次處理速率的乘積(由於調度延遲導致缺少處理的數據量)除以任務批次時間,也就是單批數據由於調度延遲導致的單秒缺少的數據處理量,單位數據量/秒,默認權重0.2。

val dError = (error - latestError) / delaySinceUpdate

dError則爲當前誤差與上一次誤差的差除以前後兩次完成時間間隔,單位數據量/秒的平方,默認權重0。

val newRate = (latestRate - proportional * error -
                            integral * historicalError -
                            derivative * dError).max(minRate)

最後得到的新速率則爲上次速率根據權重乘上述誤差類型之後的結果,存在一個默認不會低於的的最小速率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章