Что такое Hive Metastore?

«Что такое Hive Metastore?» — вопрос из категории Hadoop и HDFS, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые функции и роль:

  • Единый источник истины: Предоставляет согласованные метаданные для множества инструментов, таких как Apache Hive, Apache Spark, Apache Impala, Presto/Trino и Apache Flink. Без Metastore каждому инструменту пришлось бы вести свою собственную копию схемы.
  • Абстракция над хранилищем: Позволяет работать с данными на языке SQL, скрывая детали формата файлов (Parquet, ORC, Avro, текст) и их расположения.
  • Поддержка реляционной модели: Включает концепции баз данных, таблиц, представлений (views) и разделов (partitions для ускорения запросов).
  • Backend на RDBMS: Для надежного хранения самих метаданных Metastore использует традиционную реляционную СУБД (чаще всего MySQL или PostgreSQL).

Пример создания таблицы в Hive и доступа к ней через Spark:

-- Создание таблицы в Hive (DDL запрос отправляется в Metastore)
CREATE EXTERNAL TABLE IF NOT EXISTS sales (
    transaction_id BIGINT,
    user_id INT,
    amount DECIMAL(10,2),
    product_category STRING,
    sale_date DATE
)
PARTITIONED BY (sale_year INT, sale_month INT)
STORED AS PARQUET
LOCATION 's3://data-lake/sales/'
TBLPROPERTIES ('parquet.compression'='SNAPPY');
# Подключение Spark к удаленному Hive Metastore
from pyspark.sql import SparkSession

spark = SparkSession.builder 
    .appName("HiveMetastoreExample") 
    .config("hive.metastore.uris", "thrift://hive-metastore-host:9083")  # Адрес сервиса Metastore
    .config("spark.sql.warehouse.dir", "s3://data-lake/warehouse/") 
    .enableHiveSupport()  # Критически важная опция
    .getOrCreate()

# Теперь Spark может читать таблицу 'sales', чья схема хранится в Metastore
df = spark.sql("SELECT * FROM sales WHERE sale_year = 2023 AND sale_month = 12")
df.show()

# Создание новой таблицы через Spark также запишет её метаданные в Metastore
df.write.mode("overwrite").saveAsTable("sales_aggregated")

Архитектура и режимы развертывания:

  • Embedded Metastore (встроенный): Используется для демонстраций, метаданные хранятся во встроенной Derby DB. Не подходит для продакшена.
  • Local Metastore: Сервис Metastore работает на той же машине, что и Hive/Spark, но использует внешнюю БД (MySQL). Подходит для небольших кластеров.
  • Remote Metastore: Отдельный сервер (или кластер серверов) с Metastore Service, к которому по Thrift API подключаются все клиенты. Это стандартная продакшен-архитектура, обеспечивающая масштабируемость и отказоустойчивость.

Таким образом, Hive Metastore является клеем, который объединяет различные инструменты экосистемы Hadoop вокруг единого представления о данных.