火花重新分配不均匀,仍然偏斜

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多列一列,然后根据大小重新分区,你怎么看? 但是,这会将所有大小相同的数组放到同一个分区中,这不是我想要的。特别是对于大型数组。

以上是关于火花重新分配不均匀,仍然偏斜的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ 将消息不均匀地分配给消费者

BigDecimal 除以不均匀小数

将函数重新分配到一个值

问题重新分配分配的对象

如何根据火花数据框中的值的累积总和为每一行分配一个类别?

Spark没有将负载均匀地分配给任务