Использование spark 2.4.4 в кластерном режиме YARN с планировщиком FIFO spark.
Я отправляю несколько операций с пламенем в dataframe (т.е. записываю данные в S3), используя исполнителя пула потоков с переменным числом потоков. Это работает нормально, если у меня ~ 10 потоков, но если я использую сотни потоков, то, по-видимому, возникает тупик, и в соответствии с пользовательским интерфейсом Spark не планируются никакие задания.
Какие факторы контролируют, сколько рабочих мест может быть запланировано одновременно? Ресурсы драйвера (например, память / ядра)? Некоторые другие настройки конфигурации свечи?
РЕДАКТИРОВАТЬ:
Вот краткий обзор моего кода
ExecutorService pool = Executors.newFixedThreadPool(nThreads);
ExecutorCompletionService<Void> ecs = new ExecutorCompletionService<>(pool);
Dataset<Row> aHugeDf = spark.read.json(hundredsOfPaths);
List<Future<Void>> futures = listOfSeveralHundredThings
.stream()
.map(aThing -> ecs.submit(() -> {
df
.filter(col("some_column").equalTo(aThing))
.write()
.format("org.apache.hudi")
.options(writeOptions)
.save(outputPathFor(aThing));
return null;
}))
.collect(Collectors.toList());
IntStream.range(0, futures.size()).forEach(i -> ecs.poll(30, TimeUnit.MINUTES));
exec.shutdownNow();
В какой-то момент, по мере nThreads
увеличения, похоже, что spark больше не планирует какие-либо задания, о чем свидетельствуют:
ecs.poll(...)
тайм-аут в конце концов- На вкладке заданий пользовательского интерфейса Spark нет активных заданий
- На вкладке Исполнители пользовательского интерфейса Spark отсутствуют активные задачи для какого-либо исполнителя.
- Вкладка SQL Spark UI, показывающая
nThreads
запущенные запросы без идентификаторов запущенных заданий
Моя среда исполнения
- AWS EMR 5.28.1
- Spark 2.4.4
- Главный узел =
m5.4xlarge
- Основные узлы = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
чтобы получить дамп потока с информацией о блокировке.