簡體   English   中英

Spark並行運行多個操作

[英]Spark run multiple operations in parallel

我有一個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個任務是並行提交的,但是處理仍然處於阻塞狀態,一個任務開始運行,直到另一個任務完成。 如何使多個任務並行運行而不是一個接一個地運行?

這不是您在Spark中控制並行性的方式。 全部通過配置以聲明方式控制。

Spark是一個分布式計算框架,它應在每個工作人員都運行單線程的分布式環境中使用。 通常,使用具有節點元數據的Yarn計划任務,並且可能會在單個節點上啟動多個任務(取決於內存和cpu約束),但在單獨的jvm中。

local模式下,您可以將多個工作程序實現為單獨的線程,因此,如果您說master("local[8]")您將獲得8個工作程序,每個工作程序都在單個jvm中作為線程運行。

您如何運行您的應用程序?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM