【发布时间】:2019-06-16 13:30:02
【问题描述】:
我有一个 Spark 应用程序选择一个子集并对该子集执行一些操作。每个子集与其操作之间没有依赖和交互,因此我尝试使用多线程让它们并行运行以提高性能。代码如下:
Dataset<Row> fullData = sparkSession.read().json("some_path");
ExecutorService executor = Executors.newFixedThreadPool(10);
List<Runnable> tasks = Lists.newArrayList();
for (int i = 1; i <= 50; i++) {
final int x = i;
tasks.add(() -> {
Dataset<Row> subset_1 = fullData.filter(length(col("name")).equalTo(x));
Dataset<Row> subset_2 = fullData.filter(length(col("name")).equalTo(x));
Dataset<Row> result = subset_1.join(subset_2, ...);
log.info("Res size is " + result.count()); // force Spark do the join operation
});
}
CompletableFuture<?>[] futures = tasks.stream()
.map(task -> CompletableFuture.runAsync(task, executor))
.toArray(CompletableFuture[]::new);
CompletableFuture.allOf(futures).join();
executor.shutdown();
在 Spark 作业管理 UI 中,我注意到这 50 个任务是并行提交的,但处理仍然是阻塞方式,一个任务开始运行,直到另一个任务完成。如何让多个任务并行运行,而不是一个接一个?
【问题讨论】:
标签: multithreading apache-spark