我有一个示例输入文件,如下所示,其中包含序列号,名称,药物,性别,花费的金额。我的要求是获得每种药物的总花费。我编写了一个Mapreduce程序,并在我的本地机器上运行它,在单节点集群下安装了Hadoop和其他必要的软件包。
对于上面的输入我期望输出如下。
avil 2310
metacin 2226
paracetamol 2402
当我将减速器类声明为
时
公共类VisReducer扩展了Reducer< Text,IntWritable,Text,IntWritable> 。我得到了预期的输出,一切看起来都不错。
但是我错误地将我的减速器类声明改为了 公共类VisReducer扩展了Reducer<文字,Iterable< IntWritable>,Text,IntWritable> 。输出似乎只是一个Mapper输出,看起来由于某种原因,Reduceer类中的reduce方法还没有运行。我在reduce方法中添加了一个System.out.println(),并检查了日志,看不到我打印的内容,而在第一种情况下,我可以看到输出。我无法理解造成这个问题的原因。
有人可以帮我理解究竟发生了什么。
在我的第二个案例中输出。
avil 439
avil 999
avil 872
metacin 659
metacin 649
metacin 918
paracetamol 178
paracetamol 836
paracetamol 734
paracetamol 654
这可能是一个非常基本的问题,因为我刚刚开始我的hadoop学习,并且无法在线找到任何相关的排队。
答案 0 :(得分:0)
根据规范
声明Reducer
时,您将获得所需的输出
访问Reducer上的Apache文档页面,Reducer
包含四个参数
org.apache.hadoop.mapreduce
Class Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>
KEYIN - the input key
VALUEIN - the input value
KEYOUT - the output key type
VALUEOUT - the output value
从你的例子:
public class VisReducer extends Reducer < Text, IntWritable, Text, IntWritable >
KEYIN - Text
VALUEIN - IntWritable
KEYOUT - Text
VALUEOUT - IntWritable
如果您将输入键作为Text传递,将输入值作为IntWritable输入到Reducer,它将生成输出键为Text,输出值为IntWritable
答案 1 :(得分:0)
在所有映射器完成它之后,它们将输出作为键值对。 例如:假设2个映射器在你的情况下,映射器输出是
mapper1 o / p
key1,value1
key2,value1
mapper2 o / p
key1,value2
key3,value1
key2,value2
然后将调用Reducer类。 Reducer类有3个阶段。
1.Shuffle:Reducer通过网络使用HTTP复制每个Mapper的排序输出。 这里的shuffed temp o / p是
key1,value1
key2,value1
key1,value2
key3,value1
key2,value2
2.Sort:框架合并按键对Reducer输入进行排序(因为不同的Mapper可能输出相同的键)。
这里排序的温度o / p是
key1,value1
key1,value2
key2,value1
key2,value2
key3,value1
3.Reduce:在此阶段,为排序的输入中的每个调用reduce(Object,Iterable,org.apache.hadoop.mapreduce.Reducer.Context)方法。 这里实际的reduce方法适用于mapper o / p它将输入视为
key1,<value1,value2>
key2,<value1,value2>
key3,<value1>
Reducer类声明和Reducer类中的reduce方法将有所不同。由于Reducer类的输入参数将是Mapper类的输出参数(最大情况),reduce方法参数将是(Object,Iterable,org.apache.hadoop.mapreduce.Reducer.Context)。