我正在使用Apache Giraph编写分布式聚类算法。在compute()方法中,我需要访问每个邻居发送的值加上当前顶点和发送该消息的邻居之间的边缘权重。但是,我在Giraph示例中看到的唯一消息类型是单类型消息(DoubleWritable,IntWritable等),它只能传递值而不能传递发送者信息,
我们如何才能访问发件人信息或边缘信息?
例如,在上面的代码中,我们可以获取每条消息的值,但是我们不知道哪个节点将此值发送到当前节点。
public void compute(Iterator<DoubleWritable> msgIterator) {
...
double minDist = isSource() ? 0d : Double.MAX_VALUE;
while (msgIterator.hasNext()) {
// Get who sent this message, how?
minDist = Math.min(minDist, msgIterator.next().get());
}
...
}
谢谢,
答案 0 :(得分:4)
我同意Thomas Jungblut;编写自己的Writable
可能是最好的(也是最简单的)解决方案。
我最近编写了一个名为Writable
的自定义IntPairWritable
,它只包含两个整数。这是我的代码。
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.giraph.utils.IntPair;
import org.apache.hadoop.conf.Configurable;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.Writable;
public class IntPairWritable extends IntPair implements Writable, Configurable {
private Configuration conf;
public IntPairWritable() {
super(0, 0);
}
public IntPairWritable(int fst, int snd) {
super(fst, snd);
}
@Override
public void readFields(DataInput input) throws IOException {
super.setFirst(input.readInt());
super.setSecond(input.readInt());
}
@Override
public void write(DataOutput output) throws IOException {
output.writeInt(super.getFirst());
output.writeInt(super.getSecond());
}
@Override
public Configuration getConf() {
return this.conf;
}
@Override
public void setConf(Configuration conf) {
this.conf = conf;
}
@Override
public String toString() {
return super.getFirst() + "," + super.getSecond();
}
}
您的Writable
课程看起来很相似。也许喜欢
public class RetraceableWritable<I extends Writable, D extends Writable> implements Writable, Configurable {
private I senderId;
private D data;
...
......等等。
configurable
时,Giraph似乎喜欢它,所以实现这个界面是一个好主意。此致
答案 1 :(得分:0)
正如darefilz所说,编写自己的Writable类将是最好的选择。 在giraph示例中提供了一个示例“verifyMessages.java”,其中使用了自定义消息类。