我正在尝试编写代码,以获取访问该网站的十大IPAddress。我有示例日志,第一个MR代码的输出如下所示:
01-dynamic-c.rotterdam.luna.net 1
01-dynamic-c.wokingham.luna.net 28
02-dynamic-c.wokingham.luna.net 13
03-dynamic-c.wokingham.luna.net 15
04-dynamic-c.rotterdam.luna.net 22
现在,我想在第二个MR作业中计算TopN,但mapper中的树图大小始终为1。看起来在树图上的放置操作不断替换我的旧条目。
private TreeMap<Text, Integer> repToRecordMap = new TreeMap<Text, Integer>();
int count = 0;
@Override
public void map(Text key, Text value, Context context)
throws IOException, InterruptedException {
System.out.println("key ==> " + key);
System.out.println("value ==> "
+ Integer.parseInt(value.toString()));
System.out.println("size ==> " + repToRecordMap.size());
repToRecordMap.put(key, Integer.parseInt(value.toString()));
}
这是System.out在日志中打印的内容:
key ==> ***.novo.dk
value ==> 16
**size ==> 1**
key ==> 007.thegap.com
value ==> 45
**size ==> 1**
key ==> 01-dynamic-c.rotterdam.luna.net
value ==> 1
**size ==> 1**
每次我有一个新密钥,但大小始终为1时,这意味着它将不断用新密钥替换我的旧密钥。请帮我为什么会这样?
谢谢
最佳答案
您应该将文本对象转换为字符串并定义Map<String, Integer>
。 MapReduce框架尽可能重用可序列化的对象以进行内存优化。我认为这就是您所遇到的情况,即使它们表示不同的字符串,文本对象也是相同的(在对象级别)。