【问题标题】:How does the Apache Spark scheduler split files into tasks?Apache Spark 调度程序如何将文件拆分为任务?
【发布时间】:2015-03-29 11:01:47
【问题描述】:

在 spark-summit 2014 中,Aaron 发表了 A Deeper Understanding of Spark Internals 的演讲,在他的幻灯片中,第 17 页显示一个阶段已分为 4 个任务,如下所示:

这里我想知道关于一个阶段如何划分为任务的三件事?

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

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

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

非常感谢,我对如何将阶段划分为任务感到困惑。

【问题讨论】:

    标签: apache-spark bigdata


    【解决方案1】:

    问题1:在上面这个例子中,任务编号似乎是根据文件编号创建的,对吗? 答:不是基于文件号,而是基于你的hadoop块(0.gz,1.gz是保存或存储在hdfs中的数据块。)

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

    问题 3: 如果只有一个但非常大的文件怎么办?它只是将这个阶段分成1个任务吗?如果数据来自流式数据源怎么办? 答:不,非常大的文件将被分区,正如我根据分区数回答你的问题 2 时,不会创建任何任务

    【讨论】:

      【解决方案2】:

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

      任务:将根据工作人员中的分区创建

      附上链接了解更多:How DAG works under the covers in RDD?

      【讨论】:

        【解决方案3】:

        分裂发生在两个阶段:

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

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

        当所有 MAP 任务都运行完收集器后,就可以运行 shuffle 和 reduce 任务了。

        【讨论】:

          【解决方案4】:

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

          a = sc.parallelize(myCollection, 3)
          

          Spark 会将作品分成相对均匀的大小 (*) 。大文件将被相应地分解 - 您可以通过以下方式查看实际大小:

          rdd.partitions.size
          

          所以,不,您不会以单个 Worker 为一个文件长时间工作而告终。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多