Я понимаю, как работает PID в целом, прочитав сообщения в блоге и изучив потоковую передачу Spark, чтобы понять, как она помогает при противодавлении. Код очень читабелен, но я не на 100% убежден в физической интерпретации исторической ошибки в ее реализации. Полное объяснение можно найти в потоке github и ниже:
Вот суть этого:
мы рассматриваем schedulingDelay как признак накопленной ошибки, что соответствует неотъемлемой части в ПИД-регуляторе. Интуитивно это имеет смысл: тот факт, что имеется задержка, означает, что у нас было слишком много элементов в предыдущих пакетах, и система не может обработать их в заданном интервале пакетов
Задача состоит в том, чтобы преобразовать этот индикатор из времени к скорости, которая является величиной, которую наш PID измеряет (и контролирует). Вот рассуждение:
задержка планирования s соответствует элементам переполнения s * processingRate. Это элементы, которые не могли быть обработаны в предыдущих пакетах, что приводит к этой задержке. Мы предполагаем, что processingRate не сильно изменился (поскольку это в основном мера производительности кластера, с небольшими вариациями, такими как контрольные точки), но это хорошее приближение
от числа переполненных элементов, которые мы можем вычислить при которые они будут очищены путем деления его на интервал между партиями. Эта скорость является нашей «исторической» ошибкой или неотъемлемой частью, поскольку, если бы мы вычитали эту скорость из предыдущей «расчетной скорости», не было бы никаких переполненных элементов, и задержка планирования была бы нулевой.
Существуют некоторые дополнительные сведения о единицах измерения, поскольку schedulingDelay и batchInterval указываются в миллисекундах, а скорости - в элементах / секундах, но если вы выполните математическое вычисление, вы заметите, что 1000s отменяются.
Однако я до сих пор не понимаю, почему историческая ошибка = (# переполнение элементов) / (интервал между партиями). Объяснение, что «if (# overflowing elements) = 0, затем (историческая ошибка) = 0» не объясняет использование (1 / интервал пакета) в качестве его коэффициента.
Мне кажется, сложная часть состоит в следующем: Легко рассуждать о накопленной ошибке, если ошибка является абсолютной величиной, например, количеством переполненных элементов, но какова накопленная ошибка показателя?
Мысли?
Кстати, установка 1 / пакетного интервала в качестве коэффициента может не быть большой проблемой в любом случае, потому что в конце дня это не что иное, как константа, которую вы можете настроить интегральным коэффициентом для компенсации.