一个 Spark 有一个 Oracle 查询。所以我必须并行运行多个作业,以便所有查询同时触发。
如何并行运行多个作业?
引用官方文档作业调度 http://spark.apache.org/docs/latest/job-scheduling.html:
其次,在每个 Spark 应用程序中,如果多个“作业”(Spark 操作)由不同线程提交,则可能会同时运行。
换句话说,单个SparkContext
实例可以由多个线程使用,从而能够提交多个可能并行运行也可能不并行运行的 Spark 作业。
Spark作业是否并行运行取决于CPU的数量(Spark不跟踪调度的内存使用情况)。如果有足够的 CPU 来处理多个 Spark 作业的任务,它们将同时运行。
但是,如果 CPU 数量不够,您可以考虑使用公平调度模式 http://spark.apache.org/docs/latest/job-scheduling.html#scheduling-within-an-application(默认为 FIFO):
在给定的 Spark 应用程序(SparkContext 实例)内,如果多个并行作业是从单独的线程提交的,则它们可以同时运行。在本节中,“作业”是指 Spark 操作(例如保存、收集)以及需要运行以评估该操作的任何任务。 Spark 的调度程序是完全线程安全的,并支持此用例以启用服务多个请求的应用程序(例如,多个用户的查询)。
默认情况下,Spark 的调度程序以 FIFO 方式运行作业。每个作业都分为“阶段”(例如映射和减少阶段),第一个作业在所有可用资源上获得优先级,而其阶段有任务要启动,然后第二个作业获得优先级,依此类推。队列不需要使用整个集群,后面的作业可以立即开始运行,但是如果队列头部的作业很大,那么后面的作业可能会明显延迟。
只是为了把事情弄清楚一点。
-
spark-submit
是提交一个Spark应用程序来执行(不是Spark作业)。单个 Spark 应用程序可以具有at least一份 Spark 工作。
-
RDD 操作可能会或可能不会阻塞。SparkContext
提供两种提交(或运行)Spark 作业的方法,即SparkContext.runJob
and SparkContext.submitJob
,所以一个动作是否阻塞并不重要,重要的是它是什么SparkContext
用于实现非阻塞行为的方法。
请注意,“RDD 操作方法”已经编写完毕,并且它们的实现使用 Spark 开发人员所押注的任何内容(主要是SparkContext.runJob
as in count https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/RDD.scala#L1162):
// RDD.count
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum
您必须编写自己的 RDD 操作(在自定义 RDD 上)才能在 Spark 应用程序中获得所需的非阻塞功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)