如何在独立模式下并行运行两个spark作业

时间:2018-04-04 08:58:09

标签: scala apache-spark elasticsearch

我有火花作业,我处理文件,然后执行以下步骤。

1. Load the file into DataFrame
2. Push the DataFrame to elasticsearch
3. Run some aggregations on dataframe and save to cassandra

我为此编写了一个spark作业,其中我有以下函数调用

writeToES(df)
writeToCassandra(df)

现在这两个操作一个接一个地运行。然而,这两者可以并行运行。

如何在单个火花作业中完成此任务。

我可以为ES和Cassandra写两个火花作业。但他们会使用多个端口,我想避免这种情况。

1 个答案:

答案 0 :(得分:5)

您无法通过相同的火花作业运行这两项操作。你肯定要找的是在相同的应用程序中并行运行这两个作业

正如documentation所说,如果从不同的线程提交这些作业,您可以在同一个应用程序中并行运行多个作业:

  

在给定的Spark应用程序(SparkContext实例)中,如果从单独的线程提交多个并行作业,则它们可以同时运行。通过“作业”,在本节中,我们指的是Spark操作(例如,保存,收集)以及需要运行以评估该操作的任何任务。 Spark的调度程序是完全线程安全的,并支持此用例,以支持提供多个请求的应用程序(例如,查询多个用户)。

换句话说,这应该并行运行两个动作(在这里使用可完成的未来API,但您可以使用任何异步执行或多线程机制):

CompletableFuture.runAsync(() -> writeToES(df));
CompletableFuture.runAsync(() -> writeToCassandra(df));

然后,您可以加入这两个中的一个或两个以等待完成。如文档中所述,您需要注意已配置的调度程序模式。使用FAIR调度程序可以并行运行上述内容:

conf.set("spark.scheduler.mode", "FAIR")