我必须使用Map Reduce实现Graph算法。为此,我不得不把工作连锁起来MAP1 -> REDUCE1 -> MAP2 -> REDUCE2 -> ...
我将从MAP1中的文件中读取相邻矩阵,并创建一个用户定义的java类Node
,该类将包含数据和子信息。我想把这个信息传递给MAP2。
但是,在REDUCE1中,当我写时
context.write(node,NullWritable.get());
节点数据使用node类的toString()
以文本格式保存在文件中
当MAP2试图读取此节点信息时,
公共void映射(LongWritable键、节点、上下文上下文)抛出IOException、InterruptedException
它表示无法将文件中的文本转换为Node
我不确定什么是Map reduce中这种类型的作业链接的正确方法。
REDUCE1以以下格式写入节点:
节点[nodeId=1,adjacentNodes=[Node[nodeId=2,adjacettNodes=[]],节点[nodeId=2,adjancentNodes=[]]]
实际异常:
java.lang.Exception:java.lang.ClassCastException:org.apache.hadoop.io.Text无法转换为custom.node.nauty.node
根据注释,建议对代码进行以下更改:
您应该在mapper 2中使用SequenceFileInputFormat,在reducer 1中使用SequenceFileOutputFormat,而不是分别使用TextInputFormat和TextOutputFormat。TextInputFormat读取一个LongWritable键和一个Text值,这就是出现此错误的原因。
因此,您还应该更改映射器二的声明,以接受Node键和NullWritable值。
请确保Node类扩展了Writable类(或者如果将其用作键,则扩展WritableComparable)。然后,将第一个作业的outputKeyClass设置为Node.class,而不是TextWritable.class.