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

0

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

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

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

profile picture
专家
已提问 5 个月前5 查看次数
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
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则