【问题标题】:Spark internals - Does repartition loads all partitions in memory?Spark internals - repartition 是否会加载内存中的所有分区?
【发布时间】:2017-10-13 00:47:19
【问题描述】:

我在任何地方都找不到如何在内部对 RDD 执行重新分区?我知道您可以在 RDD 上调用 repartition 方法来增加分区的数量,但它是如何在内部执行的?

假设,最初有 5 个分区,他们有 -

  • 第一个分区 - 100 个元素
  • 第二个分区 - 200 个元素
  • 第三个分区 - 500 个元素
  • 第 4 个分区 - 5000 个元素
  • 第 5 分区 - 200 个元素

一些分区是倾斜的,因为它们是从 HBase 加载的,并且数据在 HBase 中没有正确加盐,这导致一些区域服务器的条目过多。

在这种情况下,当我们重新分区到 10 时,它会先加载所有分区,然后再进行 shuffle 以创建 10 分区吗?如果无法将完整数据加载到内存中,即所有分区无法一次加载到内存中怎么办?如果 Spark 没有将所有分区加载到内存中,那么它如何知道计数以及如何确保将数据正确分区为 10 个分区。

【问题讨论】:

  • @Krishna Kumar,给出的答案不是很清楚,也没有直接解决问题。你能找到正确的答案吗?
  • @y2k-shubham 我的理解是 Spark 会尝试将所有内容加载到内存中,如果不能,则会抛出与内存相关的异常

标签: performance apache-spark shuffle


【解决方案1】:

据我了解,repartition 肯定会触发shuffle。来自Job Logical Plan的文档下面可以说是repartition

   - for each partition, every record is assigned a key which is an increasing number.
   - hash(key) leads to a uniform records distribution on all different partitions.

如果Spark 无法将所有数据加载到memory 中,则将抛出memory issue。所以Spark 的默认处理都是在memory 中完成的,即应该总是有足够的内存来存储您的数据
Persist 选项可以用来告诉spark 到@987654335 @你的数据在disk如果没有足够的内存。
Jacek Laskowski还解释了重新分区。
Understanding your Apache Spark Application Through Visualization应该足够你自己测试和知道了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 2016-07-19
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多