2

我正在使用 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());
    }
    ...
}

谢谢,

4

2 回答 2

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;
    ...

...等等。


  • 注 1:默认构造函数必须始终存在,以确保 Hadoop 可以创建您的类的实例。
  • 注 2:当一切就绪时,Giraph 似乎喜欢它,configurable所以实现这个接口是个好主意。

问候

于 2013-07-13T22:48:26.737 回答
0

正如darefilz 提到的,编写自己的Writable 类将是最好的选择。在使用定制消息类的 giraph 示例中提供了一个示例“verifyMessages.java”。

这是链接 https://apache.googlesource.com/giraph/+/old-move-to-tlp/src/main/java/org/apache/giraph/examples/VerifyMessage.java

于 2014-07-03T07:16:32.723 回答