Я изучал Apache Flink в течение нескольких дней, и у меня есть некоторые сомнения относительно концепции Task Slot. Хотя об этом было задано несколько вопросов, есть момент, которого я не понимаю.
Я использую игрушечное приложение для тестирования, запуская локальный кластер. Я отключил цепочку операторов
Из документации я знаю, что слоты позволяют изолировать память, а не ЦП. Читая документы, кажется, что слот задач - это поток Java.
1) Когда я развертываю свое приложение с parallelism=1, все подзадачи операторов развертываются в одном слоте. Однако, если я распечатаю идентификатор текущего потока из метода open()
метода AbstractStreamOperator
, я увижу разные идентификаторы для разных подзадач. Итак, разве они не используют один и тот же поток (то есть слот?).
2) Если я меняю параллелизм с 1 на 3, мне нужно 3 слота, чтобы приложение было правильно переразвернуто. Документация подтверждает, что количество слотов ограничивает параллелизм, который я могу иметь. Но почему у меня могут быть подзадачи разных операторов в одном слоте, а подзадачи одного оператора в одном слоте быть не может?
Спасибо за любое объяснение!
Идея слотов состоит в том, чтобы разделить доступные ресурсы на более мелкие части. Доступная управляемая память равномерно распределяется между всеми слотами. Циклы ЦП и память кучи JVM не изолированы должным образом относительно слотов.
В каждом слоте можно развернуть один или несколько Tasks
. Flink Task
выполняется выделенным потоком. Таким образом, вы можете иметь несколько потоков, работающих в одном и том же слоте, если у вас развернуто несколько Tasks
.
Task
представляет собой параллельный экземпляр одного оператора Flink или нескольких операторов, если они могут быть объединены в цепочку. Цепочка не всегда возможна или желательна, но если ее применить, она объединит операторы, чтобы они выполнялись одним и тем же Task
потоком. Обычно это более эффективно, так как меньше переключений контекста и нет передачи записей другому потоку.
Чтобы улучшить использование ресурсов (особенно для Tasks
, которым требуется мало ресурсов) и упростить рассуждение о том, сколько слотов вам нужно для запуска программы Flink, Flink поддерживает совместное использование слотов. Совместное использование слотов означает, что параллельные экземпляры разных операторов могут быть развернуты в одном и том же слоте. Благодаря этой особенности Flink создает как можно более длинные пайплайны разных операторов и разворачивает их в один и тот же слот. Это также дает хороший эффект, заключающийся в том, что вы увеличиваете совместное размещение производителей с их соответствующими потребителями. Благодаря этой функции пользователи знают, что им нужно предоставить столько слотов, сколько максимальный параллелизм всех операторов одной топологии.
Однако, поскольку вы по-прежнему хотите распределять параллельные экземпляры оператора по всем доступным TaskExecutors
, Flink не поддерживает развертывание параллельных экземпляров одного и того же оператора в одном и том же слоте. Если вы хотите это сделать, то вам следует просто уменьшить параллелизм соответствующего оператора до 1
.