一个火花有一个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.runJob
和SparkContext.submitJob
,因此,动作是否受阻并不重要,但是使用哪种SparkContext
方法并不重要。无阻塞行为。
请注意,“ RDD操作方法”已经编写好了,它们的实现使用Spark开发人员押注的所有方法(大多是count中的SparkContext.runJob
):
// RDD.count
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum
您必须编写自己的RDD操作(在自定义RDD上)才能在Spark应用程序中具有所需的非阻塞功能。