繁体   English   中英

Spark 重新分区执行器

[英]Spark Repartition Executors

我有一个大约 100GB 的数据源,我正在尝试使用日期列对其进行分区。

为了避免分区内出现小块,我添加了一个 repartition(5) 以使每个分区内最多有 5 个文件:

df.repartition(5).write.orc("path")

我的问题是,我分配的 30 个执行程序中只有 5 个实际运行。 最后我得到了我想要的(每个分区内有 5 个文件),但是由于只有 5 个执行程序在运行,因此执行时间非常长。

你对我如何让它更快有什么建议吗?

我简单地修复了它:

df.repartition($"dateColumn").write.partitionBy("dateColumn").orc(path)

并分配与我将在 output 中拥有的分区数量相同数量的执行程序。

谢谢大家

您可以使用 repartition 和 partitionBy 来解决问题。 有两种方法可以解决这个问题。

假设您需要按 dateColumn 进行分区

df.repartition(5, 'dateColumn').write.partitionBy('dateColumn').parquet(path)

在这种情况下,使用的执行程序的数量将等于5 * distinct(dateColumn)并且您的所有日期都将包含 5 个文件。

另一种方法是将数据重新分区 3 次,然后使用maxRecordsPerFile保存数据,这将创建相同大小的文件,但您将无法控制创建的文件数量

df.repartition(60).write.option('maxRecordsPerFile',200000).partitionBy('dateColumn').parquet(path)

Spark 可以为 RDD 或数据帧的每个分区运行 1 个并发任务(最多为集群中的核心数)。 如果您的集群有 30 个核心,那么您应该至少有 30 个分区。 另一方面,单个分区通常不应包含超过 128MB,单个 shuffle 块不能大于 2GB(请参阅 SPARK-6235)。 由于您想减少执行时间,最好增加分区数,并在作业结束时减少特定作业的分区数。 为了更好地(平等地)在分区之间分配数据,最好使用 hash 分区程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM