Використання іскри 2.4.4, що працює в режимі кластера YARN з планувальником іскри FIFO.
Я надсилаю кілька операцій з фреймом даних іскри (тобто записування даних у 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
збільшення, іскра вже не здається, що вона планує будь-які робочі місця, про що свідчить:
ecs.poll(...)
час закінчується- На вкладці Завдання Іскрового інтерфейсу не відображаються активні завдання
- Вкладка "Іскрові користувачі інтерфейсу" не показує жодних активних завдань жодному виконавцю
- Вкладка Spark UI SQL, що показує
nThreads
запущені запити без ідентифікаторів виконуваного завдання
Моє середовище виконання
- AWS EMR 5.28.1
- Іскра 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
щоб отримати дамп потоку з інформацією про блокування.