我有一个样本输入文件如下,其中包括序号,名称,药品,性别,金额支出。我的要求是得到每一种药物的总花费。我已经编写了一个Mapreduce程序,并在本地机器上运行它,在一个节点集群中安装了Hadoop和其他必要的包。
对于上述输入,我期望输出如下所示。
avil 2310
metacin 2226
paracetamol 2402
当我宣布我的减速机类为
公共类VisReducer扩展Reducer < Text、IntWritable、Text、IntWritable >。我得到了我的预期产出,一切看起来都很好。
但我错误地将减速机类声明更改为
公共类VisReducer扩展了Reducer<文本、Iterable< IntWritable >、Text、IntWritable >。输出似乎只是一个Mapper输出,由于某种原因,Reduceer类中的Reduceer方法没有运行。我在reduce方法中添加了一个System.out.println(),检查了日志,看不到我打印的内容,而在第一个例子中,我可以看到输出。nI无法理解是什么导致了这个问题。
有人能帮我弄清楚到底发生了什么吗。
在我的第二个例子中输出。
avil 439
avil 999
avil 872
metacin 659
metacin 649
metacin 918
paracetamol 178
paracetamol 836
paracetamol 734
paracetamol 654
这可能是一个非常基本的问题,因为我刚刚开始我的hadoop学习,在网上找不到任何相关的问题。
发布于 2016-04-12 02:44:28
当您按照规范声明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
如果将输入键作为文本传递,输入值作为IntWritable传递给Reducer,它将生成输出键作为文本,输出值作为IntWritable。
发布于 2016-04-13 04:47:07
毕竟,映射器完成了它的工作--它们将out作为键,值对。对于ex:让我们假设在我们的情况下,映射器的输出是
mapper1 o/p
key1,value1 key2,value1
mapper2 o/p
key1,value2 key3,value1 key2,value2
然后调用Reducer类。减速器类有三个阶段。
1.洗牌: Reducer通过网络使用HTTP复制来自每个Mapper的排序输出。在这里,调整后的温度/p是
key1,value1 key2,value1 key1,value2 key3,value1 key2,value2
2.排序:框架合并按键排序Reducer输入(因为不同的Mappers可能输出相同的键)。
在这里,排序的temp /p是
key1,value1 key1,value2 key2,value1 key2,value2 key3,value1
3.约简:在这个阶段中,对排序输入中的每个输入都调用减(Object,Iterable,org.apache.hadoop.mapreduce.Reducer.Context)方法。这里,在mapper o/p上工作的实际还原方法,它将输入作为
key1,<value1,value2> key2,<value1,value2> key3,<value1>
Reducer类声明和Reducer类的减少方法将是不同的。因为Reducer类的输入参数将是Mapper类的输出参数(最大情况),而约简方法参数将是(Object,Iterable,org.apache.hadoop.mapreduce.Reducer.Context)。
https://stackoverflow.com/questions/36568495
复制相似问题