Giraph best的顶点输入格式,用于具有String类型ID的输入文件

时间:2015-07-29 22:59:15

标签: hadoop giraph

我的PC中有一个多节点giraph群集正常工作。我从Giraph执行了SimpleShortestPathExample并且执行得很好。

此算法是使用此文件(tiny_graph.txt)运行的:

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

此文件具有以下输入格式:

[source_id,source_value,[[dest_id, edge_value],...]]

现在,我正在尝试在同一个集群中执行相同的算法,但输入文件与原始文件不同。我自己的文件是这样的:

[Portada,0,[[Sugerencias para la cita del día,1]]]
[Proverbios españoles,0,[]]
[Neil Armstrong,0,[[Luna,1][ideal,1][verdad,1][Categoria:Ingenieros,2,[Categoria:Estadounidenses,2][Categoria:Astronautas,2]]]
[Categoria:Ingenieros,1,[[Neil Armstrong,2]]]
[Categoria:Estadounidenses,1,[[Neil Armstrong,2]]]
[Categoria:Astronautas,1,[[Neil Armstrong,2]]]

它与原始非常相似,但id是String,顶点和边值是Long。我的问题是我应该使用哪个TextInputFormat,因为我已经尝试使用org.apache.giraph.io.formats.JsonLongDoubleFloatDoubleVertexInputFormatorg.apache.giraph.io.formats.TextDoubleDoubleAdjacencyListVertexInputFormat而我无法使用它。

解决了这个问题后,我可以调整原始的最短路径示例算法并让它适用于我的文件,但是直到我得到一个解决方案,我无法达到这一点。

如果这种格式不是一个好的决定,我可能会调整它,但我不知道哪个是我最好的选择,我从giraph中的文本输入和输出格式的知识非常糟糕,这就是为什么i0me在这里要求建议。

2 个答案:

答案 0 :(得分:3)

最好编写自己的inputformat。我建议使用字符串的哈希码。我编写了一个示例代码,每行包含: [vertex_id(整数,例如字符串的哈希码),vertex_val(long),[[neighbor_id(整数),neighbor_val(long)],....]

public class JsonIntLongIntLongVertexInputFormat extends
  TextVertexInputFormat<IntWritable, LongWritable, LongWritable> {

  @Override
  public TextVertexReader createVertexReader(InputSplit split,
      TaskAttemptContext context) {
    return new JsonIntLongIntLongVertexReader();
  }


  class JsonIntLongIntLongVertexReader extends
    TextVertexReaderFromEachLineProcessedHandlingExceptions<JSONArray,
    JSONException> {

    @Override
    protected JSONArray preprocessLine(Text line) throws JSONException     {
      return new JSONArray(line.toString());
    }

    @Override
    protected IntWritable getId(JSONArray jsonVertex) throws JSONException,
              IOException {
      return new IntWritable(jsonVertex.getString(0).hashCode());
    }

    @Override
    protected LongWritable getValue(JSONArray jsonVertex) throws
      JSONException, IOException {
      return new LongWritable(jsonVertex.getLong(1));
    }

    @Override
    protected Iterable<Edge<IntWritable, LongWritable>> getEdges(
        JSONArray jsonVertex) throws JSONException, IOException {
      JSONArray jsonEdgeArray = jsonVertex.getJSONArray(2);
      List<Edge<IntWritable, LongWritable>> edges =
          Lists.newArrayListWithCapacity(jsonEdgeArray.length());
      for (int i = 0; i < jsonEdgeArray.length(); ++i) {
        JSONArray jsonEdge = jsonEdgeArray.getJSONArray(i);
        edges.add(EdgeFactory.create(new IntWritable(jsonEdge.getString(0).hashCode()),
            new LongWritable(jsonEdge.getLong(1))));
      }
      return edges;
    }

    @Override
    protected Vertex<IntWritable, LongWritable, LongWritable>
    handleException(Text line, JSONArray jsonVertex, JSONException e) {
      throw new IllegalArgumentException(
          "Couldn't get vertex from line " + line, e);
    }

  }
}

答案 1 :(得分:1)

我解决了这个问题,使我自己调整文件以适应org.apache.giraph.io.formats.TextDoubleDoubleAdjacencyListVertexInputFormat。我原来的文件应该是这样的:

Portada 0.0     Sugerencias     1.0
Proverbios      0.0
Neil    0.0     Luna    1.0     ideal   1.0     verdad  1.0     Categoria:Ingenieros    2.0     Categoria:Estadounidenses       2.0     Categoria:Astronautas   2.0
Categoria:Ingenieros    1.0     Neil    2.0
Categoria:Estadounidenses       1.0     Neil    2.0
Categoria:Astronautas   1.0     Neil    2.0

数据之间的空格是制表符空格('\ t'),因为此格式将该选项作为预定标记值,用于将原始行分割为多个字符串。

非常感谢@ masoud-sagharichian的帮助!! :d