使用用户定义的链接作业​​ class

Chaining jobs using user defined class

我必须使用 Map Reduce 实现图形算法。为此,我必须链接作业。
MAP1 -> REDUCE1 -> MAP2 -> REDUCE2 -> ...
我将从 MAP1 中的文件中读取相邻矩阵,并创建一个用户定义的 java class Node,它将包含数据和子信息。我想将此信息传递给 MAP2。
但是,在 REDUCE1 中,当我写

context.write(node, NullWritable.get());

节点数据使用节点 class 的 toString() 以文本格式保存在文件中。
当 MAP2 尝试读取此节点信息时,

public void map(LongWritable key, Node node, Context context) throws IOException, InterruptedException

它说它无法将文件中的文本转换为 Node。
我不确定在 Map reduce 中这种类型的作业链接的正确方法是什么。

REDUCE1 以这种格式写入节点:

Node [nodeId=1, adjacentNodes=[Node [nodeId=2, adjacentNodes=[]], Node [nodeId=2, adjacentNodes=[]]]]

实际异常:

java.lang.Exception: java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to custom.node.nauty.Node

根据评论,建议的更改如下:

您应该在 mapper2 中使用 SequenceFileInputFormat,在 reducer1 中使用 SequenceFileOutputFormat,而不是分别使用 TextInputFormat 和 TextOutputFormat。 TextInputFormat 读取一个 LongWritable 键和一个 Text 值,这就是您收到此错误的原因。

因此,您还应该更改映射器二的声明,以接受一个 Node 键和一个 NullWritable 值。

确保节点 class 扩展了 Writable class(或者 WritableComparable,如果您将其用作键)。然后,将第一个作业的outputKeyClass设置为Node.class,而不是TextWritable.class.