Что такое Hive Metastore?

Ответ

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 вокруг единого представления о данных.

Ответ 18+ 🔞

Давай разжую эту тему, чтобы даже кошка соседская поняла, про что речь. Представь себе огромный склад, забитый до потолка коробками. Это твоё хранилище данных — HDFS или там S3. В каждой коробке — файлы: Parquet, ORC, текст какой-нибудь. И вот ты заходишь туда, а там овердохуища всего, и нихрена не понятно, где что лежит.

Вот Hive Metastore — это, по сути, злой и вечно невыспавшийся завскладом с толстой гроссбухой. В этой гроссбухе (а на самом деле в нормальной базе типа MySQL) у него записано всё:

  • Где лежат коробки с "продажами за 2023 год" (LOCATION 's3://data-lake/sales/').
  • Что внутри каждой коробки: вот transaction_id, вот user_id, а вот amount (CREATE TABLE sales (...)).
  • Как эти коробки отсортированы по полкам — по году и месяцу (PARTITIONED BY).

Без этого чувака тебе пришлось бы каждый раз, чтобы найти данные, самому рыться в этой свалке. Ёпта, да это же пиздец! А так ты просто подходишь к нему и говоришь: "Дай-ка мне продажи за декабрь 2023-го". Он хмуро листает свою книжку и говорит: "Полка 2023, секция 12, коробка номер 5. Вали отсюда, не мешай работать". И все инструменты — Hive, Spark, Presto — ходят к этому одному завскладу, чтобы не было ебанины и разнобоя.

Пример из жизни, чтобы совсем ясно стало:

Ты через Hive говоришь завскладу: "Заведи новую запись, браток. Будет у нас таблица sales. Пиши, где лежит и что внутри". Это вот этот SQL:

CREATE EXTERNAL TABLE IF NOT EXISTS sales (...)

Потом приходит Spark, который вообще-то другой парень, но ему тоже нужны данные. Он не идёт рыться сам, а говорит: "Эй, завсклад, дай схему для sales и скажи, где это валяется!" И ведь даёт! Потому что они используют одного и того же "клеща". Смотри, как Spark подключается:

spark = SparkSession.builder 
    .config("hive.metastore.uris", "thrift://hive-metastore-host:9083") # Адрес этого самого завсклада
    .enableHiveSupport() # Без этой строчки он даже не попытается с ним говорить!
    .getOrCreate()

И после этого Spark может спокойно выполнить SELECT * FROM sales. Он сам не знает, где данные, но он знает, кого спросить. Волнение ебать отступает.

А как он сам устроен, этот завсклад? Есть три способа его "посадить":

  1. Embedded (Встроенный): Это как если бы этот завсклад был твоим соседом по койке в общежитии и всё записывал на салфетке. Только для демок, в жизни так не делают. Доверия ебать ноль.
  2. Local (Локальный): Завсклад живёт на той же кухне (сервере), где и ты готовишь еду (запускаешь Hive), но книжку свою ведёт уже в нормальной тетради (MySQL). Сойдет для маленькой компании.
  3. Remote (Удалённый): А вот это уже серьёзно. Завсклад — это отдельный, важный дядька, который сидит в своей каморке (thrift://...:9083). К нему приходят за справками все желающие со всего кластера. Это продакшен. Если он накроется медным тазом, то все твои SQL-запросы полетят к ебеням, потому что никто не будет знать, где что лежит.

Короче, Hive Metastore — это хитрая жопа, без которой вся твоя крутая экосистема данных превратилась бы в бардак, где каждый инструмент таскал бы данные по-своему, и консистентности было бы ни хуя себе. Он — тот самый центральный пункт выдачи справок, манда с ушами, которая всех мирит и заставляет жить по одним правилам.