Ответ
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. Он сам не знает, где данные, но он знает, кого спросить. Волнение ебать отступает.
А как он сам устроен, этот завсклад? Есть три способа его "посадить":
- Embedded (Встроенный): Это как если бы этот завсклад был твоим соседом по койке в общежитии и всё записывал на салфетке. Только для демок, в жизни так не делают. Доверия ебать ноль.
- Local (Локальный): Завсклад живёт на той же кухне (сервере), где и ты готовишь еду (запускаешь Hive), но книжку свою ведёт уже в нормальной тетради (MySQL). Сойдет для маленькой компании.
- Remote (Удалённый): А вот это уже серьёзно. Завсклад — это отдельный, важный дядька, который сидит в своей каморке (
thrift://...:9083). К нему приходят за справками все желающие со всего кластера. Это продакшен. Если он накроется медным тазом, то все твои SQL-запросы полетят к ебеням, потому что никто не будет знать, где что лежит.
Короче, Hive Metastore — это хитрая жопа, без которой вся твоя крутая экосистема данных превратилась бы в бардак, где каждый инструмент таскал бы данные по-своему, и консистентности было бы ни хуя себе. Он — тот самый центральный пункт выдачи справок, манда с ушами, которая всех мирит и заставляет жить по одним правилам.