我必须使用map reduce实现一个图算法。为此,我必须连锁经营。 MAP1 -> REDUCE1 -> MAP2 -> REDUCE2 -> ...
我将从map1中的文件中读取相邻的矩阵,并创建一个用户定义的java类 Node
它将包含数据和子信息。我想把这个信息传给Map2。
但是,在我写作的时候
context.write(节点,nullwriteable.get());
节点数据使用 toString()
节点类的。
当map2试图读取这个节点信息时,
public void map(longwritable key,node node,context context)抛出ioexception,interruptedeexception
它表示无法将文件中的文本转换为节点。
我不确定在MapReduce中,对于这种类型的作业链接,什么是正确的方法。
reduce1按以下格式写入节点:
节点[nodeid=1,adjacentnodes=[node[nodeid=2,adjacentnodes=[]],节点[nodeid=2,adjacentnodes=[]]]
实际异常:
java.lang.exception:java.lang.classcastexception:org.apache.hadoop.io.text不能强制转换为custom.node.nauty.node
1条答案
按热度按时间gmol16391#
根据注解,建议对代码进行以下更改:
您应该在mapper2中使用sequencefileinputformat,在reducer1中使用sequencefileoutputformat,而不是分别使用textinputformat和textoutputformat。textinputformat读取一个长可写键和一个文本值,这就是为什么会出现此错误。
因此,您还应该更改mapper two的声明,以接受节点键和可空写的值。
确保node类扩展了writable类(或者writable类,如果将其用作键的话)。然后,将第一个作业的outputkeyclass设置为node.class,而不是textwritable.class。