首页 文章

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

提问于
浏览
1

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

1 回答

  • 1

    根据评论,建议的更改将使您的代码工作如下:

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

    因此,您还应该更改mapper的声明二,以接受Node键和NullWritable值 .

    确保Node类扩展Writable类(如果将其用作键,则为WritableComparable) . 然后,将第一个作业的outputKeyClass设置为Node.class,而不是TextWritable.class .

相关问题