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

Nag*_*lla 13 apache-spark

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

如何并行运行多个作业?

Jac*_*ski 18

引用有关作业调度的官方文档:

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

换句话说,SparkContext多个线程可以使用单个实例,这样可以提交可能或可能不并行运行的多个Spark作业.

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

但是,如果CPU数量不足,您可以考虑使用FAIR调度模式(FIFO是默认值):

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

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


只是为了清理一点.

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

  2. RDD操作可能阻止也可能不阻塞.SparkContext配备了两种方法来提交(或运行)一个Spark的工作,即SparkContext.runJobSparkContext.submitJob,因此它并不真正重要的动作是否阻塞或没有,但有什么SparkContext用方法有无阻塞行为.

请注意,"RDD操作方法"已经编写完成,并且它们的实现使用了Spark开发人员所投入的任何内容(主要SparkContext.runJob是在计数中):

// RDD.count
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum
Run Code Online (Sandbox Code Playgroud)

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

  • 是。这是Spark开发人员/部署人员的工作方式(除了集群管理器操作人员的工作之外) (2认同)

小智 -2

无需进一步解释,我假设 Spark 作业是指 Spark 操作以及评估该操作所需的所有任务?如果是这种情况,您本身可以查看官方文档(注意您的spark version): https: //spark.apache.org/docs/latest/job-scheduling.html

如果这不是您想要遵循的解决方案,并且您想要执行hackish-not-scalable-way-just-get-things-donecron ,请在使用spark-submit- https://spark.apache的同时安排作业。 org/docs/latest/submitting-applications.html

当然,如果您所在的地方有调度程序,那么只需查看其文档即可 - Oozie、Airflow、Luigi、Nifi 甚至像 control+m 这样的老式 GUI 都支持此功能。