2013-06-28 4 views
2

Apache Giraph를 사용하여 분산 클러스터링 알고리즘을 작성 중입니다. compute() 메서드에서 각 이웃 라우터가 보낸 값과 현재 버텍스와 그 메시지를 보낸 이웃 사이의 가장자리의 가중치에 액세스해야합니다. 그러나 Giraph 예제에서 볼 수있는 유일한 메시지 유형은 발신자 정보가 아닌 값만 전달할 수있는 단일 유형 메시지 (DoubleWritable, IntWritable 등)입니다.Apache Giraph SendMessage

발신자 정보 또는 가장자리 정보도?

예를 들어, 위의 코드에서 각 메시지의 값을 얻을 수 있지만 현재 노드에이 값을 보낸 노드를 알 수 없습니다.

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()); 
    } 
    ... 
} 

감사합니다, 나는 토마스 Jungblut에 동의

+0

더 많은 관심을 끌 수있는 코드 예입니다. –

+0

감사합니다 Andres, 그랬어요. – user2533067

+0

당신의 필요에 따라 독자적으로'Writable' 구현체를 작성할 수 있습니다. Hadoop과 관련이 없다면 Hadoop 태그를 사용하지 마십시오. –

답변

4

; 자신의 Writable을 쓰는 것이 아마도 가장 쉬운 (그리고 가장 쉬운) 솔루션 일 것입니다.

나는 최근에 두 개의 정수를 저장하는 IntPairWritable이라는 사용자 정의 Writable을 작성했습니다. 여기 내 코드가있다.

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 : 기본 생성자는 항상 하둡이 클래스의 인스턴스를 생성 할 수 있도록하기 위해 존재해야합니다.
  • 참고 2 : Giraph는 모든 것이 configurable 일 때 좋아해서이 인터페이스를 구현하는 것이 좋습니다.

안부 언급 darefilz, 자신의 쓰기 가능한 클래스를 작성하는 것이 최선의 선택이 될 것으로