【问题标题】:What is the relationship between buckets and partitions?桶和分区之间有什么关系?
【发布时间】:2015-08-12 16:52:05
【问题描述】:

RDD 的 Partitions 和 RDD 的内容在 shuffle 操作之前映射到的 Buckets 之间是否存在关系?

其次,所有具有相同键的键值对是否会被洗牌到同一个桶中,还是键值对到桶中的分布是随机的?指定分区器(哈希/范围)是否会影响此分布?

【问题讨论】:

  • 如果你看一下HashShuffleWriter 的实现,你会发现几乎没有区别。 bucketId 是使用partitioner.getPartition 上的key 确定的。
  • @zero323 那么,按照这个逻辑,传递给HashShuffleWriterwrite() 方法的records: Iterator[Product2[K, V]] 包含存储桶的实际内容?
  • 这是我的理解。查看ShuffleWriterGroup 的文档字符串。

标签: apache-spark apache-spark-sql


【解决方案1】:

RDD 的 Partitions 和 RDD 的内容在 shuffle 操作之前映射到的 Buckets 之间是否存在关系?

如果您询问分桶表(在bucketByspark.table("bucketed_table") 之后),我认为答案是肯定的。

让我告诉你我回答“是”的意思。

val large = spark.range(1000000)
scala> println(large.queryExecution.toRdd.getNumPartitions)
8

scala> large.write.bucketBy(4, "id").saveAsTable("bucketed_4_id")
18/04/18 22:00:58 WARN HiveExternalCatalog: Persisting bucketed data source table `default`.`bucketed_4_id` into Hive metastore in Spark SQL specific format, which is NOT compatible with Hive.

scala> println(spark.table("bucketed_4_id").queryExecution.toRdd.getNumPartitions)
4

换句话说,分区的数量(在加载分桶表之后)正是存储桶的数量(您在保存时定义的)。

其次,所有具有相同key的键值对是否会被洗牌到同一个桶中,还是键值对到桶中的分布是随机的?

Spark 2.3(我相信早期版本的工作方式类似)对每个分区进行分桶(写入任务),即每个分区都有您定义的桶数。

在上述情况下,您最终会得到 8(分区)x 4(桶)= 32 个桶文件(_SUCCESS 有两行额外的行,标题为 34)。

$ ls -ltr spark-warehouse/bucketed_4_id | wc -l
      34

指定分区器(散列/范围)对这个分布有任何影响吗?

我认为是这样,因为分区器用于跨分区分配数据。

【讨论】:

    猜你喜欢
    • 2010-11-29
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 2019-05-04
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多