重新分区(1)和合并(1)之间的区别
Posted
技术标签:
【中文标题】重新分区(1)和合并(1)之间的区别【英文标题】:Difference between repartition(1) and coalesce(1) 【发布时间】:2021-09-12 06:23:35 【问题描述】:在我们的项目中,我们使用repartition(1)
将数据写入表中,我很想知道为什么这里不能使用coalesce(1)
,因为repartition
与coalesce
相比是一个昂贵的操作。
我知道repartition
将数据平均分布在分区之间,但是当输出文件是单部分文件时,为什么我们不能使用coalesce(1)
?
【问题讨论】:
另见***.com/questions/44494656/…coalesce(1)
和 repartition(1)
之间的差异可能会因旧 Spark 版本而出现:***.com/questions/71154277
【参考方案1】:
coalesce
有一个问题,如果您使用小于当前执行程序数量的数字调用它,则用于处理该步骤的执行程序数量将受到您传递给合并函数的数量的限制。
repartition
函数通过混洗数据避免了这个问题。在您将数据减少到单个分区(或者实际上,少于一半的执行程序)的任何情况下,您几乎应该总是使用 repartition
而不是因为这个原因。重分区造成的shuffle,比起调用coalesce(1)
的单线程操作来说,是不小的代价
【讨论】:
【参考方案2】:你没有在逻辑方面陈述其他任何内容。
coalesce
将使用现有分区来最小化洗牌。在 coalsece(1) 和对应的情况下可能没什么大不了的,但是可以采用 repartition
创建新分区并因此进行完全洗牌的指导原则。也就是说,coalsece 可以说是为了尽量减少改组的次数。
在我的业余时间,我偶然发现了这篇 https://medium.com/airbnb-engineering/on-spark-hive-and-small-files-an-in-depth-look-at-spark-partitioning-strategies-a9a364f908 优秀的文章。寻找引用:Coalesce 在某些情况下听起来很有用,但有一些问题。
【讨论】:
以上是关于重新分区(1)和合并(1)之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
如何将Linux系统下将俩个硬盘合并成一个分区,请高手帮忙!