在将RDD数据保存到文件之前,是否需要使用联合



想象一下,我有一个有100条记录的RDD,我用10条记录对它进行了分区,所以每个分区现在都有10条记录。我只是将RDD转换为键值对RDD,并将其保存到一个文件中。现在我的输出数据被分为10个分区,这对我来说是可以的,但在将输出数据保存到文件之前使用联合函数是最好的做法吗?例如rdd.coalize(1),它只提供一个文件作为输出,而不是在节点内搅乱数据吗?想知道应该在哪里使用聚结。

感谢

如果不需要coalesce,请避免使用它。只用于减少生成的文件量。

与任何事情一样,取决于您的用例;coalesce()可以用来增加或减少分区的数量,但也有相关的成本

如果您试图增加分区的数量(其中shuffle参数必须设置为true),您将承担通过HashPartitioner重新分发数据的成本。如果您试图减少分区数,shuffle参数可以设置为false,但从当前分区集中主动抓取的节点数将是您要合并到的分区数。例如,如果您要合并为1个分区,只有1个节点在从父分区提取数据时处于活动状态(如果要合并大量数据,这可能很危险)。

不过,合并可能很有用,因为有时可以通过减少分区集大小(例如,在过滤器或稀疏内部联接之后)来提高作业的运行效率。

您可以像这个一样简单地使用它

       rdd.coalesce(numberOfPartition) 

如果减少分区,它不会打乱数据,但如果增加分区,它会打乱数据。它根据用例而定。但我们要小心使用它,因为如果您减少的分区小于或不等于集群中的核心数量,那么它就无法使用集群的全部资源。有时更少的混洗数据或网络IO,比如减少rdd分区,但等于分区的数量,这样可以提高系统的性能。

最新更新