gpt4 book ai didi

Hadoop 似乎在对给定 reduce 调用的值进行迭代期间修改了我的关键对象

转载 作者:可可西里 更新时间:2023-11-01 14:19:15 26 4
gpt4 key购买 nike

Hadoop 版本:0.20.2(在 Amazon EMR 上)

问题:我有一个在映射阶段编写的自定义 key ,我在下面添加了它。在 reduce 调用期间,我对给定键的值进行了一些简单的聚合。我面临的问题是,在 reduce 调用的值迭代期间,我的 key 发生了变化,我得到了那个新 key 的值。

我的 key 类型:

 class MyKey implements WritableComparable<MyKey>, Serializable {
private MyEnum type; //MyEnum is a simple enumeration.
private TreeMap<String, String> subKeys;

MyKey() {} //for hadoop
public MyKey(MyEnum t, Map<String, String> sK) { type = t; subKeys = new TreeMap(sk); }

public void readFields(DataInput in) throws IOException {
Text typeT = new Text();
typeT.readFields(in);
this.type = MyEnum.valueOf(typeT.toString());

subKeys.clear();
int i = WritableUtils.readVInt(in);
while ( 0 != i-- ) {
Text keyText = new Text();
keyText.readFields(in);

Text valueText = new Text();
valueText.readFields(in);

subKeys.put(keyText.toString(), valueText.toString());
}
}

public void write(DataOutput out) throws IOException {
new Text(type.name()).write(out);

WritableUtils.writeVInt(out, subKeys.size());
for (Entry<String, String> each: subKeys.entrySet()) {
new Text(each.getKey()).write(out);
new Text(each.getValue()).write(out);
}
}

public int compareTo(MyKey o) {
if (o == null) {
return 1;
}

int typeComparison = this.type.compareTo(o.type);
if (typeComparison == 0) {
if (this.subKeys.equals(o.subKeys)) {
return 0;
}
int x = this.subKeys.hashCode() - o.subKeys.hashCode();
return (x != 0 ? x : -1);
}
return typeComparison;
}
}

这个key的实现有什么问题吗?以下是我在 reduce 调用中面临键混淆的代码:

reduce(MyKey k, Iterable<MyValue> values, Context context) {
Iterator<MyValue> iterator = values.iterator();
int sum = 0;
while(iterator.hasNext()) {
MyValue value = iterator.next();
//when i come here in the 2nd iteration, if i print k, it is different from what it was in iteration 1.
sum += value.getResult();
}
//write sum to context
}

如有任何帮助,我们将不胜感激。

最佳答案

这是预期的行为(至少对于新的 API)。

当调用值 Iterable 的底层迭代器的 next 方法时,下一个键/值对从排序的映射器/组合器输出中读取,并检查键是否仍然是与上一个键相同的组。

因为 hadoop 重新使用传递给 reduce 方法的对象(只是调用同一对象的 readFields 方法),Key 参数 'k' 的基础内容将随着 values 的每次迭代而改变> 可迭代。

关于Hadoop 似乎在对给定 reduce 调用的值进行迭代期间修改了我的关键对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6092404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com