首页 > 解决方案 > spark使用什么算法将相同的密钥组合在一起

问题描述

Spark 使用什么算法来识别相似的键并将数据推送到下一个阶段?

场景包括,

  1. 当我应用 distinct() 时,我知道在当前阶段应用了一个 pre-distinct,然后数据被洗牌到下一个阶段。在这种情况下,所有相似的键在下一阶段都需要在同一个分区中。
  2. 当 Dataset1 与 Dataset2 (SortMergeJoin) 连接时。在这种情况下,Dataset1 和 Dataset2 中所有相似的键在下一阶段需要在同一个分区中。

还有其他情况,但总体情况是这样。

Spark 如何有效地做到这一点?在识别相似键时,Stage1 和 Stage2 之间会不会有任何时滞?

标签: apache-spark

解决方案


Spark 用于对数据进行分区的算法默认为 Hash。此外,阶段不会推送而是从前一阶段提取数据。

每当需要洗牌时,Spark 都会创建阶段边界。第二阶段将等到阶段中的所有任务首先完成并将其输出写入临时文件。然后第二阶段开始从阶段 1 中写入的分区中提取其分区所需的数据。如您所见,不同并不像看起来那么简单。Spark 通过应用聚合来区分。还需要改组,因为重复项可以位于多个分区中。洗牌的条件之一是 Spark 需要一对 RDD,如果你的父级不是一个,它将创建中间对 RDD。如果你看到 Distinct 的逻辑计划,它或多或少像 Parent RDD ---> Mapped RDD(记录为 key 和 null 值)---> MapPartitionsRDD(在分区级别运行 distinct)----> Shuffled RDD(拉取需要的分区数据)---->


推荐阅读