一个spark有一个oracle查询。所以我必须并行运行多个作业,以便所有查询同时触发。
如何并行运行多个作业?
答案 0 :(得分:12)
引用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
SparkContext.runJob
1}}用于具有非阻塞行为的方法。
请注意,“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就像控制+我支持这个。