通过spark FIFO调度程序使用在YARN集群模式下运行的spark 2.4.4。
我正在使用线程数可变的线程池执行程序来提交多个spark数据帧操作(即,将数据写入S3)。如果我有约10个线程,则可以正常工作,但如果使用数百个线程,则似乎出现了死锁,根据Spark UI没有安排任何作业。
哪些因素控制可以同时调度多少个作业?驱动程序资源(例如内存/内核)?其他一些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 UI作业选项卡显示无活动作业
- Spark UI执行程序选项卡不显示任何执行程序的活动任务
- Spark UI SQL选项卡显示
nThreads
没有运行作业ID的运行查询
我的执行环境是
- 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
以获取带有锁定信息的线程转储。