首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >似乎在我的reducer类中没有运行减速器方法。

似乎在我的reducer类中没有运行减速器方法。
EN

Stack Overflow用户
提问于 2016-04-12 09:05:17
回答 2查看 67关注 0票数 0

我有一个样本输入文件如下,其中包括序号,名称,药品,性别,金额支出。我的要求是得到每一种药物的总花费。我已经编写了一个Mapreduce程序,并在本地机器上运行它,在一个节点集群中安装了Hadoop和其他必要的包。

  1. Irma Ellison,avil,女性,872岁
  2. 希拉里·布什,阿维尔,男,999岁
  3. Ahmed Mejia,扑热息痛,女,654岁
  4. 格雷斯·布恩,美沙星,女性,918岁
  5. Hayes Ortiz,扑热息痛,男,734岁
  6. Lani Matthews,扑热息痛,女,836岁
  7. 凯瑟琳·斯图尔特,扑热息痛,男,178岁
  8. Jonas Boone,美沙星,女性,649岁
  9. Desiree Pearson,avil,男,439岁
  10. 布兰妮·沙利文,美沙星,女,659岁

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

代码语言:javascript
代码运行次数:0
运行
复制
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无法理解是什么导致了这个问题。

有人能帮我弄清楚到底发生了什么吗。

在我的第二个例子中输出。

代码语言:javascript
代码运行次数:0
运行
复制
avil    439  
avil    999  
avil    872  
metacin 659  
metacin 649  
metacin 918  
paracetamol 178  
paracetamol 836  
paracetamol 734  
paracetamol 654  

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

EN

回答 2

Stack Overflow用户

发布于 2016-04-12 10:44:28

当您按照规范声明Reducer时,您将得到所需的输出。

访问减速器上的Apache文档页面,Reducer包含四个参数

org.apache.hadoop.mapreduce

代码语言:javascript
代码运行次数:0
运行
复制
Class Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT>

KEYIN    - the input key  
VALUEIN  - the input value 
KEYOUT   - the output key type
VALUEOUT - the output value 

从你的例子来看:

代码语言:javascript
代码运行次数:0
运行
复制
public class VisReducer extends Reducer < Text, IntWritable, Text, IntWritable >


KEYIN     - Text  
VALUEIN   - IntWritable
KEYOUT    - Text
VALUEOUT  - IntWritable 

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

票数 0
EN

Stack Overflow用户

发布于 2016-04-13 12: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)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36568495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档