Я пытаюсь запустить 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
в конце?