Spark RDD.saveAsTextFile将空文件写入S3

时间:2016-01-26 07:43:07

标签: amazon-s3 apache-spark

我正在尝试使用Spark 1.6(spark-1.6.0-bin-hadoop2.4.tgz)执行map-reduce作业,该作业从S3读取输入并将输出写入S3。

阅读工作正常:sc.textFile(s3n://bucket/path/to/file/file.gz)

然而,我在使写入工作时遇到了一些麻烦。我使用相同的存储桶输出文件:outputRDD.saveAsTextFile(s3n://bucket/path/to/output/)

当我的输入非常小(<100条记录)时,这似乎工作正常。我看到每个分区写入一个part-NNNNN文件,其中一些文件有0个字节,其余文件低于1 KB。检查非空文件的时间点显示正确格式化的map-reduce输出。当我移动到稍微大一点的输入(~500条记录)时,我看到相同数量的part-NNNNN文件(我的分区数量对于这些实验是不变的),但每一个都是空的。

当我尝试更大的数据集(数百万条记录)时,我的想法是我超过了导致此问题的S3限制。然而,500条记录(相当于约65 KB压缩)仍然是一些非常少量的数据,我认为Spark和S3应该很容易处理。

我已尝试使用S3 Block FileSystem而不是概述here的S3 Native FileSystem。但得到相同的结果。我已经为我的S3水桶打开了日志,但我似乎找不到那里的吸烟枪。

还有其他人经历过这个吗?或者可以给我一个可能出错的线索?

2 个答案:

答案 0 :(得分:0)

原来我昨晚工作太晚了。今天早上,我退了一步,发现了map-reduce中的一个错误,它有效地过滤了所有结果。

答案 1 :(得分:-3)

您应该在saveAsTextFile之前使用coalesce

来自spark programming guide

Decrease the number of partitions in the RDD to numPartitions. Useful
for running operations more efficiently after filtering down a large
dataset.

例如:

outputRDD.coalesce(100).saveAsTextFile(s3n://bucket/path/to/output/)