如何确定 Apache Spark 数据帧中的分区大小

Posted

技术标签:

【中文标题】如何确定 Apache Spark 数据帧中的分区大小【英文标题】:How to Determine The Partition Size in an Apache Spark Dataframe 【发布时间】:2020-10-29 22:43:24 【问题描述】:

我一直在使用 SE 此处发布的问题的出色答案来确定分区的数量以及分区在数据帧中的分布 Need to Know Partitioning Details in Dataframe Spark

有人可以帮我扩展答案以确定数据框的分区大小吗?

谢谢

【问题讨论】:

您应该确定分区的数量,而不是确定分区大小。根据文档,推荐的数量是 [2,4] * 核心总数 【参考方案1】:

调整分区大小不可避免地与调整分区数有关。在此范围内至少需要考虑 3 个因素:

并行度

“良好”的高并行度很重要,因此您可能希望拥有大量分区,从而减小分区大小。

但是,由于以下第 3 点 - 分配开销,该数字存在上限。尽管如此,它仍然是优先级 #1,所以假设你必须犯错,从高并行度的一侧开始。

通常,建议每个核心执行 2 到 4 个任务。

Spark doc:

一般来说,我们建议集群中每个 CPU 内核执行 2-3 个任务。

Spark in action(作者 Petar Zecevi´c)一书写道(第 74 页):

我们建议使用比集群中的核心多三到四倍的分区

内存拟合

如果分区大小非常大(例如> 1 GB),您可能会遇到垃圾收集、内存不足错误等问题,尤其是在进行随机播放时,根据Spark doc:

有时,你会得到一个 OutOfMemoryError,不是因为你的 RDD 不适合内存,而是因为你的一个任务的工作集,比如 groupByKey 中的一个 reduce 任务,太大了。 Spark 的 shuffle 操作(sortByKey、groupByKey、reduceByKey、join 等)在每个任务中构建一个哈希表来执行分组,这通常可能很大......

因此,大分区数量(或小分区大小)的另一个优点。

分配开销

分布式计算会带来开销,因此您也不能走极端。如果每个任务的执行时间少于 100 毫秒,则应用程序可能会因以下原因而产生巨大的开销:

数据获取、磁盘寻道 数据移动、任务分发 任务状态跟踪

,在这种情况下,您可以降低并行度并稍微增加分区大小。

外卖

根据经验,人们通常会尝试每个分区 100-1000MB,那么为什么不从那个开始呢?请记住,这个数字可能需要随着时间的推移重新调整..

【讨论】:

感谢您与我们联系。如果有任何 pyspark 代码可以让我知道分区大小,您能告诉我吗? 当然,这个***.com/questions/41068112/…呢? 太棒了,我刚刚访问了链接,它看起来就像我需要的一样。再次感谢

以上是关于如何确定 Apache Spark 数据帧中的分区大小的主要内容,如果未能解决你的问题,请参考以下文章

当 shuffle 分区大于 200 时会发生啥(数据帧中的 spark.sql.shuffle.partitions 200(默认情况下))

Spark DataFrame重新分区:未保留的分区数

Spark SCALA - 连接两个数据帧,其中一个数据帧中的连接值位于第二个数据帧中的两个字段之间

Apache Spark join 操作扩展性差

如何使用 spark.read.jdbc 读取不同 Pyspark 数据帧中的多个文件

将 Spark 数据帧保存为 Hive 中的动态分区表