gpt4 book ai didi

map - 当发出配置中定义的类的子类作为输出时,Hadoop Map 输出 IOException

转载 作者:可可西里 更新时间:2023-11-01 15:03:30 27 4
gpt4 key购买 nike

我有 3 个简单的类:

public abstract class Container implements WritableComparable<Container> {} //empty
public class WeightedEdge extends Container { ... }
public class NodeWeightContainer extends Container { ... }

Map阶段是这样配置的

JobConf createGraphPConf = new JobConf(new Configuration());
Job job = new Job(createGraphPConf);
...
createGraphPConf.setMapOutputValueClass(Container.class);

但是我收到了这个错误:

java.io.IOException: Type mismatch in value from map: expected org.hadoop.test.data.util.Container, recieved org.hadoop.test.data.WeightedEdge
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1018)
at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:591)
at org.hadoop.test.map.CreateGPMap.map(CreateGPMap.java:33)
at org.hadoop.test.map.CreateGPMap.map(CreateGPMap.java:19)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:435)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:371)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:210)

为什么我不能返回配置中定义的类的子类?有办法解决吗?问题是我的 Map 阶段必须发出两种不同的对象类型。

最佳答案

您不能返回在配置中定义的类的子类,因为 Hadoop 明确检查 setMapOutputValueClass 中指定的类类型及其从映射器接收的类型。

它这样做是因为它需要序列化/反序列化您从映射器发出的对象。当它执行反序列化时,它会创建在 setMapOutputValueClass 调用中指定类型的新对象,然后使用 WriteableComparable 接口(interface)的方法用数据填充新创建的对象。

为了能够发出不同的对象类型,您可以定义容器非抽象类并将实际对象及其类型标识符放入其中


public enum ELEM_TYPE { WE, WECONTAINER }

public class Container implements WritableComparable<Container>
{
ELEM_TYPE type; //actual element type -
// WeightedEdge or NodeWeightContainer
object value;

//WritableComparable implementation
// that casts value to the appropriate type
}
public class WeightedEdge { ... }
public class NodeWeightContainer { ... }

关于map - 当发出配置中定义的类的子类作为输出时,Hadoop Map 输出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8553461/

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