apache-spark - spark使用什么算法将相同的密钥组合在一起
问题描述
Spark 使用什么算法来识别相似的键并将数据推送到下一个阶段?
场景包括,
- 当我应用 distinct() 时,我知道在当前阶段应用了一个 pre-distinct,然后数据被洗牌到下一个阶段。在这种情况下,所有相似的键在下一阶段都需要在同一个分区中。
- 当 Dataset1 与 Dataset2 (SortMergeJoin) 连接时。在这种情况下,Dataset1 和 Dataset2 中所有相似的键在下一阶段需要在同一个分区中。
还有其他情况,但总体情况是这样。
Spark 如何有效地做到这一点?在识别相似键时,Stage1 和 Stage2 之间会不会有任何时滞?
解决方案
Spark 用于对数据进行分区的算法默认为 Hash。此外,阶段不会推送而是从前一阶段提取数据。
每当需要洗牌时,Spark 都会创建阶段边界。第二阶段将等到阶段中的所有任务首先完成并将其输出写入临时文件。然后第二阶段开始从阶段 1 中写入的分区中提取其分区所需的数据。如您所见,不同并不像看起来那么简单。Spark 通过应用聚合来区分。还需要改组,因为重复项可以位于多个分区中。洗牌的条件之一是 Spark 需要一对 RDD,如果你的父级不是一个,它将创建中间对 RDD。如果你看到 Distinct 的逻辑计划,它或多或少像 Parent RDD ---> Mapped RDD(记录为 key 和 null 值)---> MapPartitionsRDD(在分区级别运行 distinct)----> Shuffled RDD(拉取需要的分区数据)---->
推荐阅读
- flutter - Flutter如何在计时器结束时触发对话框
- flutter - Flutter ChangeNotifierProvider 构建器已弃用
- qlikview - qlik 中的条件公式
- java - 如何将此数组分解为相似类型字母的子数组(在连续位置)
- java - Apache Velocity 2.0 如何编写自定义资源加载器?
- google-apps-script - 在谷歌表格中插入特定数量的行
- django - 如何以 django 形式显示过滤的选择列表
- angular - video_js__WEBPACK_IMPORTED_MODULE_1__ 不是函数
- firebase - 执行大量读取时如何防止使用 Firestore 进行节流?
- javascript - 如何通过模块将数据从 vuex 存储传递到 vue 组件?