2017-01-02 53 views
1

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

context.write的降低1(节点,NullWritable.get());

节点数据使用Node类的toString()以文本格式保存在文件中。
当MAP2试图读取该节点的信息,

公共无效地图(LongWritable键,节点的节点,上下文语境)抛出IOException异常,InterruptedException的

它说,它不能转换文本该文件到节点。
我不确定在Map reduce中这种类型的链接作业​​的正确方法是什么。

的降低1以这种格式写入节点:

节点[NODEID = 1,adjacentNodes = [节点[NODEID = 2,adjacentNodes = []],节点[NODEID = 2,adjacentNodes = [] ]]]

实际的异常:

java.lang.Exception的:java.lang.ClassCastException: org.apache.hadoop.io.Text不能转换为custom.node.nauty。节点

+0

您必须定义自己的类(Node),它扩展了WritableComparable(Comparable,因为它是关键)。然后,将outputKeyClass设置为Node.class,而不是TextWritable.class – vefthym

+0

我已经完成了。从Map发送数据到Reduce时,您的方法是适当的。但是,看起来Reduce只能写入文件。虽然链接第二张地图只从第一张缩略图写入的文件中读取。第一个reduce不能将节点(序列化)写入文件。 – Dip

+0

你如何声明reducer类和reduce方法?为什么在reducer1中使用该节点作为关键字并将其作为map2中的值?你应该使用mapper2中的sequencefileinputformat和reducer1中的sequencefileoutputformat,而不是textinputformat和textoutputformat。 – vefthym

回答

1

基础上的意见,建议的更改,这将使你的代码工作如下:

你应该mapper2和SequenceFileOutputFormat在reducer1分别使用SequenceFileInputFormat,而不是的TextInputFormat和TextOutputFormat。 TextInputFormat读取一个LongWritable键和一个Text值,这就是为什么你会得到这个错误。

因此,您还应该更改映射器2的声明,以接受节点键和NullWritable值。

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

+0

谢谢!我正在做你说的确切的事情,但是,在驱动程序文件中有一个错误。 – Dip

相关问题