Java hadoop NaturalKeyGroupingComparator-What';减速器中发生了什么?
我目前正在从事一个JavaEMR项目,其中我的密钥由两个文本组成。 在我的一个步骤中,我将NaturalKeyGroupingComparator设置为仅比较键的左侧部分 下面是减速器的Java代码:Java hadoop NaturalKeyGroupingComparator-What';减速器中发生了什么?,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我目前正在从事一个JavaEMR项目,其中我的密钥由两个文本组成。 在我的一个步骤中,我将NaturalKeyGroupingComparator设置为仅比较键的左侧部分 下面是减速器的Java代码: public void reduce(对键、Iterable值、上下文)抛出IOException、InterruptedException{ int-totaloccurrents=0; 用于(数据值:值){ if(key.getRight().toString().equals(“*”){ T
public void reduce(对键、Iterable值、上下文)抛出IOException、InterruptedException{
int-totaloccurrents=0;
用于(数据值:值){
if(key.getRight().toString().equals(“*”){
TotalOccessments+=value.getOccessments();
}
否则{
setCount(新的IntWritable(totaloccurrencess));
}
}
}
现在一切都按计划进行得很好,但我不明白到底发生了什么。
在减速器的输入中的每个键组中,如何执行还原运行中间的键更改?< P>还原()方法。
在您的情况下,当多个文本被用作键的一部分时,键被分组使用这两个文本作为键,因此您的输出将是
键组1,count1
键组2,count2
现在,当仅基于键的左侧部分更改分组时,减速器的分组也会更改,从而提供
NewKeyGroup1, count1
NewKeyGroup2, count2
为了更深入地理解,请阅读《权威指南》第8章关于二级排序的部分。您的问题是一个很好的初学者问题:) 我已经写过了 我想需要记住的最大一点是Iterable不是由集合支持的,它是在调用next()方法时动态计算的。记住这一点 一旦你完成上面的帖子,如果你是我想看到代码类型的人 //第157行
if (hasMore) {
nextKey = input.getKey();
nextKeyIsSame = comparator.compare(currentRawKey.getBytes(), 0,
currentRawKey.getLength(),
nextKey.getData(),
nextKey.getPosition(),
nextKey.getLength() - nextKey.getPosition()
) == 0;
} else {
nextKeyIsSame = false;
}
这是来自
每次调用next()时都会调用该方法,它基本上会检查基础流中的键是否在更改,如果不是,它只会传递下一个值(记住键是有序的),否则它会安排使用新键和iterable再次调用reducer方法
底层流始终是一个键、值对,ReducerContextImpl使您产生一种错觉/抽象,认为它是一个键、集合对
就像我一开始说的
要记住的最大一点是Iterable不是由集合支持的,它是在调用next()方法时动态计算的。记住这一点
这个主题在MapReduce框架中很常见,所有的计算都是在流上完成的,没有任何东西完全加载到内存中,我花了一段时间才得到这个主题:)因此我渴望分享它