MapReduce分布式减速器



刚开始学习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_0和Reducer_1,它们将输出播放电影最多的演员。具有以下数据:

actor1 movie1,movie2,movie3
演员2电影4,电影5

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

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

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

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

您将需要另一个地图缩减作业来完成此设置。

或者,只需使用一个减速器就可以了!

在第二个MR作业中读取新文件(上一个作业的输出)
把你的MR改成下面的样子

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

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

还原阶段:
你会得到所有的演员和他的电影计数作为一个单一的减少值列表,所以只需从值列表中找到最大电影计数

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

相关内容

  • 没有找到相关文章

最新更新