在MapReduce代码中,TreeMap的大小总是1



我正试图编写一个代码,我试图获取访问该网站的十大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。看起来在treemap上的put操作一直在替换我的旧条目。

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()));
}

这是什么系统。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,这意味着它不断地用新密钥替换我的旧密钥。请告诉我为什么会发生这种情况?

谢谢

您应该将Text对象转换为String并定义Map<String, Integer>。MapReduce框架重用时可以对可序列化的对象进行内存优化。我认为这就是你的情况,Text对象是相同的(在对象级别),即使它们代表不同的String

相关内容

  • 没有找到相关文章

最新更新