首页 > 解决方案 > 如何确定 Spark 中的存储桶数量

问题描述

我已经阅读了很多关于 Spark 分桶的文章,但仍然无法清楚地了解它。但是到目前为止我所理解的是“Bucketing就像分区内的分区,它用于具有非常高基数的候选人,这有助于避免重新洗牌操作”。

即使在 Spark 文档中,也找不到足够的解释。粘贴文档中的示例

peopleDF.write.bucketBy(42, "name").sortBy("age").saveAsTable("people_bucketed")

在这里无法理解,数字“42”是如何决定分桶的。请帮助理解相同。此外,任何关于分桶的更清晰的解释也会很棒。

标签: apache-spark

解决方案


42 人生的意义是什么?因此,一个例子。

Spark Bucketing 对 Spark 中的 ETL 很方便,其中 Spark Job A 根据 Bucketing def 写出 t1 的数据,Spark Job B 同样写出 t2 的数据,Spark Job C 使用 Bucketing 定义连接 t1 和 t2,避免了 shuffle 即交换。优化。

没有通用公式。这取决于卷、可用的执行者等。主要的一点是避免洗牌。作为指导,JOINing 和 AGGr 的默认值设置为 200,因此 200 或更大可能是一种方法,但是您的集群上有多少资源?

但是为了满足您对知识的追求,人们可能会争辩说,42 应该设置为您分配给 Spark 作业/应用程序的执行器数量(= 1 个核心),撇开偏度问题不谈。


推荐阅读