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

时间:2017-01-02 18:08:52

标签: hadoop mapreduce hadoop-streaming chaining

我必须使用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 个答案:

答案 0 :(得分:1)

根据评论,使您的代码有效的建议更改如下:

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

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

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