刚开始学习MapReduce,我有一个文件,里面有一个演员和他扮演的电影(每行)。我想创建一个文件如下:
actor movie1, movie2, ..., movieN
即一个键值文件,但只有一个演员和他的所有电影的一行外观。这没问题。
在我创建了这个文件之后,我想找到一个扮演大多数电影的演员作为第二个MR-Job。我读取了我的新文件(上一个作业的输出),并简单地用数字替换(在map()
中)电影。在我的Reducer中,我只需要与之前的结果进行比较
if(numberOfRoles.get() < sum){
numberOfRoles.set(sum);
actorWithMostRoles.set(key);
}
其中numberOfRoles和actorWithMostRoles是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