2014-03-04 49 views
3

我可以编写只有Mappers和组合器(即没有减速器的迷你减速器)的Hadoop代码吗?Hadoop中没有减速器的组合器

job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReducer.class);

conf.setInt(“mapred.reduce.tasks”,0);

我试图这样做,但我总能看到,我有一个减少作业服务器链接

推出reduce任务在任务= 1个

如何删除减速而保持合成器?那可能吗?

回答

0

在你描述的情况下你应该使用Reducers。用作关键字:Context.getInputSplit()。getPath()+ Context.getInputSplit()。getStart() - 此组合对于每个映射器都是唯一的。

+0

哦,非常感谢,这绝对可以解决我的问题:) –

+0

使用自定义分区(比如身份)和使用主机名称作为关键字会更好吗?这应该使洗牌微不足道,这比从@ Evgeny的聪明的技巧 –

+0

出现的完整洗牌快。是的,这也应该工作:)但是什么意思是“完全洗牌”? –

0

你需要告诉你的工作,你不关心的减速机:JobConf.html#setNumReduceTasks(int)

// new Hadoop API 
jobConf.setNumReduceTasks(0); 

// old Hadoop API 
job.setNumReduceTasks(0); 

可以实现与IdentityReducer的东西。

不执行缩减,将所有输入值直接写入输出。

我不确定你是否可以保留合成器,但我会从前面的几行开始。

+0

我试过这个选项(即job.setNumReduceTasks(0);) 这个选项设置reduce任务的数量为零,但是在这种情况下我们不能有combiner! –

+0

@HadoopUser然后使用减速器! :)为什么你不想使用减速机? – Chiron

+0

开始的时候,我希望映射器X处理的所有映射任务都由同一个reducer执行,问题是我不知道选择什么作为保证的关键。所以,我说有一个组合器将使这个任务变得更容易,因为它不会查看关键字。它只考虑Mapper X作为一个包执行的所有地图任务。 –