apache-spark - Spark 输出文件 : Cut down no.

标签 apache-spark

我编写了一个 Spark 程序来模仿现有 MapReduce 作业的功能。 MR作业每天大约需要50分钟,但是Spark作业只需要9分钟!那太棒了!

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

我正在尝试找出如何减少 Spark 下输出文件的数量。似乎有 1,020 个任务被触发,每个任务都会创建一个零件文件。它是否正确?我是否必须更改并行级别才能减少否。任务从而减少了数量。输出文件?如果是这样我该如何设置?恐怕砍不了。过多的任务会减慢这个过程 - 但我可以测试一下!

最佳答案

减少减少任务的数量肯定会减慢进程。但是,对于您的用例来说,它仍然应该比 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上的重新分区命令也是。

关于apache-spark - Spark 输出文件 : Cut down no.,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25967961/

相关文章:

java - 使用 Scala Apache Spark 合并 RDD

apache-spark - 文件已存在错误从数据帧写入新文件

python - 时间过滤 Pyspark 数据框中的结构列

apache-spark - Spark Streaming forEachBatch 在写入数据库时​​给出不一致/无序的结果

java - 如何在流批流连接中定义连接条件?

apache-spark - Apache Spark 中的 Spark 驱动程序

java - 为什么自定义接收器会失败并显示 "NoClassDefFoundError: scala/runtime/AbstractPartialFunction"?

scala - 如何在 Spark-Scala 中创建具有已定义架构的行?

scala - 我如何将 Apache Spark 与 Play Framework 集成以实时显示预测?

java - Spark : Yarn Containers to use multiple JMX port on same machine