Запись в разные файлы с использованием потоковой передачи hadoop - PullRequest
1 голос
/ 27 сентября 2011

В настоящее время я обрабатываю около 300 ГБ файлов журналов в кластере hadoop из 10 серверов. Мои данные сохраняются в папках с именем YYMMDD, поэтому к каждому дню можно быстро получить доступ.

Моя проблема в том, что я только что узнал сегодня, что метки времени, которые у меня есть в моих файлах журнала, находятся в DST (GMT -0400) вместо UTC, как ожидалось. Короче говоря, это означает, что logs / 20110926 / *. Log.lzo содержит элементы с 2011-09-26 04:00 до 2011-09-27 20:00, и это в значительной степени разрушает любую карту / сокращение, выполненное на этих данных (т.е. генерация статистики).

Есть ли способ сделать работу карты / сокращения, чтобы правильно разделить все файлы журнала? Из того, что я могу сказать, кажется, нет способа использовать потоковую передачу для отправки определенных записей в выходной файл A и остальных записей в выходной файл B.

Вот команда, которую я сейчас использую:

/opt/hadoop/bin/hadoop jar /opt/hadoop/contrib/streaming/hadoop-streaming-0.20.2-cdh3u1.jar \
-D mapred.reduce.tasks=15 -D mapred.output.compress=true \
-D mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec \
-mapper map-ppi.php -reducer reduce-ppi.php \
-inputformat com.hadoop.mapred.DeprecatedLzoTextInputFormat \
-file map-ppi.php -file reduce-ppi.php \
-input "logs/20110922/*.lzo" -output "logs-processed/20110922/"

Я ничего не знаю о Java и / или создании пользовательских классов. Я попробовал код, размещенный на http://blog.aggregateknowledge.com/2011/08/30/custom-inputoutput-formats-in-hadoop-streaming/ (в значительной степени скопировал / вставил то, что там было), но я не мог заставить его работать вообще. Независимо от того, что я пытался, я получал ошибку "-outputformat: class not found".

Большое спасибо за ваше время и помощь :).

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Из того, что я могу сказать, кажется, что нет способа использовать потоковую передачу для отправки определенных записей в выходной файл A и остальных записей в выходной файл B.

Используя пользовательский Partitioner , вы можете указать, какой ключ идет к какому редуктору. По умолчанию используется HashPartitioner . Похоже, единственная другая потоковая поддержка Partitioner - это KeyFieldBasedPartitioner .

Более подробную информацию о KeyFieldBasedPartitioner можно найти в контексте потоковой передачи здесь . Вам не нужно знать Java для настройки KeyFieldBasedPartitioner с потоковой передачей.

Есть ли способ выполнить работу карты / сокращения, чтобы правильно разделить все файлы журнала?

Вы должны быть в состоянии написать работу MR для повторного разделения файлов, но я думаю, что Partitioner должен решить проблему.

0 голосов
/ 29 января 2012

Пользовательский MultipleOutputFormat и Partitioner кажется правильным способом разделения ваших данных по дням.

Как автор этого поста, извините, что у вас было такое тяжелое время. Похоже, что если вы получили ошибку «class not found», возникла проблема с тем, что ваш пользовательский формат вывода не был найден после того, как вы включили его в «-libjars».

...