【问题标题】:Can the partition number of a Spark RDD be manually changed without repartitioningSpark RDD的分区号可以手动更改而不重新分区吗
【发布时间】:2015-11-25 16:13:31
【问题描述】:

在 Spark 中,我有两个 PairRDD(我们称它们为 A 和 B),每个包含 n 个分区。我想根据它们的键加入那些 RDD。

两个 RDD 是一致分区的,即,如果键 x 和 y 在 RDD A 中的同一分区中,它们也在 RDD B 中的同一分区中。对于 RDD A,我可以确保分区是使用特定的分区器。但是对于 RDD B,分区索引可能与 RDD A 的不同(RDD B 是一些遗留库的输出,如果不是绝对必要的话,我不愿意接触)。

我想有效地加入 RDD A 和 B 而不执行洗牌。理论上,如果我可以重新分配 RDD B 的分区号​​,使其与 RDD A 中的分区号匹配,这将很容易。

我现在的问题是:是否可以编辑 RDD 的分区号​​(基本上是置换它们)?或者,可以分配一个分区器而不引起洗牌操作吗?或者您是否看到了另一种解决此任务的方法,而我目前太盲目了?

【问题讨论】:

  • 如果您可以控制用于 RDD A 的分区器,为什么不简单地使用与 RDD B 相同的分区器?
  • 我手头的原始 RDD B 没有被那个分区器分区。而且我想避免调用 partitionBy 导致的随机播放(这会将作业运行时间增加 15 倍)。

标签: apache-spark partitioning rdd


【解决方案1】:

是的,您可以更改分区。但为了减少洗牌,数据必须位于同一个集群节点上。

  1. 在数据源级别控制分区和/或使用 .partition 运算符
  2. 如果小型 RDD 可以容纳所有工作人员的内存,那么使用广播变量是更快的选择。

正如你所说,分区是一致的,你不需要重新分区(或编辑现有的分区数)。

请记住,数据托管很难实现

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2021-02-24
    • 1970-01-01
    • 2020-09-18
    • 2016-01-04
    相关资源
    最近更新 更多