火花是否有可能读取HDFS数据并同时进行一些计算?

时间:2016-04-27 05:13:52

标签: hadoop apache-spark hdfs

例如,我在Spark平台上运行以下工作计数应用程序:

val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
             .map(word => (word, 1))
             .reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")

假设有一个工人需要处理1Gb数据,那么这个工作人员在获取所有1Gb数据之前是否可能开始进行一些计算(如flatMap)?

2 个答案:

答案 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之类的操作之前,不会执行或读取任何数据。