2016-12-23 12 views
0

У меня есть огромный набор данных (сжатый с 1,5 ТБ), уже импортированный в HDFS. Данные разделены на 3 коллекции: пользователей, и события. Эти коллекции - это в основном папки, заполненные файлами .bz2, каждый из которых содержит много записей в формате TAB, по одному в строке. Схемы являются следующие:Самый эффективный дизайн для этих таблиц в Hadoop Hive?

пользователи:

  • id: string
  • age: string
  • sex: string

изделия:

  • id: string
  • data: string (JSON format)

события:

  • user_id: string
  • event_id: string
  • time: bigint
  • item_id: string
  • pos: int
  • city: string
  • state: string
  • device: string
  • property: string
  • interaction: int

У меня есть несколько различных запросов, которые я хочу работать на этом наборе данных, большинство из них связаны присоединения события и пользователи или события и предметы на соответствующих *_id полей (которые являются внешними ключами к указанной коллекции).

Я уже импортировал все эти данные в HDFS и создал внешние таблицы. Запросы работают, но чрезвычайно дороги. В частности, при использовании таблицы таблица, сжатые файлы .bz2 суммируются примерно до 1 ТБ. У меня очень мало опыта с Hive, но я читал о разделах, кластерах и индексах. Кажется, что с умным дизайном я могу ускорить свои запросы, особенно для присоединений.

Мой вопрос: что вы предлагаете для эффективного дизайна трех таблиц?Запросы мне нужно часто включать одну следующие операции:

  • Присоединение события и пользователей
  • Присоединение события и элементы
  • Объединение всех трех таблиц
  • Группировка или фильтрация по age, sex, state, city, или property (не одновременно) и агрегирование
  • Сортировка и фильтрация по time и агрегирование

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

Данные являются статическими, то есть они не изменятся в будущем. Для дополнительных ссылок это Yahoo Y10 News Feed dataset.

Bonus: В идеале, если данные хранятся в формате, который позже легко доступен Pig, еще лучше!

+0

Я не думаю, что тег «реляционная база данных» здесь постоянный! – 54l3d

+0

Хорошо, отредактировано. Спасибо за ваш ответ. Я читаю об этом сейчас. –

ответ

2

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

Вот некоторые советы, основанные на моем опыте, они отсортированный Отправной по наиболее важным:

  • Вы должны Buid запрос, которые имеют план выполнения с наименьшим количеством рабочих мест MR. Если ваш запрос генерирует 4 задания MR, это непросто, но очень эффективно заставить ваш запрос генерировать 3 задания MR, для этого вы можете использовать команду explain.
  • Рассмотрите возможность разбиения на разделы таблиц.
  • Хорошим выбором для формата хранения для запроса является ORC с сжатием SNAPPY.
  • Использование улья join optimization
  • Рассмотрите возможность использования Impala для запросов и Hive для ETL.

Существует хорошая идея, что я не попытался его, ее, чтобы сделать ваши таблицы измерений в HBase и тот факт, один в улей, вы можете прочитать данные Hbase из улья, see here.

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

  • Нет связанных вопросов^_^