Огромные файлы в hadoop: как хранить метаданные? - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть сценарий использования для загрузки нескольких терабайт текстовых файлов в виде файлов последовательностей в HDFS.

Эти текстовые файлы имеют несколько макетов в диапазоне от 32 до 62 столбцов (метаданные).

Какой хороший способ загрузить эти файлы вместе с их метаданными:

  1. создать ключ, класс значений для макета текстового файла и использовать его для создания и загрузки в виде файлов последовательности?

  2. создать заголовок SequenceFile.Metadata в каждом файле, отдельно загружаемом в виде файла последовательности?

Любые отзывы приветствуются!

Спасибо

Ответы [ 3 ]

1 голос
/ 20 июля 2011

Я предпочитаю хранить метаданные вместе с данными, а затем проектировать ваше приложение на основе метаданных, а не встраивать метаданные в проект или реализацию вашего приложения, что означает, что обновления метаданных требуют обновления вашего приложения.Конечно, существуют пределы того, насколько далеко вы можете взять приложение, управляемое метаданными.

Вы можете встраивать метаданные с данными, например, используя схему кодирования, такую ​​как JSON, или вы можете располагать метаданные рядом с данными.например, наличие записей в SeqFile специально для описания метаданных, возможно, с использованием зарезервированных тегов для ключей, чтобы дать метаданным свое собственное пространство имен, отдельное от пространства имен, используемого ключами для фактических данных.

Что касается рекомендациио том, следует ли это упаковывать в отдельные файлы Hadoop, помня о том, что Hadoop можно поручить разделить файл на разделение (вход для фазы карты) с помощью параметров конфигурации.Таким образом, даже один большой SeqFile может обрабатываться параллельно несколькими задачами карты.Преимущество наличия одного файла hdfs состоит в том, что он больше напоминает единицу содержания ваших исходных данных.

Что касается рекомендации о типах ключей (т. Е. Использовать ли текст или двоичный файл), учтите, чтоКлюч будет сравниваться с другими значениями.Чем компактнее ключ, тем быстрее сравнение.Таким образом, если вы можете хранить плотную версию ключа, это было бы предпочтительным.Аналогично, если вы можете структурировать раскладку клавиш так, чтобы первые байты, как правило, НЕ были одинаковыми, это также будет способствовать повышению производительности.Так, например, сериализация Java-класса в качестве ключа не рекомендуется, потому что текстовый поток начинается с имени пакета вашего класса, которое, вероятно, будет таким же, как и у любого другого класса, и, следовательно, является ключом в файле.

0 голосов
/ 29 апреля 2016

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

0 голосов
/ 18 февраля 2011

Самое простое, что нужно сделать, - создать ключи и значения текста SequenceFiles. Выберите значимое поле из ваших данных, чтобы сделать ключ, сами данные являются значением в виде текста. SequenceFiles предназначены для хранения пар ключ / значение. Если это не то, чем являются ваши данные, не используйте SequenceFile. Вы можете просто загрузить необработанные текстовые файлы и ввести их в Hadoop.

Для лучшей производительности не делайте размер каждого файла терабайтом. Этап Map Hadoop запускает одно задание для каждого входного файла. Вы хотите, чтобы в вашем кластере Hadoop было больше файлов, чем у ядер ЦП. В противном случае у вас будет один ЦП, выполняющий 1 ТБ работы, и много незанятых ЦП. Хороший размер файла, вероятно, составляет 64-128 МБ, но для достижения наилучших результатов вы должны измерить это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...