假设我有一个如下文本文件:
a 1
b 1
c 1
d 1
a 1
Hadoop拆分文件并将记录发送到3个Mappers:
Mapper1: (a,1), (b,1)
Mapper2: (c,1)
Mapper3: (d,1), (a,1)
如果我只有2个减速机,则在洗牌之后排序,减速机'输入如下:
Reducer1: (a, [1, 1])
Reducer2: (b, [1]), (c, [1]), (d, [1])
问题1 :这是否意味着在Reducer1上,reduce
方法将被完全调用1次,而对于Reducer2,reduce
方法将被调用3次?< / p>
问题2 :对于我的reduce
方法,
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException
reduce
方法是否只为每个不同的密钥调用一次?
问题3 :在每次调用期间,values
参数都包含具有相同key
的所有记录,即使有数千个数百万条记录?
答案 0 :(得分:2)
问题1:这是否意味着在Reducer1上,reduce方法将是 调用完全1次,在Reducer2上,将调用reduce方法 确实3次?
是。请记住,这并不适用于reducer&#34;尝试&#34;。因此,如果一个reducer失败,计数可能会因重试而有所不同。但是在一个JVM中你的主张是有效的。
对于每个不同的密钥,reduce方法只被调用一次吗?
是
在每次调用期间,values参数都包含ALL 具有相同密钥的记录,即使有数千万 记录?
是的,它们是流式传输的(因此是可迭代的)。因此,如果有数百万条记录,这将从本地硬盘读取。