当前位置: 首页 > 知识库问答 >
问题:

spark如何确定重新分区和合并中RDD的首选位置?

谷梁凌
2023-03-14

RDD什么时候得到它的首选位置?首选位置是如何确定的?我在重新划分和合并中看到了一些奇怪的行为,我不太明白。当合并n到n-1个分区时,我看到spark只是将一个分区合并到另一个分区。(我认为理想的行为是平均分配给所有n-1个节点)

上述行为是否与preferedLocations有关?

共有1个答案

谷越
2023-03-14

请注意<code>rdd。repartition(n)只调用rdd。合并(n,shuffle=true),所以我们只是比较shuffle true和false。

在这种模式下,Spark构建一个新的RDD,其分区包含父RDD的一个或多个分区——如果您从n分区合并-

出于某种背景,我推荐这篇博文,以了解更多关于我们如何以及为什么洗牌的知识。这种执行模式的基本区别是:

  • 更高的开销(所有数据都通过网络传输)
  • 非常适合重新平衡分区(如果您执行一个过滤器,该过滤器将删除分区中的所有元素或不删除任何元素,那么shuffle=false将产生不平衡的分区,但shuffle=true将解决此问题)
  • 可以增加分区的数量

首选位置与它没有太大关系 - 您仅在随机播放 = false 模式下看到首选位置,因为位置在没有随机播放的情况下保留,但在随机播放后,原始的首选位置无关紧要(替换为有关随机播放目的地的新首选位置)。

 类似资料:
  • 因此,如何跨辅助节点对RDD进行分区,是将被分区的单个RDD还是一个完整的批处理。 我可能拿错了。请指引我

  • 使用Spark 2.4.0。我的生产数据非常歪斜,因此其中一项任务的时间是其他任务的7倍。我尝试了不同的策略来规范数据,以便所有执行者都能平等工作- spark.default。并行性 reduceByKey(numPartitions) 重新分区(numPartitions) 我的期望是这三个选项应该均匀分区,但是在Spark Local/Standalone上使用一些虚拟的非生产数据表明,选项

  • 假设我创建了这样一个RDD(我使用的是Pyspark): 然后我用方法打印分区元素并获得 Spark是如何决定如何划分我的列表的?元素的特定选择来自哪里?它可以以不同的方式耦合它们,只留下0和10以外的一些其他元素,以创建6个请求的分区。在第二次运行中,分区是相同的。 使用更大的范围,有29个元素,我得到2个元素后跟3个元素的模式的分区: 使用更小范围的9个元素,我得到 因此,我推断Spark是通

  • 我需要从一个Hive表中读取数据并将其插入到另一个Hive表中。两个表的架构是相同的。该表按日期分区 步骤1:从Spark的源表中读取数据。 第 2 步:按列(国家、日期)和分区数重新分区为 4。 我只得到每个国家代码1个分区

  • 我在这里浏览了文档:https://spark . Apache . org/docs/latest/API/python/py spark . SQL . html 它说: 重新分区:生成的DataFrame是哈希分区的 对于repartitionByRange:结果DataFrame是范围分区的 而且之前的一个问题也提到了。然而,我仍然不明白它们到底有什么不同,当选择一个而不是另一个时会有什么

  • 在Spark流式传输中,是否可以将特定的RDD分区分配给集群中的特定节点(为了数据局部性?) 例如,我得到一个事件流[a,a,a,b,b],并有一个2节点的Spark集群。 我希望所有的a总是去节点1,所有的b总是去节点2。 谢啦!