Открыть сервисСервис

Apache Hive Metastore

Apache Hive Metastore — это центральный репозиторий метаданных для экосистемы Apache Hadoop, который хранит информацию о структурах таблиц, их схемах, расположении данных в файловой системе (например, HDFS или Amazon S3), а также о партициях и сериализаторах/десериализаторах (SerDe). Он является ключевым компонентом Apache Hive, но может использоваться и другими системами обработки данных (Spark, Presto, Impala) для обеспечения единого доступа к метаданным.

Архитектура и компоненты

Metastore реализован в виде реляционной базы данных (по умолчанию — Apache Derby, в продакшене — MySQL, PostgreSQL, Oracle) и серверного приложения, которое предоставляет Thrift API для взаимодействия. Архитектура включает три основных режима работы:

Встроенный режим (Embedded)

В этом режиме Metastore работает как часть процесса Hive (например, в Hive CLI). Он использует встроенную базу данных Derby и не требует отдельного сервера. Этот режим подходит для тестирования и разработки, но не рекомендуется для продакшена из-за ограничений по масштабируемости и одновременным подключениям.

Локальный режим (Local)

Metastore запускается как отдельный процесс на том же узле, что и Hive, но использует внешнюю реляционную базу данных (например, MySQL). Этот режим обеспечивает лучшую производительность и изоляцию, но требует ручного управления сервером.

Удалённый режим (Remote)

Metastore работает как отдельный сервер (обычно на выделенном узле), предоставляя Thrift API для удалённого доступа. Это стандартный режим для промышленных сред, так как он позволяет нескольким клиентам (Hive, Spark, Impala) одновременно обращаться к метаданным, а также обеспечивает централизованное управление и мониторинг.

Функции и возможности

Хранение схем таблиц

Metastore хранит для каждой таблицы:

  • Имя таблицы и базы данных (namespace).
  • Список колонок с типами данных (например, INT, STRING, MAP, STRUCT).
  • Свойства таблицы (например, формат хранения: Parquet, ORC, Avro).
  • Расположение данных в файловой системе (URL).
  • Информацию о партициях (partition columns) и бакетах (bucket columns).

Управление партициями

Партиции — это способ разделения данных на подкаталоги по значению одного или нескольких столбцов (например, по дате). Metastore хранит метаданные каждой партиции отдельно, что позволяет запросам эффективно отсекать ненужные партиции (partition pruning) и избегать сканирования всего набора данных.

Поддержка SerDe и форматов файлов

Metastore хранит информацию о том, как данные должны быть сериализованы и десериализованы. Это позволяет поддерживать различные форматы хранения: текст (CSV, JSON), бинарные (Parquet, ORC, Avro), а также пользовательские форматы.

Каскадное удаление и обновление

При удалении таблицы или партиции Metastore автоматически удаляет соответствующие записи из базы данных, но не затрагивает сами данные в файловой системе (если не указано иное). Это позволяет избежать случайной потери данных.

История и развитие

Apache Hive Metastore был разработан в рамках проекта Apache Hive, который был создан в Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ) в 2008 году для упрощения работы с Hadoop. Первоначально Metastore был частью Hive, но в 2010-х годах его выделили в отдельный компонент (Hive Metastore, HM) для использования другими системами.

В 2017 году проект Apache Hive передал Metastore в подпроект Apache Hive, но он остаётся частью дистрибутива Hive. В 2020-х годах появилась инициатива Apache Hive Metastore (HMS) как отдельный проект, но она не была завершена. В настоящее время Metastore развивается в рамках Apache Hive (версии 3.x и 4.x) и поддерживает такие функции, как ACID-транзакции (через Hive ACID) и интеграцию с Apache Iceberg и Delta Lake.

Интеграция с другими системами

Apache Spark

Spark может использовать Hive Metastore для чтения и записи таблиц, созданных в Hive. Для этого необходимо указать параметр spark.sql.catalogImplementation=hive. Spark также может создавать новые таблицы в Metastore, если они не существуют.

Apache Impala

Impala (часть экосистемы Cloudera) использует Hive Metastore для получения метаданных о таблицах, но имеет собственный механизм кэширования метаданных (catalogd). Для синхронизации изменений между Impala и Metastore используется команда INVALIDATE METADATA.

Presto/Trino

Presto и Trino могут подключаться к Hive Metastore через коннектор hive. Это позволяет выполнять SQL-запросы к данным, хранящимся в HDFS или S3, с использованием схем, определённых в Hive.

Flink может использовать Hive Metastore для чтения метаданных и записи данных в таблицы Hive. Это полезно для потоковой обработки данных с последующей загрузкой в хранилище.

Управление и администрирование

Настройка базы данных

Для продакшена рекомендуется использовать внешнюю базу данных (MySQL, PostgreSQL) с поддержкой транзакций и индексов. Необходимо настроить параметры javax.jdo.option.ConnectionURL, javax.jdo.option.ConnectionDriverName, javax.jdo.option.ConnectionUserName и javax.jdo.option.ConnectionPassword в файле hive-site.xml.

Мониторинг и резервное копирование

Metastore не имеет встроенных средств мониторинга, но можно использовать стандартные инструменты для базы данных (например, Prometheus + Grafana для MySQL). Резервное копирование базы данных Metastore должно выполняться регулярно, так как потеря метаданных делает невозможным доступ к данным.

Миграция схемы

При обновлении Hive может потребоваться миграция схемы Metastore. Для этого используется утилита schematool, которая проверяет и обновляет структуру таблиц в базе данных.

Критика и ограничения

Единая точка отказа

В удалённом режиме Metastore является единой точкой отказа (SPOF). Если сервер Metastore выходит из строя, все клиенты теряют доступ к метаданным. Для повышения отказоустойчивости можно использовать кластеризацию базы данных (например, MySQL с репликацией) и балансировку нагрузки на Thrift-сервер.

Производительность при большом количестве партиций

При наличии миллионов партиций запросы к Metastore могут замедляться. Это связано с тем, что Metastore хранит каждую партицию как отдельную запись в базе данных. Для решения этой проблемы используются партиционирование самой базы данных и кэширование метаданных на стороне клиента (например, в Spark).

Отсутствие поддержки ACID для метаданных

Хотя Hive поддерживает ACID-транзакции для данных, Metastore не обеспечивает транзакционность для операций с метаданными. Это может привести к рассинхронизации при одновременных изменениях из разных клиентов.

Интересные факты

  • Hive Metastore используется не только в Hive, но и в таких системах, как Apache Spark, Apache Impala, Presto, Trino, Apache Flink, что делает его де-факто стандартом для метаданных в экосистеме Hadoop.
  • В 2020 году компания Cloudera предложила проект Apache Hive Metastore (HMS) как отдельный компонент, но он не был принят Apache Software Foundation.
  • Metastore может хранить метаданные для таблиц, расположенных в облачных хранилищах (Amazon S3, Azure Blob Storage, Google Cloud Storage), что делает его пригодным для гибридных и облачных архитектур.
  • В Hive 4.0 была добавлена поддержка метаданных для таблиц в формате Iceberg, что позволяет использовать Metastore как единый каталог для современных форматов данных.

Источники

  • Apache Hive Documentation: Hive Metastore Administration
  • Apache Hive Wiki: Hive Metastore
  • Cloudera Documentation: Hive Metastore Best Practices
  • Hortonworks (now Cloudera) Documentation: Hive Metastore Tuning
  • «Hive: The Definitive Guide» by Edward Capriolo, Dean Wampler, Jason Rutherglen (O'Reilly Media, 2012)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru