【问题标题】:Spark: Cut down no. of output files火花:减少没有。输出文件
【发布时间】:2015-03-30 18:25:37
【问题描述】:

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

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

我试图弄清楚如何减少 Spark 下的输出文件数量。似乎触发了 1,​​020 个任务,每个任务都创建了一个零件文件。这个对吗?我是否必须更改并行度才能减少。的任务,从而减少没有。输出文件?如果是这样,我该如何设置?我害怕减少不。的任务会减慢这个过程——但我可以测试一下!

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    减少 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 命令。

    【讨论】:

    • 非常感谢米克尔。它工作得很好。此外,删除了我这边的一些错误代码,因此实际上它现在运行得更快。总时间:5分钟!阿帕奇火花摇滚!
    • 我很高兴你让它工作了。如果此答案是您问题的解决方案,请将其作为最终答案以关闭问题。
    • 我一直在查看您的其他问题,尽管实际上已经解决,但没有人被标记为已回答。请更新您的问题并标记答案(即使它们是您提供的)。
    • 我不知道“最终答案”的这个功能。我已经根据答案检查了“复选标记”。希望这是做到这一点的正确方法。如果没有,请告诉我。谢谢。
    • 确实,这是正确的做法。重要的是在解决所有问题后关闭它们以使它们更容易搜索。
    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2017-10-02
    • 2021-05-16
    • 2020-01-01
    相关资源
    最近更新 更多