Apache Spark调度程序如何将文件拆分为任务?

时间:2015-01-30 01:43:00

标签: apache-spark bigdata

在2014年的火花峰会上,Aaron发表了更深入了解Spark内件的演讲,在他的幻灯片中,第17页显示一个舞台已被分为4个任务,如下所示:
  enter image description here

在这里,我想知道三个关于舞台如何被分割成任务的事情?

  1. 在上面的例子中,似乎任务的编号是根据文件编号创建的,对不对?

  2. 如果我在第1点是正确的,那么如果目录名下只有3个文件,它会创建3个任务吗?

  3. 如果我在第2点是正确的,如果只有一个但非常大的文件怎么办?它只是将这个阶段分为1个任务吗?如果数据来自流数据源怎么办?

  4. 非常感谢,我对舞台如何被分割成任务感到困惑。

4 个答案:

答案 0 :(得分:1)

您可以将整个流程的分区数(拆分)配置为作业的第二个参数,例如:如果我们想要3个分区,则进行并行化:

a = sc.parallelize(myCollection, 3)

Spark会将工作划分为相对均匀的尺寸(*)。大文件将相应地细分 - 您可以通过以下方式查看实际大小:

rdd.partitions.size

所以不,你不会因为单个工作人员长时间在一个文件上扯下来而结束。

(*)如果您的文件非常小,则可能会更改此处理。但无论如何,大型文件遵循这种模式。

答案 1 :(得分:0)

分裂分两个阶段进行:

首先,HDSF在加载文件时将逻辑文件拆分为64MB或128MB物理文件。

其次,SPARK将安排MAP任务来处理每个物理文件。 存在相当复杂的内部调度过程,因为存储在三个不同服务器上的每个物理文件有三个副本,并且对于大型逻辑文件,可能无法一次运行所有任务。处理它的方式是hadoop分布之间的主要差异之一。

当所有MAP任务都运行了收集器时,可以运行随机播放和减少任务。

答案 2 :(得分:0)

阶段:当发生广泛转换时,将创建新阶段

任务:将基于工作程序中的分区创建

附加链接以获取更多解释:How DAG works under the covers in RDD?

答案 3 :(得分:0)

问题1:在上面的示例中,看来任务号是基于文件号创建的,对吗? 答:它不是基于文件号,而是基于您的hadoop块(0.gz,1.gz是保存或存储在hdfs中的数据块。)

问题2: 如果我的观点是正确的,那么如果目录名下只有3个文件,那么它将创建3个任务吗? 答:默认情况下,hadoop中的块大小为64MB,该数据块将被视为spark中的分区。 注意:没有分区=没有任务,因为这些分区创建了3个任务。

问题3: 如果只有一个但很大的文件怎么办?它将这个阶段分为1个任务吗?如果数据来自流数据源怎么办? 答案:否,非常大的文件将被分区,正如我根据分区数对您的问题2回答的那样,不会创建任何任务