例如,我在Spark平台上运行以下工作计数应用程序:
val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
.map(word => (word, 1))
.reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")
假设有一个工人需要处理1Gb数据,那么这个工作人员在获取所有1Gb数据之前是否可能开始进行一些计算(如flatMap)?
答案 0 :(得分:2)
一般来说,是的,它可以,但你的问题有点宽泛。因此,我不知道您是否正在寻找特定案例的答案。
在给定的Spark应用程序(SparkContext实例)中,如果从单独的线程提交多个并行作业,则它们可以同时运行。 “作业”是指Spark动作(例如保存,收集)以及需要运行以评估该动作的任何任务。 Spark的调度程序是完全线程安全的,并支持此用例,以支持提供多个请求的应用程序(例如,查询多个用户)。
有时您需要在不同用户之间共享资源。
默认情况下,Spark的调度程序以FIFO方式运行作业。每个作业分为“阶段”,第一个作业优先于所有可用资源,而其阶段具有要启动的任务,然后第二个作业获得优先权等。如果队列头部的作业不需要使用整个集群,以后的工作可以立即开始运行,但如果队列头部的工作量很大,那么以后的工作可能会大大延迟。
通常一切都取决于您使用的调度程序以及意图。
Ref. Official documentation > Job Scheduling > Scheduling Within an Application
回到你的具体问题并假设有一个工人需要处理1Gb数据,那么这个工人是否有可能在获取所有1Gb数据之前开始进行一些计算(如flatMap)?
是的。
答案 1 :(得分:0)
Spark懒惰地评估RDD操作(换句话说,直到请求结果),因此在调用saveAsTextFile
之类的操作之前,不会执行或读取任何数据。