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

0

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

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

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

profile picture
EXPERTE
gefragt vor 6 Monaten9 Aufrufe
1 Antwort
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
EXPERTE
beantwortet vor 6 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen