我编写了一个模拟现有Map Reduce作业功能的Spark程序。 MR工作每天大约需要50分钟,但Spark工作只用了9分钟!那很棒!
当我查看输出目录时,我注意到它创建了1,020个部分文件。 MR作业仅使用20个减速器,因此它只创建20个文件。我们需要减少输出文件的数量;否则我们的命名空间很快就会满了。
我试图找出如何减少Spark下的输出文件数量。似乎有1,020个任务被触发,每个任务都会创建一个零件文件。它是否正确?我是否必须更改级别的并行性以减少否。因此减少了任务。输出文件?如果是这样我该怎么设置呢?我恐怕不会减少。任务会减慢这个过程 - 但我可以测试一下!
答案 0 :(得分:10)
减少 reduce 任务的数量肯定会减慢这个过程。但是,对于您的用例,它仍然应该比 Hadoop MapReduce 快得多。
在我看来,限制输出文件数量的最佳方法是使用coalesce(numPartitions)
转换。以下是一个例子:
JavaSparkContext ctx = new JavaSparkContext(/*your configuration*/);
JavaRDD<String> myData = ctx.textFile("path/to/my/file.txt");
//Consider we have 1020 partitions and thus 1020 map tasks
JavaRDD<String> mappedData = myData.map( your map function );
//Consider we need 20 output files
JavaRDD<String> newData = mappedData.coalesce(20)
newData.saveAsTextFile("output path");
在此示例中,map函数将由1020个任务执行,这些任务不会以任何方式更改。但是,在合并分区后,应该只有20个分区可供使用。在这种情况下,将在程序结束时保存20个输出文件。
如前所述,请注意此方法将比具有1020个输出文件慢。数据需要存储在几个分区中(从1020到20)。
注意:请查看以下link上的repartition
命令。