В рамках обучения аналитиков данных, дата-инженеров и разработчиков распределенных приложений, сегодня поговорим про материализованные представления в Apache Hive. Что это такое, зачем нужно и как реализуется в самом популярном NoSQL-хранилище стека SQL-on-Hadoop.
Что такое материализованное представление и зачем это надо в аналитике больших данных: краткий ликбез
Аналитика данных включает в себя сложные запросы, которые включают соединения между таблицами, агрегации и результаты фильтрации данных. Определив эти запросы и сохранив результаты их выполнения для последующего использования, можно существенно повысить скорость аналитической обработки данных. Для этого в базах данных есть концепция представлений, которые бывают обычные и материализованные.
Представление — это виртуальная таблица, которая собирает данные, ранее полученные из любого другого соответствующего запроса. Каждый раз при обращении к представлению, оно перекомпилирует данные для предоставления актуальной информации согласно запросу. В представления можно вносить изменения или изменять базовые таблицы, а данные будут обновляться автоматически в обоих местах. Поэтому обновление обычного представления требует немного времени, но зато оно из-за виртуальной природы не занимает много места.
Материализованное представление намного эффективнее при выполнении запросов. Оно представляет собой — физического объекта базы данных, содержащего результат выполнения запроса. Материализованные представления позволяют намного повысить скорость выполнения SQL-запросов к большому количеству записей за счет прозрачного использования заранее вычисленных итоговых данных и результатов соединений таблиц. Обычно заранее вычисленные итоговые данные намного меньше исходных. Целостность данных в материализованных представлениях поддерживается с помощью периодических синхронизаций или триггеров. Поскольку данные материализованного представления физически сохраняются, каждый раз при выполнении запроса их не нужно считывать заново. Но физическое сохранение дает риск получить не самые актуальные данные. Чтобы снизить этот риск, можно обновлять данные вручную, по расписанию или с помощью триггера.
Таким образом, концептуально материализованные и обычные представления реализуют одну и тожу идею, но в материализованных представлениях фактические данные физически сохраняются на диске, а в обычных представлениях сохраняется только определение запроса, а не данные, стоящие за ним. Представления полагаются на базовые таблицы, упомянутые в определении, для получения результатов, тогда как материализованные представления полагаются на данные, сохраненные отдельно на диске для SQL-запросов.
Будучи NoSQL-хранилищем стека SQL-on-Hadoop, Apache Hive поддерживает концепцию материализованных представлений, позволяя обращаться к данным, хранящимся в HDFS, через ANSI-подобный язык SQL-запросов без разработки Java-кода с функциями MapReduce. Первоначальная реализация материализованных представлений в Apache Hive 3.0.0, фокусируется на автоматической перезаписи запросов на основе этих материализаций. В частности, материализованные представления могут изначально храниться в Hive или в других системах. А использоваться эти материализованные представления могут с помощью настраиваемых обработчиков хранилища. Это позволяет внешним системам использовать полезные функции Hive, например, ускорение LLAP, о котором мы писали здесь. Затем оптимизатор использует Apache Calcite для автоматической полной и частичной перезаписи большого набора выражений запросов, включающих проекции, фильтры, операции объединения и агрегирования. Напомним, Apache Calcite – это фреймворк с открытым исходным кодом для создания баз данных и СУБД, который включает синтаксический анализатор SQL, API для построения выражений в реляционной алгебре и механизм планирования запросов. Далее подробно рассмотрим, как концепция материализованных представлений реализуется в Apache Hive.
Код курса
HIVE
Ближайшая дата курса
Продолжительность
ак.часов
Стоимость обучения
0 руб.
Реализация концепции в Apache Hive
Итак, главная цель материализованных представлений — повысить производительность выполнения сложных SQL-запросов без особых усилий по обслуживанию. Синтаксис для создания материализованного представления в Hive очень похож на синтаксис инструкции CTAS, поддерживая общие функции, такие как столбцы разделов, настраиваемый обработчик хранилища или передача свойств таблицы. Например, следующий DDL-запрос показывает создание материализованного представления в Apache Hive:
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db_name.]materialized_view_name [DISABLE REWRITE] [COMMENT materialized_view_comment] [PARTITIONED ON (col_name, ...)] [CLUSTERED ON (col_name, ...) | DISTRIBUTED ON (col_name, ...) SORTED ON (col_name, ...)] [ [ROW FORMAT row_format] [STORED AS file_format] | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] ] [LOCATION hdfs_path] [TBLPROPERTIES (property_name=property_value, ...)] AS <query>;
В Hive при создании материализованного представления результаты определения запроса сохраняются на диск с включенной по умолчанию автоматической перезаписью запросов. При этом оптимизатор определять материализованные представления и использовать их для перезаписи входящих запросов путем перенаправления на соответствующие представления для более быстрого выполнения вместо повторного выполнения их с нуля, т.е. обращения к базовым таблицам. Пользователь также может напрямую запускать запросы к материализованным представлениям вместо того, чтобы зависеть от оптимизатора, выполняющего работу по перезаписи запросов. Hive перестанет использовать материализованные представления, если данные не обновляются в течение длительного времени или не соответствуют исходным базовым таблицам.
После первоначального создания материализованных представлений изменения в исходных таблицах не отражаются автоматически в представлениях. Пользователь должен явно перестроить представление с помощью следующей команды:
ALTER MATERIALIZED VIEW mv REBUILD;
При инициации перестроения, если новые данные добавляются в исходные таблицы с помощью команды INSERT, это запускает добавочную перестройку представлений. А в случае операторов UPDATE и DELETE требуется полная перестройка, которая реализована с помощью команды INSERT OVERWRITE с определением MV. Алгоритм перезаписи можно включать и отключать глобально с помощью свойства конфигурации hive.materializedview.rewriting, по умолчанию установленного в значение true. Кроме того, пользователи могут выборочно включать и отключать материализованные представления для перезаписи. По умолчанию материализованные представления разрешены для перезаписи во время создания. Чтобы изменить это поведение, можно использовать следующее утверждение:
ALTER MATERIALIZED VIEW [db_name.]materialized_view_name ENABLE|DISABLE REWRITE;
При создании материализованного представления его содержимое будет автоматически заполнено результатами выполнения запроса в операторе. Оператор создания материализованного представления является атомарным, что означает, что материализованное представление не будет видно другим пользователям, пока не будут заполнены все результаты запроса. По умолчанию материализованные представления могут использоваться оптимизатором для перезаписи запроса, а параметр DISABLE REWRITE можно использовать для изменения этого поведения во время создания материализованного представления.
Для перезаписи запросов с использованием материализованных представлений Hive требует, чтобы они были актуальными и не устарели. Поэтому по умолчанию Hive не использует устаревшие представления для перезаписи запросов. Актуальность нетранзакционных таблиц невозможно определить, поэтому они вообще не используются для перезаписи запросов. Чтобы периодически запустить операцию перестроения представлений и использовать их для перезаписи в Hive, следует установить значение параметра hive.materializedview.rewriting.time.window в тот временной период, с каким нужно обновлять данные.
Значения по умолчанию для сереализации и десериализации данных (SerDe) и формата хранения, если они не указаны в операторе создания материализованного представления, задаются с помощью свойств конфигурации hive.materializedview.serde и hive.materializedview.fileformat соответственно. Про сериализацию и десериализацию данных в Apache Hive мы писали здесь.
В заключение отметим, что в Apache Hive каждый раз при перестроении материализованного представления (добавочном или полном), оно сохраняет данные, которые уже существуют в кэше LLAP для него. LLAP – это приложение YARN, которое работает на всех узлах данных в кластере как слой кэширования и обработки в памяти поверх механизма запросов. Это долгоживущий процесс, но он не поглощает все ресурсы за счет динамического изменения масштаба в зависимости от требований запросов. В отличие от движка Apache Spark, LLAP не привязан к одному пользователю или приложению, поэтому кэширует данные для повторного использования и может использоваться пользователями для запросов. Например, если к одной и той же таблице несколько пользователей запускают SQL-запросы, они все обслуживаются одним и тем же кэшем LLAP. Это повышает производительность за счет минимизации запросов данных к HDFS. Механизмы запросов определяют, какая часть запросов будет обслуживаться LLAP. Подробнее про LLAP в Apache Hive мы рассказывали в прошлой статье.
Код курса
NoSQL
Ближайшая дата курса
Продолжительность
ак.часов
Стоимость обучения
0 руб.
Узнайте больше тонкостей про администрирование и эксплуатацию Apache Hive для аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники