YARNクラスターモードで実行されているSpark 2.4.4をSpark FIFOスケジューラーと共に使用する。
可変数のスレッドを持つスレッドプールエグゼキューターを使用して、複数のsparkデータフレーム操作(つまり、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が増加するにつれて、次のことからもわかるように、sparkがジョブをスケジュールしなくなったように見えます。
ecs.poll(...)
最終的にタイムアウトする- アクティブなジョブが表示されていないSpark UIのジョブタブ
- Spark UIのexecutorタブには、executorのアクティブなタスクが表示されていません
nThreads
実行中のジョブIDのない実行中のクエリを示すSpark UI SQLタブ
私の実行環境は
- 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
してロック情報を含むスレッドダンプを取得してください。