2010-12-15 1 views
1

У меня есть ведро s3, содержащее около 300 гб файлов журнала в определенном порядке.Как мне разделить данные в s3 для использования с улей хаоса?

Я хочу разбить эти данные для использования в hadoop-hive с использованием штампа даты-времени, так что строки журнала, связанные с конкретным днем, сгруппированы вместе в одну и ту же папку s3. Например журнальные записи 1 января будут в файлы, соответствующие следующим именование:

s3://bucket1/partitions/created_date=2010-01-01/file1 
s3://bucket1/partitions/created_date=2010-01-01/file2 
s3://bucket1/partitions/created_date=2010-01-01/file3 

и т.д.

Что бы лучший способ для меня, чтобы преобразовать данные? Я лучше всего запускаю один скрипт, который читает в каждом файле за раз и выводит данные в правильное место s3?

Я уверен, что есть хороший способ сделать это с помощью hadoop, может кто-нибудь сказать мне, что это?

Что я пробовал:

Я попытался с помощью Hadoop-потоковой передачи, передавая картограф, который собрал все записи журнала для каждой даты затем написал, непосредственно в S3, не возвращая ничего для редуктора, но казалось, создавали дубликаты. (используя приведенный выше пример, я закончил с 2,5 миллионами записей за 1 января вместо 1,4 миллиона)

Есть ли у кого-нибудь идеи, как лучше всего подойти к этому?

ответ

0

Если Hadoop имеет свободные слоты в трекере задач, он будет запускать несколько копий одной и той же задачи. Если ваш выходной формат неправильно игнорирует результирующие двойные выходные ключи и значения (что, возможно, имеет место для S3, я никогда не использовал его), вы должны отключить спекулятивное выполнение. Если ваша работа только для карт, установите mapred.map.tasks.speculative.execution в значение false. Если у вас есть редуктор, установите mapred.reduce.tasks.speculative.execution в false. Обратитесь к Hadoop: The Definitive Guide для получения дополнительной информации.

0

Почему бы не создать внешнюю таблицу по этим данным, а затем использовать куст для создания новой таблицы?

create table partitioned (some_field string, timestamp string, created_date date) partition(created_date); 
insert overwrite partitioned partition(created_date) as select some_field, timestamp, date(timestamp) from orig_external_table; 

На самом деле, я не посмотрел синтаксис, поэтому вам может понадобиться, чтобы исправить его со ссылкой на https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingdataintoHiveTablesfromqueries.

Смежные вопросы