使用用户定义的类链接作业



我必须使用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.

最新更新