【问题标题】:TreeMap size is always 1 in MapReduce code在 MapReduce 代码中 TreeMap 大小始终为 1
【发布时间】:2015-09-18 21:49:30
【问题描述】:

我正在尝试编写一个代码来获取访问该网站的前十个 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。看起来树图上的 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()));

}

这是 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 时,这意味着它会不断用新密钥替换我的旧密钥。请帮助我为什么会这样?

谢谢

【问题讨论】:

    标签: hadoop mapreduce bigdata


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      相关资源
      最近更新 更多