2015-05-13 2 views
0

У меня есть большой набор данных в Hadoop с данными для разных клиентов.Создание большого количества небольших файлов XML в Hadoop

Каждый заказчик может иметь много элементов заказа в этом наборе данных, где многие могут варьироваться от нескольких сотен до миллионов в день.

В наборе данных около 50 000 клиентов.

Что мне нужно сделать, это создать ежедневный XML-отчет для каждого клиента, где данные для каждого клиента находятся в собственном файле. Это означает, что некоторые файлы будут крошечными, но другие будут довольно большими (представление XML довольно многословно и содержит много полей).

Написание карты Уменьшение кода для создания XML является тривиальным, и первым моим подходом к этой проблеме было использование нескольких выходов Hadoop для записи файла на одного клиента в редукторе. Хотя это работает, все эти небольшие файлы будут оказывать значительное давление на Namenode. Кроме того, мне нужно экспортировать все эти файлы из кластера Hadoop и поместить их в стандартную файловую систему, где веб-приложение будет обслуживать их, поэтому экспорт таких файлов может также вызвать проблемы.

Еще одна идея, с которой я столкнулся, заключалась в создании отдельного файла последовательности с ключом, равным клиенту, и значением, содержащим XML для одной транзакции, предварительно отсортированной в том порядке, который будет составлять отчет XML. Затем я могу экспортировать один файл последовательности и закодировать простую автономную программу Java для чтения файлов последовательности и выписать файл для каждого клиента. Я проверил это на небольшом наборе данных, и, надеюсь, производительность будет в порядке.

Неужели кто-то еще сталкивается с такой проблемой, как Hadoop, и есть какие-либо другие идеи о том, как решить эту проблему?

Подходит ли подход к файлу последовательности как разумный способ?

ответ

1

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

Вы можете составить MapFile из своей работы, где ключ может быть идентификатором клиента, а значение может быть содержимым xml, за кулисами MapFile создает индексный файл, который будет поддерживать смещение ключей идентификатора клиента.

Таким образом, все файлы вашего клиента xml будут скомпонованы в Mapfile, который устраняет проблему с небольшим файлом, так что ваш namenode может легко дышать :).

После этого вы можете экспортировать Mapfile в любое приложение, вам не понадобится писать содержимое MapFile на диск, в котором вы можете очень хорошо использовать MapFile для извлечения содержимого xml-клиента из поискового запроса идентификатор клиента и MapFile будут поддерживать быстрый поиск с помощью индексного файла. Пожалуйста, обратитесь,

http://www.codeproject.com/Articles/887028/Implementing-Joins-in-Hadoop-Map-Reduce-using-MapF

BloomMapFile вариант утверждает файле проекта обеспечить более быстрый просмотр для ключа, который может помочь вам лучше. Надеюсь это поможет .

+0

Спасибо за информацию. MapFiles звучат потенциально очень полезными - мне придется поэкспериментировать с ними и посмотреть, как я могу использовать их для своей проблемы. –

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