2014-05-18 24 views
3

我正在嘗試運行包含在Giraph中的SimpleInDegreeCountComputation示例。我的方法如下:無法運行giraph SimpleInDegreeCountComputation

SimpleInDegreeCountComputation.java:

public class SimpleInDegreeCountComputation extends BasicComputation 
       <LongWritable, LongWritable, DoubleWritable, DoubleWritable> { 
    ....... 

我再試試,像這樣運行它:

hadoop jar /path-to-giraph-folder/giraph-examples/target/giraph-examples-1.1.0- 
    SNAPSHOT-for-hadoop-1.2.1-jar-with-dependencies.jar 
    org.apache.giraph.GiraphRunner 
    org.apache.giraph.examples.SimpleInDegreeCountComputation 
    -vif org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormat 
    -vip /path-to-input-file 
    -vof org.apache.giraph.io.formats.IdWithValueTextOutputFormat 
    -op /path-to-output-file -w 1 

結果如下:

14/05/18 18:58:40 INFO utils.ConfigurationUtils: No edge input format specified. 
    Ensure your InputFormat does not require one. 
    14/05/18 18:58:40 INFO utils.ConfigurationUtils: No edge output format specified. 
    Ensure your OutputFormat does not require one. 
    Exception in thread "main" java.lang.IllegalArgumentException: checkClassTypes: vertex 
    value types not assignable, computation - class org.apache.hadoop.io.LongWritable, 
    VertexInputFormat - class org.apache.hadoop.io.DoubleWritable 
at org.apache.giraph.job.GiraphConfigurationValidator.checkAssignable(GiraphConfigurationValidator.java:381) 
at org.apache.giraph.job.GiraphConfigurationValidator.verifyVertexInputFormatGenericTypes(GiraphConfigurationValidator.java:228) 
at org.apache.giraph.job.GiraphConfigurationValidator.validateConfiguration(GiraphConfigurationValidator.java:141) 
at org.apache.giraph.utils.ConfigurationUtils.parseArgs(ConfigurationUtils.java:214) 
at org.apache.giraph.GiraphRunner.run(GiraphRunner.java:74) 
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
at org.apache.giraph.GiraphRunner.main(GiraphRunner.java:124) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.apache.hadoop.util.RunJar.main(RunJar.java:156) 

我我不太確定我做錯了什麼。如果任何人都可以指引我正確的方向,或鏈接到一個資源,解釋我想要做的更簡單的方法,我將不勝感激!我認爲這個問題可能是錯誤的格式(-vif)。 我使用的輸入文件如下:

[0,0,[[1,5],[2,9]]] 
    [1,0,[[0,5],[3,3]]] 
    [2,0,[[0,9],[3,3],[4,3]]] 
    [3,0,[[1,3],[2,3],[4,2]]] 
    [4,0,[[2,3],[3,3]]] 

回答

6

縱觀計算和頂點輸入類的定義,似乎JsonLongDoubleFloatDoubleVertexInputFormat不符合SimpleInDegreeCountComputation

SimpleInDegreeCountComputation兼容:

public class SimpleInDegreeCountComputation extends BasicComputation< 
    LongWritable, LongWritable, DoubleWritable, DoubleWritable> { 

BasicComputation

/** 
* Computation in which both incoming and outgoing message types are the same. 
* 
* @param <I> Vertex id 
* @param <V> Vertex data 
* @param <E> Edge data 
* @param <M> Message type 
*/ 
public abstract class BasicComputation<I extends WritableComparable, 
    V extends Writable, E extends Writable, M extends Writable> 
    extends AbstractComputation<I, V, E, M, M> { 
} 

你可以看到:

  • 頂點ID的類型爲LongWritable
  • 頂點數據類型LongWritable
  • 邊緣數據類型DoubleWritable

的......另請輸入您正在使用的InputFormat ...

JsonLongDoubleFloatDoubleVertexInputFormat

public class JsonLongDoubleFloatDoubleVertexInputFormat extends 
    TextVertexInputFormat<LongWritable, DoubleWritable, FloatWritable> { 

TextVertexInputFormat

/** 
* Abstract class that users should subclass to use their own text based 
* vertex input format. 
* 
* @param <I> Vertex index value 
* @param <V> Vertex value 
* @param <E> Edge value 
*/ 
@SuppressWarnings("rawtypes") 
public abstract class TextVertexInputFormat<I extends WritableComparable, 
    V extends Writable, E extends Writable> 
    extends VertexInputFormat<I, V, E> { 

你可以看到:

  • 頂點ID的類型爲LongWritable
  • 頂點數據類型DoubleWritable
  • 邊緣數據類型的FloatWritable

由於它是LongWritableDoubleWritableFloatWritable,而不是LongDoubleFloat - 那些類型不能自動轉換。

我找不到任何可用的InputFormat,因此您需要修改現有的JsonLongDoubleFloatDoubleVertexInputFormat或修改算法以使用NullWritable作爲Edge數據類型。我沒有看到任何邊緣數據被使用,所以它也可以爲空。在這種情況下,您可以使用LongLongNullTextInputFormat

+0

嗨zahorak!謝謝你的答案。我試圖這樣做,但現在的問題是創建一個包含修改文件的新jar。我不知道該怎麼做。我打開giraph-例子-1.1.0- 快照換的Hadoop-1.2.1-JAR-與-dependencies.jar爲了一睹它是怎麼回事。但我不是仍然能夠沒有建立一個正確的jar文件,因爲我沒有包含在giraph-例子-1.1.0-所必需的所有文件( 快照換的Hadoop-1.2.1-JAR- with-dependencies.jar)。有什麼建議麼? – user3489477

+0

我在giraph中編寫的所有代碼,我只是在giraph-examples內部完成的。只需從github https://github.com/apache/giraph退出並編輯它,然後運行'mvn clean install -DskipTests',你應該得到所有你需要的罐子。 https://github.com/pgrm/giraph是我對giraph-examples的更改的存儲庫,能夠運行我的代碼。 – peter

+0

謝謝zahorak。所以要根據您的建議我的解決辦法是: 1)獲得從GitHub 2的代碼)修改文件SimpleInDegreeCountComputation 3)創建MVN的罐子裝 現在工程:)) – user3489477