В настоящее время я обрабатываю около 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".
Большое спасибо за ваше время и помощь :).