【问题标题】:Why there are so many partitions required before shuffling data in Apache Spark?为什么在 Apache Spark 中混洗数据之前需要这么多分区?
【发布时间】:2020-06-09 14:41:45
【问题描述】:

背景

我是 Spark 的新手,想了解 Spark 中的洗牌。 我有以下两个关于 Apache Spark 中洗牌的问题。

1) 为什么没有变化。执行洗牌之前的分区?默认情况下,Spark 通过将分区计数更改为 spark.sql.shuffle.partitions 中给定的值来执行此操作。

2) 洗牌通常发生在宽变换时。我在一本书中读到数据也保存在磁盘上。我的理解正确吗?

【问题讨论】:

标签: apache-spark


【解决方案1】:

实际上是两个问题。

  • 它没有说明您需要更改此参数。如果未设置,则默认值为 200。它适用于 JOINing 和 AGgregating。您可以通过增加分区数量以获得更多处理能力来更好地提供更大的数据集 - 如果有更多的 Executors 可用。 200 是默认值,但如果您的数量很大,如果可能的话,更多的并行性将加快处理时间 - 通常。

  • 假设已经调用了一个动作 - 如果没有说明,为了避免明显的注释,假设我们不是在谈论 ResultStage 和广播连接,那么我们正在谈论 ShuffleMapStage。我们首先看一个 RDD:

  • 涉及 shuffle 的 DAG 依赖意味着创建单独的 Stage。

  • Map 操作之后是 Reduce 操作和 Map 等等。

当前阶段

  • 所有(融合的)Map 操作都在 Stage 内执行。
  • 下一个阶段要求,Reduce 操作 - 例如一个reduceByKey,表示输出是散列或按键排序(K)在地图的末尾 当前阶段的操作。
  • 这些分组数据被写入到 Executor 所在的 Worker 上的磁盘 - 或与该云版本相关联的存储。 (我会 如果数据很小,内存中的想法是可能的,但这是一个架构 Spark 文档中所述的方法。)
  • 通知 ShuffleManager 散列的映射数据可供下一阶段使用。 ShuffleManager 跟踪所有 完成所有地图方面的工作后的键/位置。

下一阶段

  • 下一个阶段是一个 reduce,然后通过咨询 Shuffle Manager 和使用 Block Manager 从这些位置获取数据。
  • Executor 可以重复使用,或者是另一个 Worker 上的新 Executor,或者是同一 Worker 上的另一个 Executor。

阶段意味着写入磁盘,即使存在足够的内存。鉴于 Worker 的资源有限,这种类型的操作写入磁盘是有道理的。当然,更重要的一点是“Map Reduce”的实现方式。
当然,这种持久性有助于容错,减少重新计算工作。

类似的方面也适用于 DF。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-10-14
  • 2017-07-29
  • 2015-09-03
  • 2018-11-14
  • 2019-12-22
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多