看起来像reducer方法没有在我的Reducer类

时间:2016-04-12 09:05:18

标签: java hadoop2

我有一个示例输入文件,如下所示,其中包含序列号,名称,药物,性别,花费的金额。我的要求是获得每种药物的总花费。我编写了一个Mapreduce程序,并在我的本地机器上运行它,在单节点集群下安装了Hadoop和其他必要的软件包。

  1. Irma Ellison,avil,female,872
  2. Hilary Bush,avil,男,999
  3. Ahmed Mejia,扑热息痛,女,654
  4. Grace Boone,metacin,女,918
  5. Hayes Ortiz,扑热息痛,男,734
  6. Lani Matthews,扑热息痛,女,836
  7. Cathleen Stewart,扑热息痛,男,178岁
  8. Jonas Boone,metacin,女,649
  9. Desiree Pearson,avil,男,439
  10. Britanney Sullivan,metacin,女,659
  11. 对于上面的输入我期望输出如下。

    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学习,并且无法在线找到任何相关的排队。

2 个答案:

答案 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)。