Spark Shuffle之所以发生,是因为Spark需要跨阶段传输数据



spark 文档: 在 Spark 中,数据通常不会跨分区分布,以位于特定操作的必要位置。在计算过程中,单个任务将在单个分区上运行 - 因此,为了组织要执行的单个reduceByKeyreduce任务的所有数据,Spark需要执行全对多操作。它必须从所有分区读取以查找所有键的所有值,然后将跨分区的值汇集在一起以计算每个键的最终结果 - 这称为随机播放。

火花文档: "这通常涉及在执行程序和机器之间复制数据,使随机操作变得复杂且成本高昂。

我的理解是:"这通常涉及跨"任务"复制数据,使随机操作变得复杂且成本高昂。

我认为计算跨任务洗牌。这种理解正确吗?

您的理解有些准确,尽管我认为文档试图强调通过网络发送数据的更昂贵的操作,而不是停留在单个节点上,该节点可以有多个任务,特别是如果它有多个内核。

有一些细微差别:

引用Cloudera文档:">阶段是运行相同代码的任务集合,每个任务都针对不同的数据子集。通常,随机数据是为之后运行的下一个(依赖(阶段而保存的阶段(任务集(的输出。

Spark 2.x 文档:"在随机播放期间,Spark 执行器首先将自己的映射输出本地写入磁盘,然后在其他执行程序尝试获取这些文件时充当这些文件的服务器。这是一个阶段的结束部分。此外,提供随机数据的服务是"一个长时间运行的进程,独立于Spark应用程序及其执行程序在群集的每个节点上运行"。这也意味着任务。

正如您提到的,洗牌可能会在阶段结束时发生,例如,如果涉及reduceByKey。但是,任务的输出是在任务本身之外管理的,因此任务通常不会直接在它们之间复制数据。相反,数据保存在节点上的某个位置,并在以后按需获取。

最新更新