Планирование Spark и YARN довольно запутанное.Я собираюсь ответить на вопросы в обратном порядке:
3) Вы не должны использовать динамическое распределение в потоковых заданиях Spark.
Проблема заключается в том, что Spark постоянно запрашивает YARN для большего числа исполнителей, посколькуПока есть отставание задач для запуска.Как только задание Spark получает исполнителя, оно сохраняет его до тех пор, пока исполнитель не будет бездействовать в течение 1 минуты (конечно, настраивается).В пакетных заданиях это нормально, потому что, как правило, существует большое непрерывное отставание задач.
Однако в потоковых заданиях в начале каждого микропакета наблюдается всплеск задач, но исполнители фактически простаивают чаще всего.времени.Таким образом, потоковое задание будет захватывать множество исполнителей, в которых оно не нуждается.
Чтобы исправить это, старый потоковый API (DStreams) имеет свою собственную версию динамического выделения: https://issues.apache.org/jira/browse/SPARK-12133. Этот JIRAесть дополнительные сведения о том, почему алгоритм Spark для динамического распределения не подходит для потоковой передачи.
Однако Spark Structured Streaming (вероятно, то, что вы используете) не поддерживает динамическое распределение: https://issues.apache.org/jira/browse/SPARK-24815.
tl; dr Spark запрашивает исполнителей на основе своего невыполненного задания, а не на используемой памяти.
1 & 2) @Vamshi T прав.Каждое приложение YARN имеет «Мастер приложений», который отвечает за запрос контейнеров для приложения.Каждое из ваших заданий Spark имеет мастер приложений, который передает запросы на контейнеры от драйвера.
Кажется, ваша конфигурация не соответствует тому, что вы видите в YARN, поэтому не знаете, что там происходит.У вас есть 8 рабочих с 24 г отданы на пряжу.С 12g исполнителями у вас должно быть 2 исполнителя на узел, всего 16 «слотов».Мастер приложений + 6 исполнителей должны иметь по 7 контейнеров на приложение, поэтому оба приложения должны умещаться в 16 слотах.
Мы настраиваем мастер приложений на меньшее количество памяти, поэтому общая память для приложения неочистить кратное 12g.
Если вы хотите, чтобы оба приложения одновременно планировали всех своих исполнителей, вам следует установить spark.executor.instances = 5.
Если вы используете структурированную потоковую передачу, вы можететакже просто запустите оба потоковых задания в одном приложении Spark (отправив их из разных потоков в драйвере).
Полезные ссылки: