MapReduce на данных графа - редуктор, возвращающий неверные дополнительные данные - PullRequest
1 голос
/ 23 октября 2019

Я пытаюсь запустить Hadoop Map Reduce в наборе данных веб-графика Stanford snap. График представлен в виде текстового файла с начальным и конечным узлами, например, так (первые несколько строк) -

0   11342
0   824020
0   867923
0   891835
11342   0
11342   27469
11342   38716
11342   309564
11342   322178
11342   387543
824020  0
824020  91807

Цель состоит в том, чтобы создать список смежности для каждого узла и вычислить длину каждогоотрегулированныйlist.

Преобразователь генерирует пары начального и конечного узлов -

public static class AdjMapper
       extends Mapper<Object, Text, Text, Text>{
      private Text outVal = new Text();
      private Text outKey = new Text();

      public void map(Object key, Text value, Context context) throws IOException, InterruptedException 
      {
        String inline = value.toString();
        if (!inline.startsWith("#")) {
            String[] inVals = inline.split("\t");
            outKey.set(inVals[0]);
            outVal.set(inVals[1]);
            context.write(outKey, outVal);
        }
      }
  }

Редуктор создает список смежности для каждого узла путем построения строки (Text), которая содержит каждый соседний узел. узел (входящий из Iterable<Text> values), разделенный запятыми, и создает счетчик списка в цикле.

  public static class AdjReducer
      extends Reducer<Text,Text,Text, Text> {
    private Text result = new Text();

    public void reduce(Text key, Iterable<Text> values,
                       Context context
                       ) throws IOException, InterruptedException {
      int cntr = 0;
      String adjlst = "";
      for (Text val : values) {
          adjlst = adjlst+","+val;
          // adjlst.append(",").append(val.toString());
          cntr++;
      }
      // to discard the starting comma
      adjlst = adjlst.substring(1);
      adjlst = adjlst+"#"+cntr;

      result.set(adjlst);
      context.write(key, result);
    }
  }

Предполагается, что эта строка добавляет длину каждого списка смежности, в конце каждой строки в результате - adjlst = adjlst+"#"+cntr;

Однако в результате, даже еслиправильная длина создается и добавляется в список, в конце каждого списка смежности узлов добавляется дополнительная #1, например, так:

0   11342,824020,867923,891835#4#1
1   203402,53051,893884,862566,748615,635575,569212,552600,276233,223236#10#1
10  556796,826668,49988,85506,129774,134964,181848,194746,310676,332640,393685#11#1
1000    890302,902208#2#1

Я добавил несколько операторов печати и смог получитьжурналы с yarn logs, а вот фрагмент из журналов -

=====
Counter: 4
Adj List: 579169,724176,185821,463266#4
=====
=====
Counter: 3
Adj List: 384668,278120,666332#3
=====

Итак, список строится правильно, и длина также добавляется в конце. Но почему / как добавляется #1 в конце?

...