Как разобрать CustomWritable из текста в Hadoop - PullRequest
5 голосов
/ 15 марта 2012

Скажем, у меня есть метки времени для конкретных пользователей в текстовых файлах, например

#userid; unix-timestamp; value
1; 2010-01-01 00:00:00; 10
2; 2010-01-01 00:00:00; 20
1; 2010-01-01 01:00:00; 11
2; 2010-01-01 01:00:00, 21
1; 2010-01-02 00:00:00; 12
2; 2010-01-02 00:00:00; 22

У меня есть собственный класс "SessionSummary", реализующий readFields и запись из WritableComparable . Его целью является суммирование всех значений на пользователя за каждый календарный день.

Таким образом, преобразователь отображает строки для каждого пользователя, редуктор суммирует все значения за день для каждого пользователя и выводит SessionSummary как TextOutputFormat (используя toString из SessionSummary , как разделенные табуляцией Строки UTF-8):

1; 2010-01-01; 21
2; 2010-01-01; 41
1; 2010-01-02; 12
2; 2010-01-02; 22

Если мне нужно использовать эти сводные записи для второго этапа Map / Reduce, как я должен анализировать эти сводные данные, чтобы заполнить участников? Можно ли повторно использовать существующие readFields и методы записи (реализации интерфейса WritableComparable ), используя текст String как DataInput каким-либо образом? Это (очевидно) не сработало:

public void map(...) {
    SessionSummary ssw = new SessionSummary();
    ssw.readFields(new DataInputStream(new ByteArrayInputStream(value.getBytes("UTF-8"))));
}

В целом: существует ли лучшая практика для реализации пользовательских ключей и значений в Hadoop и облегчения их многократного использования на нескольких этапах M / R, при этом на каждом этапе сохраняется читаемый человеком текстовый вывод?

(версия Hadoop 0.20.2 / CDH3u3)

1 Ответ

8 голосов
/ 20 марта 2012

Выходной формат для вашего первого задания MR должен быть SequenceFileOutputFormat - он будет хранить выходные данные Key / Values ​​от редуктора в двоичном формате, который затем может быть считан обратно, во втором вашем задании MR с использованием SequenceFileInputFormat,Также убедитесь, что вы установили outputKeyClass и outputValueClass на Job соответственно.

Тогда в отображении во втором задании будет SessionSummary (и независимо от типа значения)

Если вам нужно увидеть текстовый вывод из первого задания MR, вы можете запустить следующие файлы вывода в HDFS:

hadoop fs -libjars my-lib.jar -text output-dir/part-r-*

Это будет читать в файле последовательности пары ключ / значение и вызывать toString() на обоих объектах, табуляция разделяет их при выводе на стандартный вывод.-libjars указывает, где hadoop может найти ваши пользовательские классы Key / Value

...