Hadoop Reducer中的HashMap错误

时间:2013-07-06 15:50:59

标签: hadoop iterator hashmap

我正在追踪多个MapReduce作业,并且只在一次迭代(第8​​1次)中我遇到了这个错误。 我将(键,值)对存储在ConcurrentHashMap中,并在迭代它们时,存储的对看起来与最初输入的对不同。 具体来说,我检查所有对,K<=V.length()。 所有对都满足这个条件,但是一旦我从HashMap再次读取对,就会有一对违反它。

这是我的代码:

    for (StockValue value : values) { //StockValue has (Text first, Text second)
      String location = key.getSecond().toString();
      int loc = 0;
      try {
        loc = Integer.parseInt(location);
      } catch (Exception e) {
        System.err.println(e.getMessage());
      }
      assignVal(origReads,loc,value); //origReads is a ConcurrentHashMap<Integer,StockValue>
    }

    for (Integer location : origReads.keySet() ) {

      int loc = location.intValue();

      for (StockValue val : origReads.get(location)){

        String read = val.getSecond().toString();
        String flag = val.getFirst().toString();

        if (contigs.isEmpty()) {  //contigs is a ConcurrentHashMap
          assignVal(contigs,loc,val);
          continue;
        }
        else { //do some processing}
      }
    }

    public static <Integer, StockValue> void assignVal(
      ConcurrentHashMap<Integer,List<StockValue>> map, Integer key, StockValue value) {

      List<StockValue> values = map.get(key);
      if(values==null){
        values=new ArrayList<StockValue>();
        map.put(key,values);
      }
      values.add(value);
    }

我没有包含else处理,因为在到达该块之前contigs.size()==2发生了错误。

事实上,在打印origReads时,我发现两个值中的一个已被复制,而密钥保持不变(因此为什么K>value.length()为一对)。

我不确定为什么这只发生在一次迭代中,肯定有减速器之前只接收到2个值。 是否有可能存在碰撞哈希值影响这个? 我已经坚持了一段时间。

0 个答案:

没有答案