Идея слотов состоит в том, чтобы разделить имеющиеся ресурсы на более мелкие части. Доступная управляемая память равномерно распределяется между всеми слотами. Циклы ЦП и память кучи JVM не являются должным образом изолированными по отношению к слотам.
В каждом слоте вы можете развернуть один или несколько Tasks
. Flink Task
выполняется выделенным потоком. Таким образом, вы можете иметь несколько потоков, работающих в одном и том же слоте, если в нем развернуто несколько Tasks
.
A Task
представляет параллельный экземпляр одного оператора Flink или нескольких операторов, если они являются цепочечными. Цепочка не всегда возможна или желательна, но при ее применении операторы сливаются так, что они выполняются одним и тем же потоком Task
. Это обычно более эффективно, так как меньше переключений контекста и нет передачи записей другому потоку.
В целях улучшения использования ресурсов (особенно для Tasks
, которым требуются небольшие ресурсы) и для упрощения рассуждений о том, сколько слотов необходимо для запуска программы Flink, Flink поддерживает совместное использование слотов. Совместное использование слотов означает, что параллельные экземпляры разных операторов могут быть развернуты в одном и том же слоте. Благодаря этой функции Flink создает максимально длинные конвейеры разных операторов и размещает их в одном слоте. Это также имеет приятный эффект, так как вы увеличиваете совместное размещение производителей с их соответствующими потребителями. Благодаря этой функции пользователи знают, что им нужно предоставить столько слотов, сколько максимально возможно для всех операторов одной топологии.
Однако, поскольку вы все еще хотите распределить параллельные экземпляры оператора по всем доступным TaskExecutors
, Flink не поддерживает развертывание параллельных экземпляров одного и того же оператора в одном и том же слоте. Если вы хотите сделать это, вам следует просто уменьшить параллелизм соответствующего оператора до 1
.