我有火花作业,我处理文件,然后执行以下步骤。
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写两个火花作业。但他们会使用多个端口,我想避免这种情况。
答案 0 :(得分:5)
您无法通过相同的火花作业运行这两项操作。你肯定要找的是在相同的应用程序中并行运行这两个作业。
正如documentation所说,如果从不同的线程提交这些作业,您可以在同一个应用程序中并行运行多个作业:
在给定的Spark应用程序(SparkContext实例)中,如果从单独的线程提交多个并行作业,则它们可以同时运行。通过“作业”,在本节中,我们指的是Spark操作(例如,保存,收集)以及需要运行以评估该操作的任何任务。 Spark的调度程序是完全线程安全的,并支持此用例,以支持提供多个请求的应用程序(例如,查询多个用户)。
换句话说,这应该并行运行两个动作(在这里使用可完成的未来API,但您可以使用任何异步执行或多线程机制):
CompletableFuture.runAsync(() -> writeToES(df));
CompletableFuture.runAsync(() -> writeToCassandra(df));
然后,您可以加入这两个中的一个或两个以等待完成。如文档中所述,您需要注意已配置的调度程序模式。使用FAIR调度程序可以并行运行上述内容:
conf.set("spark.scheduler.mode", "FAIR")