【问题标题】:Seems like reducer method not running in my Reducer class似乎减速器方法没有在我的减速器类中运行
【发布时间】:2016-04-13 20:47:07
【问题描述】:

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

  1. Irma Ellison,avil,female,872
  2. 希拉里·布什,avil,男,999
  3. Ahmed Mejia,扑热息痛,女,654
  4. 格蕾丝·布恩,metacin,女,918
  5. Hayes Ortiz,扑热息痛,男,734
  6. Lani Matthews,扑热息痛,女,836
  7. 凯瑟琳·斯图尔特,扑热息痛,男,178
  8. 乔纳斯·布恩,metacin,女,649
  9. Desiree Pearson,avil,男,439
  10. Britanney Sullivan,metacin,女,659

对于上述输入,我期望输出如下。

avil    2310  
metacin 2226  
paracetamol 2402

当我将 reducer 类声明为
public class VisReducer extends Reducer 时。我得到了预期的输出,一切看起来都很好。

但我错误地将reducer 类声明更改为
public class VisReducer extends Reducer, Text, IntWritable > 。输出似乎只是一个 Mapper 输出,并且由于某种原因,Reducer 类中的 reduce 方法没有运行。我在 reduce 方法中添加了一个 System.out.println(),并检查了日志,看不到我打印的内容,而在第一种情况下,我可以看到输出。 n我无法理解导致问题的原因。

有人可以帮助我了解到底发生了什么。

在我的第二种情况下输出。

avil    439  
avil    999  
avil    872  
metacin 659  
metacin 649  
metacin 918  
paracetamol 178  
paracetamol 836  
paracetamol 734  
paracetamol 654  

这可能是一个非常基本的问题,因为我刚刚开始学习 hadoop,在网上找不到任何相关的问题。

【问题讨论】:

  • 发布您的驱动程序代码。

标签: java hadoop2


【解决方案1】:

当您按照规范声明 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 

如果将输入键作为文本,输入值作为 IntWritable 传递给 Reducer,它将生成输出键作为文本,输出值作为 IntWritable

【讨论】:

    【解决方案2】:

    在所有映射器完成它的工作后,它们将输出作为键值对。 例如:假设在你的情况下有 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 的排序输出。 这里改组的 temp o/p 是

    key1,value1 key2,value1 key1,value2 key3,value1 key2,value2

    2.Sort:框架对Reducer输入的key进行merge排序(因为不同的Mapper可能输出相同的key)。

    这里是排序的 temp o/p

    key1,value1 key1,value2 key2,value1 key2,value2 key3,value1

    3.Reduce:在这个阶段,reduce(Object, Iterable, org.apache.hadoop.mapreduce.Reducer.Context) 方法在排序后的输入中被调用。 这里是在映射器 o/p 上工作的实际 reduce 方法,它将输入作为

    key1,<value1,value2> key2,<value1,value2> key3,<value1>

    Reducer 类的声明和 Reducer 类中的 reduce 方法会有所不同。由于 Reducer 类的输入参数将是 Mapper 类的输出参数(最大情况),reduce 方法参数将是 (Object, Iterable,org.apache.hadoop.mapreduce.Reducer.Context)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      相关资源
      最近更新 更多