我正在追踪多个MapReduce作业,并且只在一次迭代(第81次)中我遇到了这个错误。
我将(键,值)对存储在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个值。 是否有可能存在碰撞哈希值影响这个? 我已经坚持了一段时间。