如何确定 Apache Spark Dataframe 中的分区大小

Car*_*onp 5 apache-spark pyspark databricks

我一直在使用 SE 上发布的问题的出色答案来确定分区数量以及数据帧中分区的分布 需要了解 Spark Dataframe 中的分区详细信息

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

谢谢

jac*_*ack 8

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

\n

并行度

\n

“良好”的高水平并行性非常重要,因此您可能希望拥有大量分区,从而导致分区大小较小。

\n

然而,由于以下第三点 -分配开销,该数量存在上限。尽管如此,它仍然排名第一,所以假设如果您必须犯错误,请从高并行性方面开始。

\n

一般来说,建议每个核心执行 2 到 4 个任务。

\n\n
\n

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

\n
\n
    \n
  • 《火花在行动》一书(作者 Petar Zecevi\xc2\xb4c)写道(第 74 页):
  • \n
\n
\n

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

\n
\n

记忆配件

\n

如果分区大小非常大(例如> 1 GB),您可能会遇到垃圾收集、内存不足错误等问题,特别是当存在洗牌操作时,根据Spark 文档

\n
\n

有时,您会收到 OutOfMemoryError 错误,不是因为您的 RDD 不适合内存,而是因为其中一项任务的工作集(例如 groupByKey 中的其中一个reduce 任务)太大。Spark\xe2\x80\x99s 混洗操作(sortByKey、groupByKey、reduceByKey、join 等)在每个任务中构建一个哈希表来执行分组,该哈希表通常很大......

\n
\n

因此,大量分区(或小分区大小)的另一个优点就出现了。

\n

分配开销

\n

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

\n
    \n
  • 数据获取、磁盘查找
  • \n
  • 数据移动、任务分配
  • \n
  • 任务状态跟踪
  • \n
\n

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

\n

带走

\n

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

\n