一个火花有一个oracle查询。因此,我必须并行运行多个作业,以便所有查询将同时触发。

如何并行运行多个作业?

最佳答案

Job Scheduling上引用官方文档:

其次,在每个Spark应用程序中,如果多个“作业”(Spark操作)是由不同的线程提交的,则它们可能同时运行。

换句话说,多个线程可以使用单个SparkContext实例,从而可以提交可以并行运行或可以并行运行的多个Spark作业。
Spark作业是否并行运行取决于CPU的数量(Spark不会跟踪用于调度的内存使用情况)。如果有足够的CPU处理多个Spark作业中的任务,则它们将同时运行。
但是,如果CPU数量不足,则可以考虑使用FAIR scheduling mode(默认为FIFO):

在给定的Spark应用程序(SparkContext实例)中,如果多个并行作业是从单独的线程提交的,则它们可以同时运行。在本节中,“作业”指的是Spark动作(例如保存,收集)以及需要运行以评估该动作的所有任务。 Spark的调度程序是完全线程安全的,并支持该用例,以启用可处理多个请求(例如,针对多个用户的查询)的应用程序。
默认情况下,Spark的调度程序以FIFO方式运行作业。每个作业都分为“阶段”(例如,映射和简化阶段),第一个作业在所有可用资源上都具有优先级,而其各个阶段都有要启动的任务,则第二个作业具有优先级,依此类推。队列不需要使用整个集群,以后的作业可以立即开始运行,但是如果队列开头的作业很大,那么以后的作业可能会大大延迟。


只是为了清理一下。

spark-submit用于提交Spark应用程序以执行(不是Spark作业)。单个Spark应用程序可以至少具有一个Spark作业。

RDD动作可能会或可能不会阻塞。 SparkContext带有两种提交(或运行)Spark作业的方法,即SparkContext.runJobSparkContext.submitJob,因此,动作是否受阻并不重要,但是使用哪种SparkContext方法并不重要。无阻塞行为。


请注意,“ RDD操作方法”已经编写好了,它们的实现使用Spark开发人员押注的所有方法(大多是count中的SparkContext.runJob):

// RDD.count
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum

您必须编写自己的RDD操作(在自定义RDD上)才能在Spark应用程序中具有所需的非阻塞功能。

10-01 20:28
查看更多