假设我有一个如下的文本文件:
a 1
b 1
c 1
d 1
a 1
Hadoop拆分文件并将记录发送到3个映射器:
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次?
问题2对于我的reduce
方法,
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException
对于每个不同的键,reduce
方法只调用1次吗?
问题3:在每次调用期间,即使有成千上万条记录,values
参数是否包含所有具有相同key
的记录?
问题1:这是否意味着在Reducer1上,reduce方法将是在Reducer2上,reduce方法将被调用整整3次?
是的。请记住,这并不适用于减速机的"尝试"。因此,如果一个reducer失败,计数可能会因为重试而变化。但是在一个JVM中,你的声明是成立的。
是否每个键只调用一次reduce方法?
是的。
在每次调用期间,values参数是否包含ALL同一个键的记录,即使有成千上万条记录?
是的,它们是流的(因此是可迭代对象)。因此,在数百万条记录的情况下,这将从本地硬盘读取。