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

har*_*der 6 scala elasticsearch apache-spark

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

1. Load the file into DataFrame
2. Push the DataFrame to elasticsearch
3. Run some aggregations on dataframe and save to cassandra
Run Code Online (Sandbox Code Playgroud)

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

writeToES(df)
writeToCassandra(df)
Run Code Online (Sandbox Code Playgroud)

现在这两个操作一个接一个地运行.但是这两个可以并行运行.

我怎样才能在一个火花工作中做到这一点.

我可以为ES和Cassandra写两个火花作业.但他们将使用多个端口,我想避免.

ern*_*t_k 5

您无法通过相同的spark作业运行这两个操作.你肯定在寻找的是在同一个应用程序中并行运行这两个作业.

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

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

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

CompletableFuture.runAsync(() -> writeToES(df));
CompletableFuture.runAsync(() -> writeToCassandra(df));
Run Code Online (Sandbox Code Playgroud)

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

conf.set("spark.scheduler.mode", "FAIR")
Run Code Online (Sandbox Code Playgroud)