我必须使用Map Reduce实现Graph算法。为此,我必须连结工作
MAP1 -> REDUCE1 -> MAP2 -> REDUCE2 -> ...
我将从MAP1中的文件中读取相邻矩阵,并创建一个用户定义的java类Node
,它将包含数据和子信息。我想将此信息传递给MAP2
但是,在我写的REDUCE1中
context.write(node,NullWritable.get());
节点数据使用Node类的toString()
作为文本格式保存在文件中
当MAP2尝试读取此节点信息时,
public void map(LongWritable key,Node node,Context context)抛出IOException,InterruptedException
它说它无法将文件中的文本转换为Node 我不确定在Map reduce中这种类型的作业链接的正确方法是什么。
REDUCE1以这种格式写入节点:
节点[nodeId = 1,adjacentNodes = [Node [nodeId = 2,adjacentNodes = []],Node [nodeId = 2,adjacentNodes = []]]]
实际例外:
java.lang.Exception:java.lang.ClassCastException: org.apache.hadoop.io.Text无法强制转换为custom.node.nauty.Node
答案 0 :(得分:1)
根据评论,使您的代码有效的建议更改如下:
您应该在reducer1中的mapper2和SequenceFileOutputFormat中使用SequenceFileInputFormat,而不是分别使用TextInputFormat和TextOutputFormat。 TextInputFormat读取LongWritable键和Text值,这就是您收到此错误的原因。
因此,您还应该更改mapper 2的声明,以接受Node键和NullWritable值。
确保Node类扩展Writable类(如果将其用作键,则为WritableComparable)。然后,将第一个作业的outputKeyClass设置为Node.class,而不是TextWritable.class。