spark FIFO 스케줄러와 함께 YARN 클러스터 모드에서 실행중인 spark 2.4.4 사용.
가변 개수의 스레드가있는 스레드 풀 실행기를 사용하여 여러 개의 스파크 데이터 프레임 작업 (즉, S3에 데이터 쓰기)을 제출하고 있습니다. 스레드가 ~ 10 개이면 잘 작동하지만 수백 개의 스레드를 사용하면 Spark UI에 따라 작업이 예약되지 않은 교착 상태가있는 것으로 보입니다.
동시에 예약 할 수있는 작업 수를 제어하는 요인은 무엇입니까? 드라이버 리소스 (예 : 메모리 / 코어)? 다른 스파크 구성 설정?
편집하다:
다음은 내 코드에 대한 간략한 개요입니다.
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 실행기 탭
nThreads실행중인 작업 ID없이 실행중인 쿼리를 표시 하는 Spark UI SQL 탭
내 처형 환경은
- AWS EMR 5.28.1
- 스파크 2.4.4
- 마스터 노드 =
m5.4xlarge - 핵심 노드 = 3x
rd5.24xlarge spark.driver.cores=24spark.driver.memory=32gspark.executor.memory=21gspark.scheduler.mode=FIFO
jstack -l잠금 정보가있는 스레드 덤프 를 실행하십시오 .