使用用户定义的类链接作业
我必须使用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。节点
基础上的意见,建议的更改,这将使你的代码工作如下:
你应该mapper2和SequenceFileOutputFormat在reducer1分别使用SequenceFileInputFormat,而不是的TextInputFormat和TextOutputFormat。 TextInputFormat读取一个LongWritable键和一个Text值,这就是为什么你会得到这个错误。
因此,您还应该更改映射器2的声明,以接受节点键和NullWritable值。
请确保Node类扩展了Writable类(或者如果将它用作键的话,则为WritableComparable)。然后,将第一个作业的outputKeyClass设置为Node.class,而不是TextWritable.class。
谢谢!我正在做你说的确切的事情,但是,在驱动程序文件中有一个错误。 – Dip
您必须定义自己的类(Node),它扩展了WritableComparable(Comparable,因为它是关键)。然后,将outputKeyClass设置为Node.class,而不是TextWritable.class – vefthym
我已经完成了。从Map发送数据到Reduce时,您的方法是适当的。但是,看起来Reduce只能写入文件。虽然链接第二张地图只从第一张缩略图写入的文件中读取。第一个reduce不能将节点(序列化)写入文件。 – Dip
你如何声明reducer类和reduce方法?为什么在reducer1中使用该节点作为关键字并将其作为map2中的值?你应该使用mapper2中的sequencefileinputformat和reducer1中的sequencefileoutputformat,而不是textinputformat和textoutputformat。 – vefthym