如何在没有重新分区和copyMerge的情况下合并spark结果文件?

Leo*_*ard 7 hadoop scala apache-spark

我用下一个代码:

csv.saveAsTextFile(pathToResults, classOf[GzipCodec])
Run Code Online (Sandbox Code Playgroud)

pathToResults目录有很多文件,如part-0000,part-0001等.我可以使用FileUtil.copyMerge(),但它真的很慢,它下载驱动程序上的所有文件,然后将它们上传到hadoop.但FileUtil.copyMerge()比以下更快:

csv.repartition(1).saveAsTextFile(pathToResults, classOf[GzipCodec])
Run Code Online (Sandbox Code Playgroud)

如何在没有重新分区和FileUtil.copyMerge()的情况下合并spark结果文件?

0x0*_*FFF 8

不幸的是,没有其他选项可以在Spark中获取单个输出文件.而不是repartition(1)你可以使用coalesce(1),但与参数1他们的行为将是相同的.Spark会在内存中的单个分区中收集您的数据,如果您的数据太大,可能会导致OOM错误.

在HDFS上合并文件的另一个选择可能是编写一个简单的MapReduce作业(或Pig作业或Hadoop Streaming作业),它将整个目录作为输入,并使用单个reducer生成单个输出文件.但请注意,使用MapReduce方法,所有数据都将首先复制到reducer本地文件系统,这可能会导致"空间不足"错误.

以下是同一主题的一些有用链接: