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

tao*_*.li 5 bigdata apache-spark

在2014年的spark-summit中,Aaron在他的幻灯片(第17页)中演讲了“更深入的了解Spark内部原理”,展示了将一个阶段分为以下4个任务:
在此处输入图片说明

在这里,我想了解有关如何将阶段拆分为任务的三件事?

  1. 在上面的示例中,似乎任务号是基于文件号创建的,对吗?

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

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

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

jav*_*dba 1

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

a = sc.parallelize(myCollection, 3)
Run Code Online (Sandbox Code Playgroud)

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

rdd.partitions.size
Run Code Online (Sandbox Code Playgroud)

所以不,你不会最终导致单个 Worker 长时间处理单个文件。

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