Spark:减少没有.输出文件

Dil*_*eam 10 apache-spark

我编写了一个模拟现有Map Reduce作业功能的Spark程序.MR工作每天大约需要50分钟,但Spark工作只用了9分钟!那很棒!

当我查看输出目录时,我注意到它创建了1,020个部分文件.MR作业仅使用20个减速器,因此它只创建20个文件.我们需要减少输出文件的数量; 否则我们的命名空间很快就会满了.

我试图找出如何减少Spark下的输出文件数量.似乎有1,020个任务被触发,每个任务都会创建一个零件文件.它是否正确?我是否必须更改并行度以减少否.因此减少了任务.输出文件?如果是这样我该怎么设置呢?我恐怕不会减少.任务会减慢这个过程 - 但我可以测试一下!

Mik*_*kia 10

减少减少任务的数量肯定会减慢过程.但是,对于您的用例,它仍然应该比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");
Run Code Online (Sandbox Code Playgroud)

在此示例中,map函数将由1020个任务执行,这些任务不会以任何方式更改.但是,在合并分区后,应该只有20个分区可供使用.在这种情况下,将在程序结束时保存20个输出文件.

如前所述,考虑到此方法将比具有1020个输出文件慢.数据需要存储在几个分区中(从1020到20).

注意:请查看repartition以下链接中的命令.