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

火花内部-重新分区是否加载内存中的所有分区?

东方森
2023-03-14

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

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

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

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

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

共有1个答案

白翔
2023-03-14

据我所知,重新分区肯定会触发schffle。从作业逻辑计划文档下面可以说一下重新分区

   - 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无法将所有数据加载到内存中,那么内存问题将被抛出。因此,Spark的默认处理都是在内存中完成的,即应该始终有足够的内存来存储您的数据。
持续选项可用于告诉Spark在内存不足的情况下将溢出您的数据在磁盘中。
Jacek Laskowski还解释了重新分区。
通过可视化了解您的Apache Spark应用程序应该足以让您自己测试和了解。

 类似资料:
  • 如果有人能用简单的术语回答这些与火花洗牌相关的问题,我将不胜感激。 在spark中,当加载一个数据集时,我们指定分区的数量,这表示输入数据(RDD)应该被划分为多少个块,并且根据分区的数量启动相等数量的任务(如果假设错误,请纠正我)。对于工作节点中的X个核心数。一次运行相应的X个任务。 沿着类似的思路,这里有几个问题。 因为,所有byKey操作以及联合、重新分区、连接和共组都会导致数据混乱。 >

  • 我在火花变换函数中有一个简单的问题。 coalesce(numPartitions) - 将 RDD 中的分区数减少到 numPartitions。可用于在筛选大型数据集后更有效地运行操作。 我的问题是 > < Li > < p > coalesce(num partitions)真的会从filterRDD中删除空分区吗? coalesce(numPartitions)是否经历了洗牌?

  • 我通过指定分区的数量从文本文件创建RDD(Spark 1.6)。但它给我的分区数与指定的分区数不同。 案例1 案例2 案例3 案例4 文件/home/pvikash/data/test的内容。txt是: 这是一个测试文件。将用于rdd分区 基于以上案例,我有几个问题。 对于案例2,显式指定的分区数为0,但实际分区数为1(即使默认最小分区为2),为什么实际分区数为1? 对于案例3,为什么在指定数量的

  • 如何根据列中项数的计数来分区DataFrame。假设我们有一个包含100人的DataFrame(列是和),我们希望为一个国家中的每10个人创建一个分区。 如果我们的数据集包含来自中国的80人,来自法国的15人,来自古巴的5人,那么我们需要8个分区用于中国,2个分区用于法国,1个分区用于古巴。 下面是无法工作的代码: null 有什么方法可以动态设置每个列的分区数吗?这将使创建分区数据集变得更加容易

  • 先声明一下,这不是Hadoop的生产环境。这是一个我们测试工作流的单节点环境