[英]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.