Разделение Hadoop. Как эффективно оформить стол Hive/Impala?
Как эффективно составить таблицу Hive/Impala, учитывая следующие факты?
- Таблица получает данные инструмента около 100 миллионов строк каждый день. Дата получения данных сохраняется в столбце таблицы вместе с идентификатором инструмента.
- Каждый инструмент получает около 500 прогонов в день, что определяется идентификатором прогона колонки. Каждый идентификатор запуска содержит данные размером примерно 1 МБ.
- Размер блока по умолчанию составляет 64 МБ.
- В таблице можно искать по дате, идентификатору инструмента и идентификатору прогона в этом порядке.
1 ответ
Если вы занимаетесь аналитикой этих данных, то с Impala у вас есть хороший выбор - использовать формат Parquet. Что хорошо для наших пользователей, так это разделение даты по году, месяцу, дню на основе значения даты в записи.
Так, например, CREATE TABLE foo (tool_id int, eff_dt timestamp) раздел (year int, month int, day int) хранится как паркет
При загрузке данных в эту таблицу мы используем нечто подобное для создания динамических разделов:
INSERT INTO foo partition (year, month, day)
SELECT tool_id, eff_dt, year(eff_dt), month(eff_dt), day(eff_dt)
FROM source_table;
Затем вы обучаете своих пользователей тому, что если они хотят лучшей производительности, добавьте в свои ГОД, МЕСЯЦ, ДЕНЬ WHERE
пункт, так что он попадает в раздел для лучшей производительности. Затем попросите их добавить eff_dt
в SELECT
Таким образом, они имеют значение даты в том формате, который им нравится видеть в своих окончательных результатах.
В CDH Parquet хранит данные по умолчанию в блоках по 256 МБ (это настраивается). Вот как это настроить: http://www.cloudera.com/documentation/enterprise/latest/topics/impala_parquet_file_size.html