火花重新分配不均匀,仍然偏斜
Posted
技术标签:
【中文标题】火花重新分配不均匀,仍然偏斜【英文标题】:spark repartition is not uniform, still skewed 【发布时间】:2018-09-16 11:30:20 【问题描述】:如何强制(大部分)均匀分布?
我想执行以下操作:
df.repartition(5000) // scatter
.transform(some_complex_function)
.repartition(200) // gather
.write.parquet("myresult")
确实,在重新分区步骤之后执行了 5000 个任务。但是,每个任务的输入文件大小在小于 1MB 到 16MB 之间变化。
数据仍然存在偏差。如何确保它不再倾斜并有效地使用集群资源。
编辑
我了解到,这是由于使用了复杂类型的列,即数组。另请注意,some_complex_function
在此列上运行,即其复杂性随着数组中元素的数量而增加。
对于这种情况,有没有更好的分区方法?
【问题讨论】:
【参考方案1】:repartition
应该均匀分布记录的数量,您可以使用此处列出的技术来验证:Apache Spark: Get number of records per partition
如果您的记录包含一些复杂的数据结构,或各种长度的字符串,那么每个分区的字节数将不相等。我在这里要求解决这个问题:How to (equally) partition array-data in spark dataframe
【讨论】:
我几乎可以肯定我遇到了同样的问题。但是,在我的情况下,输入数据相当小(假设为 10G)并且转换相当昂贵。与您自己的情况一样,它与 DF 的记录不成比例,而是与数组内的观察成比例。 IE。在我的情况下,重新分区被认为是相当便宜的(这就是我已经从默认的 200 到 5000 的原因)。尽管如此,非均匀的负载分区使这项工作需要很长时间。 数组数据结构的size
多列一列,然后根据大小重新分区,你怎么看?
但是,这会将所有大小相同的数组放到同一个分区中,这不是我想要的。特别是对于大型数组。以上是关于火花重新分配不均匀,仍然偏斜的主要内容,如果未能解决你的问题,请参考以下文章