java - 一个reduce与多个reducer具有后处理,用于对单词进行计数和排序。哪一个更有效和可扩展?

标签 java hadoop mapreduce

我正在通过一个MapReduce作业对单词进行排序(按值)。实现此目的的两种方法:

  • 使用一个reducer并将所有内容保存在reduce函数中的HashMap中,并按cleanUp函数中的值对所有内容进行排序,然后将所有内容写入文件。
  • 在MapReduce作业之后,使用多个reducer并在HDFS中保存单词数。 MR之后,使用Java对所有内容进行排序。

  • 从效率和可伸缩性的 Angular 来看,哪种解决方案更好。

    最佳答案

    第二个变体不提供全局排序,例如如果您有2个reducer,则结果文件可能是

    part-r-00000
    word1    1
    word2    3
    
    part-r-00001
    word3    2
    word4    5
    

    即使您按值对每个文件排序,也很难按word4-word2-word3-word1降序遍历单词。您可以通过一些技巧来并行阅读。

    另一方面,单个化简器的性能较慢,因为它必须处理所有数据。同样,您可能没有足够的内存将所有数据保留在reducer JVM堆中。

    如果可能,我会选择单个 reducer 。

    关于java - 一个reduce与多个reducer具有后处理,用于对单词进行计数和排序。哪一个更有效和可扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42320726/

    相关文章:

    javascript - 并行计算方差

    hadoop - 为什么 tupleWritable 在传递给 reducer 时变空

    java - 如果对象不能在二维数组中移动则返回 true

    hadoop - 在 Hadoop 中使用流式处理

    java - 尽管在 pom 上有 commons-httpclient 和 httpcomponents 依赖,但在运行有效的 jar(使用依赖项编译)时出现 NoClassDefFoundError

    java - 运行Hadoop时如何避免OutOfMemoryException?

    hadoop - 在 hadoop 集群中执行 Mapreduce

    hadoop - HDFS 中的大块大小!未使用的空间如何计算?

    java - 如何在一个表达式中指定日期和持续时间

    java - 异常处理冒险