火花流中PID速率控制器的实现

时间:2018-12-05 17:03:08

标签: apache-spark spark-streaming

我正在阅读Kafka中的Spark Streaming源代码。有一种速率控制算法,即PID。我访问了一些网站,这些网站已经获得了有关PID的一些基本知识。但是我仍然对新费率的计算感到困惑。

为什么新汇率是最新汇率减去P,I,D的组合?我认为PID控制算法的输出结果只是P,I,D的组合?

PID的组合是

combinations_pid

但是the new rate of Spark Streaming in part of Kafka is

// in seconds, should be close to batchDuration
val delaySinceUpdate = (time - latestTime).toDouble / 1000

// in elements/second
val processingRate = numElements.toDouble / processingDelay * 1000

// In our system `error` is the difference between the desired rate and the measured rate
// based on the latest batch information. We consider the desired rate to be latest rate,
// which is what this estimator calculated for the previous batch.
// in elements/second
val error = latestRate - processingRate

// The error integral, based on schedulingDelay as an indicator for accumulated errors.
// A scheduling delay s corresponds to s * processingRate overflowing elements. Those
// are elements that couldn't be processed in previous batches, leading to this delay.
// In the following, we assume the processingRate didn't change too much.
// From the number of overflowing elements we can calculate the rate at which they would be
// processed by dividing it by the batch interval. This rate is our "historical" error,
// or integral part, since if we subtracted this rate from the previous "calculated rate",
// there wouldn't have been any overflowing elements, and the scheduling delay would have
// been zero.
// (in elements/second)
val historicalError = schedulingDelay.toDouble * processingRate / batchIntervalMillis

// in elements/(second ^ 2)
val dError = (error - latestError) / delaySinceUpdate

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

有人知道吗?

0 个答案:

没有答案