为什么重新分配和合并缓慢的火花

时间:2016-03-17 02:24:20

标签: apache-spark

我制作了需要保存为文本文件(.csv)的RDD。 由于它并行工作,输出文件与工作号码一样多。 我使用" repatition或coalesce"制作RDD后会将输出作为一个文件。

myRDDData.repatition(1).saveAsTextFile(..path)
or
myRDDData.coalesce(1).saveAsTextFile(..path)

效果很好,但使用起来很慢。

我只需要像" cat *>这样的命令输出"在壳中。 对此有何想法?感谢。

1 个答案:

答案 0 :(得分:1)

要回答标题中的问题:repartitioncoalesce速度很慢,因为它们会混乱数据,数据移动速度很慢。 coalesce通常会更快,因为它只允许减少分区数量,因此Spark不必移动所有数据(它可以保存尽可能多的分区,只需移动剩余的分区) )。

回答你的问题。有几个选择:

1)你正在做的重新分配/合并为1。请注意:请注意不要在此之后创建新的RDD并使用它们,因为这可能会导致问题(流上的RDD也可能只有1个分区)

2)如果结果数据足够小并且驱动程序节点可以在内存中处理它,您可以myRDDData.collect()然后使用标准Scala / Java API将其保存到文件中

3)执行myRDDData.saveAsTextFile(path),然后使用Java / Scala API合并文件,如何执行此操作取决于目标FS,但它们可能会为您提供某种API。例如,在HDFS中,您可以使用FileUtils.copyMerge()