MapReduce 分布式减速器

MapReduce distributed reducer

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

actor     movie1, movie2, ..., movieN

即一个键值文件,但只有一个演员及其所有电影的台词。这没问题。

创建此文件后,我想找到播放电影最多的演员作为第二个 MR - 工作。我阅读了我的新文件(上一个作业的输出)并简单地用数字替换(在 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 将输出播放电影最多的演员。具有以下数据:

actor1 movie1, movie2, movie3
actor2 movie4, movie5

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

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

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

是的,你明白它是如何工作的。

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

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

在第二个 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