在S3中对EMR Spark输出文件进行整合

0

【以下的问题经过翻译处理】 你能提供一种好的方法来将分区的Spark数据合并成一个CSV文件吗?从网上看,简单的Spark方法结合数据(“repartition”或“coalesce”)的性能很差,建议将其输出为分区的数据文件,然后将它们组合成一个文件。

s3-dist-cp似乎是这里使用的正确方法,但有一个问题不清楚,如何在组合的csv文件顶部保留一个集合的标题。

有没有一种简单的方法将输出文件合并在一起,同时删除除一个文件标题以外的所有所有文件标题?

profile picture
エキスパート
質問済み 6ヶ月前9ビュー
1回答
0

【以下的回答经过翻译处理】 s3-dist-cp在特定问题上并不一定比Spark好。这个问题的本质就是一个瓶颈,即多个输入文件可以被多个读者读取,但必须由单个写入者合并成一个输出文件。s3-dist-cp将使用多个mapper来读取输入文件,并使用单个reducer来写入输出文件。Spark也将使用多个执行器来读取输入文件,但最终的合并操作将会在一个执行器/分区中整合所有数据,以写入最终文件。由于中间数据会在内存中,因此Spark理应更快,而s3-dist-cp会将中间文件保存到磁盘中。

当输出被存储到S3中,并且需要写出大量文件时,s3-dist-cp的表现会更好。这是因为Spark在将文件写入到临时S3目录中,最后再将所有文件重命名到主目录中时,会采用更复杂的方式,这些步骤在S3中是非常昂贵的。

在这种情况下,使用Spark和coalesce(1)是最佳选择,而输出文件应该保存到HDFS中。一旦最终文件在HDFS中,如果需要将其复制到S3中,可以使用AWS S3 cli进行复制。Spark可以识别CSV文件中的标题,并且也可以在输出CSV文件中插入标题,因此不需要额外的处理来剥离或添加标题。

profile picture
エキスパート
回答済み 6ヶ月前

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン