分区如何映射到 Spark 中的任务?

How does partitions map to tasks in Spark?

如果我将一个 RDD 分成 60 个,并且我总共有 20 个核心分布在 20 台机器上,即 20 个单核机器实例,那么任务数是 60(等于任务数的分区)。为什么这比每个核心一个分区和 20 个任务更有优势?

此外,我有一个 运行 实验,我将分区数设置为 2,检查 UI 在任何时候显示 2 个任务 运行ning;然而,令我惊讶的是它会在任务完成时切换实例,例如node1 和 node2 执行前 2 个任务,然后 node6 和 node8 执行下一组 2 个任务等。我认为通过将分区数设置为小于集群中的核心(和实例),程序将只使用最小值需要的实例数。谁能解释这种行为?

对于第一个问题:您可能希望拥有比严格必需的更细粒度的任务,以便同时减少加载到内存中的任务。此外,它还有助于容错,因为在出​​现故障时需要重做的工作更少。它仍然是一个参数。一般来说,答案取决于工作负载的种类(IO 绑定、内存绑定、CPU 绑定)。

至于第二个,我相信1.3版本有一些动态请求资源的代码。我不确定中断是在哪个版本中,但旧版本只是请求您配置驱动程序所使用的确切资源。至于分区如何从一个节点移动到另一个节点,好吧,据我所知,它将从在 HDFS 上具有该数据本地副本的节点中为任务选择数据。由于 hdfs 具有每个数据块的多个副本(默认情况下为 3 个),因此 运行 任何给定的片段都有多个选项)。