2016-05-19 34 views
3

Spark作业(我认为)为每个分区创建一个文件,以便它可以处理故障等等,所以在作业结束时,您将剩下一个文件夹,可以留下很多文件夹。这些文件会自动加载到S3,那么有没有办法将它们合并到一个可以加载到Redshift中的压缩文件中?如何有效合并EMR上的Spark输出文件?

回答

1

相反以下,这将写每个分区一个压缩的文件在“my_rdd”的...

my_rdd.saveAsTextFile(destination) 

一个可以做......

my_rdd.repartition(1).saveAsTextFile(destination, compressionCodecClass=“org.apache.hadoop.io.compress.GzipCodec”) 

这在所有发送的数据分区到集群中的一个特定工作节点以合并成一个海量分区,然后将其写入单个gzip压缩文件。

但是,我不认为这是解决问题的理想方案。只有一个线程写出并压缩单个结果文件。如果该文件很大,那可能会“永远”。集群中的每个核心都闲置,但只有一个。 Redshift并不需要将所有内容放在一个文件中。 Redshift可以轻松处理加载一组文件---使用COPY和“清单文件”或“前缀”:Using the COPY Command to Load from S3