Могу ли я иметь несколько подзадач оператора в одном слоте во Flink? - PullRequest
0 голосов
/ 09 апреля 2019

Я изучал Apache Flink в течение нескольких дней, и у меня есть некоторые сомнения относительно концепции слота задач.Хотя об этом было задано несколько вопросов, есть пункт, который я не понимаю.

Я использую игрушечное приложение для тестирования, запускаю локальный кластер.Я отключил цепочку операторов

Я знаю из документов, что слоты позволяют изолировать память, а не изоляцию процессора.Читая документы, кажется, что Слот Задачи является потоком Java.

1) Когда я развертываю свое приложение с параллелизмом = 1, все подзадачи операторов развертываются в одном слоте.Однако, если я печатаю текущий идентификатор потока из open() метода AbstractStreamOperator, я вижу разные идентификаторы для разных подзадач.Итак, не разделяют ли они один и тот же поток (т. Е. Слот?).

2) Если я изменю параллелизм с 1 на 3, мне потребуется 3 слота для повторного развертывания приложенияправильно.Документация подтверждает, что количество слотов ограничивает параллелизм, который я могу иметь.Но почему я могу иметь подзадачи разных операторов в одном и том же слоте, в то время как я не могу иметь подзадачи одного и того же оператора в одном и том же слоте?

Спасибо за любое объяснение!

1 Ответ

3 голосов
/ 09 апреля 2019

Идея слотов состоит в том, чтобы разделить имеющиеся ресурсы на более мелкие части. Доступная управляемая память равномерно распределяется между всеми слотами. Циклы ЦП и память кучи JVM не являются должным образом изолированными по отношению к слотам.

В каждом слоте вы можете развернуть один или несколько Tasks. Flink Task выполняется выделенным потоком. Таким образом, вы можете иметь несколько потоков, работающих в одном и том же слоте, если в нем развернуто несколько Tasks.

A Task представляет параллельный экземпляр одного оператора Flink или нескольких операторов, если они являются цепочечными. Цепочка не всегда возможна или желательна, но при ее применении операторы сливаются так, что они выполняются одним и тем же потоком Task. Это обычно более эффективно, так как меньше переключений контекста и нет передачи записей другому потоку.

В целях улучшения использования ресурсов (особенно для Tasks, которым требуются небольшие ресурсы) и для упрощения рассуждений о том, сколько слотов необходимо для запуска программы Flink, Flink поддерживает совместное использование слотов. Совместное использование слотов означает, что параллельные экземпляры разных операторов могут быть развернуты в одном и том же слоте. Благодаря этой функции Flink создает максимально длинные конвейеры разных операторов и размещает их в одном слоте. Это также имеет приятный эффект, так как вы увеличиваете совместное размещение производителей с их соответствующими потребителями. Благодаря этой функции пользователи знают, что им нужно предоставить столько слотов, сколько максимально возможно для всех операторов одной топологии.

Однако, поскольку вы все еще хотите распределить параллельные экземпляры оператора по всем доступным TaskExecutors, Flink не поддерживает развертывание параллельных экземпляров одного и того же оператора в одном и том же слоте. Если вы хотите сделать это, вам следует просто уменьшить параллелизм соответствующего оператора до 1.

...