如何强制(主要是)均匀分配?
我想执行以下操作:
df.repartition(5000) // scatter
.transform(some_complex_function)
.repartition(200) // gather
.write.parquet("myresult")
实际上,重新分区步骤后将执行5000个任务。但是,每个任务的输入文件大小在1MB至16MB之间。
数据仍然偏斜。如何确保它不再歪斜并且有效地使用了群集资源。
我了解到,这是由于使用了复杂类型的列(即数组)。另外请注意,some_complex_function
在此列上操作,即其复杂度随数组中元素的数量而增加。
在这种情况下是否有更好的分区方法?
答案 0 :(得分:1)
repartition
应该统一分配记录数,您可以使用此处列出的技术来验证:Apache Spark: Get number of records per partition
如果您的记录包含一些复杂的数据结构或各种长度的字符串,则每个分区的字节数将不相等。我在这里要求解决此问题的方法:How to (equally) partition array-data in spark dataframe