Как разобрать CustomWritable из текста в Hadoop

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

#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 of 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 и write-методы (реализации интерфейса 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 ответ

Решение

Выходной формат для вашей первой работы 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

Другие вопросы по тегам