如何并行运行多个Spark作业?

时间:2018-03-30 05:34:29

标签: apache-spark

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

如何并行运行多个作业?

2 个答案:

答案 0 :(得分:12)

引用Job Scheduling上的官方文档:

  

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

换句话说,多个线程可以使用单个SparkContext实例,从而能够提交可能并行运行的多个Spark作业。

Spark作业是否并行运行取决于CPU的数量(Spark不会跟踪调度的内存使用情况)。如果有足够的CPU来处理来自多个Spark作业的任务,它们将同时运行。

如果CPU的数量不够,您可以考虑使用FAIR scheduling mode(FIFO是默认值):

  

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

     

默认情况下,Spark的调度程序以FIFO方式运行作业。每个工作分为“阶段”(例如地图和减少阶段),第一个工作优先于所有可用资源,而其阶段有任务启动,然后第二个工作获得优先权等。如果工作在头部队列不需要使用整个集群,以后的作业可以立即开始运行,但如果队列头部的作业很大,则后续作业可能会显着延迟。

只是为了清理一下。

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

  2. RDD操作可能阻止也可能不阻塞。 SparkContext提供了两种提交(或运行)Spark作业的方法,即SparkContext.runJobSparkContext.submitJob,因此一个动作是否阻塞并不是真正重要的SparkContext SparkContext.runJob 1}}用于具有非阻塞行为的方法。

  3. 请注意,“RDD操作方法”已经编写,其实现使用Spark开发人员所投注的任何内容(大多数// RDD.count def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum count一样):

    {{1}}

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

答案 1 :(得分:-2)

在没有进一步解释的情况下,我认为通过spark工作,您的意思是Spark行动以及评估该行动所需的所有任务?如果是这种情况,原则上你可以查看官方文档(注意你的cron):https://spark.apache.org/docs/latest/job-scheduling.html

如果这不是您想要遵循的解决方案,并且您想要执行 hackish-not-scalable-way-just-get-things-done ,请在同一时间安排作业spark-submit使用SELECT TOP number|percent column_name(s) FROM table_name WHERE condition; - https://spark.apache.org/docs/latest/submitting-applications.html

当然,如果你所在的地方有调度员,那么这是一个查看其文档的简单案例--Oozie,Airflow,Luigi,Nifi甚至老派的GUI就像控制+我支持这个。