【问题标题】:MapReduce distributed reducerMapReduce 分布式减速器
【发布时间】:2016-02-15 12:22:06
【问题描述】:

刚开始学习 MapReduce,我有一个文件,其中有一个演员和他出演的一部电影(每行)。我想创建一个文件如下:

actor     movie1, movie2, ..., movieN

即一个键值文件,但只有一个演员和他的所有电影的一行出现。这没问题。

创建此文件后,我想找到播放最多电影的演员作为第二个 MR - Job。我阅读了我的新文件(上一个作业的输出)并简单地用数字替换(在map() 中)电影。在我的 Reducer 中,我只需要与之前的结果进行比较

if(numberOfRoles.get() < sum){
        numberOfRoles.set(sum);
        actorWithMostRoles.set(key);
}

其中 numberOfRolesactorWithMostRoles 是 Reducer - Class 的属性。

这没有任何问题。

我的jps输出:

$ jps
32347 Jps
25323 DataNode
25145 NameNode
25541 SecondaryNameNode

我知道可以有多个 Mapper & Reducer。例如 Reducer_0 和 Reducer_1 将输出播放电影最多的演员。有以下数据:

演员 1 电影 1、电影 2、电影 3
演员2 电影4,电影5

所以 Reducer_0 将让 actor1 计数,从而输出 actor1 3,Reducer_1 将输出 actor2 2。所以我将有两行而不是一个 (actor1) - 因为每个 Reducer 都找到了演员。

在我描述了我的行为之后,我有以下问题:

要么我不明白它是如何工作的(使用多个减速器 - 在一个集群中),要么我必须以某种方式进行同步?

【问题讨论】:

    标签: java mapreduce distributed counting mapper


    【解决方案1】:

    是的,您了解它的工作原理。

    在此设置中,您将需要另一个 map reduce 作业来完成它。

    或者,只需使用一个 reducer 就可以了!

    【讨论】:

      【解决方案2】:

      在第二个 MR 作业中读取您的新文件(前一个作业的输出)
      并将您的 MR 更改为如下所示

      映射阶段:
      读取每个演员和他们的电影数量,并用一个特殊的键“max”和演员姓名的值对输出,他们的电影数量就像这样

      output key = "max"  
      output value = ("actor", movieCount)
      

      减少阶段:
      您将在单个 reducer 中将所有演员及其电影计数作为值列表,因此只需从值列表中找到最大电影计数

      input key = "max"   
      input value = [("actor",movie_count), ("actor",movie_count) ...]   
      output key = "most movies played"      
      output value = max_value
      

      【讨论】:

        猜你喜欢
        • 2011-07-25
        • 1970-01-01
        • 2014-05-21
        • 2016-07-02
        • 2016-08-13
        • 2010-12-31
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        相关资源
        最近更新 更多