
Статья подготовлена совместно с экспертом
Павел Савченко, архитектор предпродажных решений

Hive Metastore обычно вспоминают в тот момент, когда нужно подключить к озеру данных ещё один движок — CedrusData Engine, Trino, Spark или Hive. Файлы уже могут лежать в S3, HDFS или на локальном диске, но самому движку этого недостаточно. Ему нужно знать, где именно хранится конкретная таблица, какие у неё колонки, как устроены партиции и по каким путям искать данные. Эту информацию обычно хранит метастор.
Для небольшого стенда не нужен Hadoop-кластер с HDFS и YARN. Hive Standalone Metastore запускается отдельным сервисом, хранит свои данные в обычной реляционной БД и отдаёт метаданные движкам по Thrift API. В этой инструкции соберём такую связку на Hive Metastore 4.2 и PostgreSQL, а затем подключим к ней CedrusData Engine или Trino. Данные будут лежать локально, поэтому стенд подойдёт для экспериментов, проверки конфигурации и первого знакомства с Hive-коннектором.
Сначала разберём, когда Hive Metastore действительно нужен и чем он отличается от Iceberg REST Catalog. Затем поднимем PostgreSQL, настроим HMS и проверим, что движок может создать таблицу, записать Parquet-файл и прочитать его обратно. В конце покажем Docker-вариант и коротко разберём, что понадобится изменить для production-контура.

Павел Савченко, архитектор предпродажных решений
Hive Metastore хранит метаданные озера данных: пути к файлам таблиц, имена схем, типы колонок, партиционирование, параметры таблиц и прочую информацию. Перед чтением таблицы SQL-движок запрашивает эти данные по Thrift-протоколу.
Без метастора движок видит только набор файлов в объектном хранилище или на диске. Таблицы, схемы и партиции для него не существуют.
Hive Standalone Metastore работает без Hadoop-кластера и HiveServer2. Это отдельный сервис, который можно поднять самостоятельно.
Библиотеки Hadoop нужны только для операций с файлами: например, создать директорию при CREATE SCHEMA или удалить её при DROP TABLE. Для этого не требуется разворачивать YARN или HDFS-кластер. Достаточно иметь Hadoop FileSystem API на машине, где запущен метастор.
Выбор зависит от текущей инфраструктуры и направления развития платформы.
| Сценарий | Что использовать |
| Эксперименты, локальный стенд, legacy Hive-таблицы | Hive Metastore |
| Новый production Lakehouse на Iceberg | CedrusData Catalog, Apache Polaris, Lakekeeper |
| Миграция с Hadoop/Hive на Iceberg | Hive Metastore как промежуточный этап |
С версии 4.1 у Hive Metastore появился собственный Iceberg REST Catalog API, который работает параллельно с Thrift-интерфейсом. Формально это сокращает разрыв между классическим Hive-подходом и REST-каталогом. Для нового production-проекта на Iceberg обычно проще сразу выбрать отдельный REST-каталог.
Метастор состоит из трёх частей:
В этом стенде метаданные хранятся в PostgreSQL, а данные таблиц — в локальной файловой системе. В production локальную файловую систему обычно заменяют на S3-совместимое объектное хранилище, например VK Cloud Object Storage, или на HDFS. Сам сервис при этом не меняется.
Старые инструкции часто ориентируются на HMS 3.0 и несовместимый набор зависимостей. Для этого стенда нужны следующие версии.
| Компонент | Версия |
| JDK, Eclipse Temurin | 21 для HMS 4.2.x, 17 для HMS 4.1.x |
| Docker | 20.10 и новее |
| Apache Hadoop | 3.4.3 |
| Hive Standalone Metastore | 4.2.0 |
| PostgreSQL JDBC-драйвер | 42.7.13 |
| CedrusData Engine | Актуальная версия |
Совместимость CedrusData Engine с HMS 4.x стоит отдельно уточнить для конкретной версии движка. Upstream Trino с HMS 4.x работает, но настройки всегда лучше проверять на тестовом стенде.
Инструкция рассчитана на Ubuntu или Debian. Все команды выполняются от обычного пользователя с правами sudo.
Hive Metastore 4.2.0 требует Java 21. Подключите репозиторий Adoptium и установите Eclipse Temurin: sudo apt update && sudo apt install -y wget apt-transport-https gnupg
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo apt-key add - echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" \ | sudo tee /etc/apt/sources.list.d/adoptium.list sudo apt update && sudo apt install -y temurin-21-jdk
Для HMS 4.1 замените пакет на temurin-17-jdk.
Проверьте установку:
java -version
В выводе должна быть версия Java 21 для HMS 4.2 или Java 17 для HMS 4.1.
PostgreSQL будет хранить метаданные HMS. Зафиксируйте мажорную версию образа, чтобы стенд можно было воспроизвести позже.
docker run --name postgres-hive \ -e POSTGRES_USER=hive \ -e POSTGRES_PASSWORD=hive \ -e POSTGRES_DB=metastore_db \ -p 5432:5432 \ -d postgres:18
Проверьте, что контейнер запущен:
docker ps
В списке должен быть postgres-hive со статусом Up.
В эту директорию HMS будет записывать данные таблиц по умолчанию.
sudo mkdir /home/hive sudo chown "$USER" /home/hive
Проверьте владельца:
ls -ld /home/hive
Текущий пользователь должен быть владельцем каталога.
Метастору нужны библиотеки Hadoop FileSystem API, даже если полноценный Hadoop-кластер не развёрнут.
wget https://downloads.apache.org/hadoop/common/hadoop-3.4.3/hadoop-3.4.3.tar.gz tar -xf hadoop-3.4.3.tar.gz
Проверьте дистрибутив:
hadoop-3.4.3/bin/hadoop version
Если файл недоступен в основном каталоге Apache, проверьте его в архиве Apache. Старые версии Hadoop со временем переносят туда.
wget https://downloads.apache.org/hive/hive-standalone-metastore-4.2.0/hive-standalone-metastore-4.2.0-bin.tar.gz tar -xf hive-standalone-metastore-4.2.0-bin.tar.gz
В распакованной директории должны быть каталоги bin/, lib/ и conf/.
Для этого руководства используется HMS 4.2.0. Команды для 4.2.1 не отличаются, но для 4.2.0 доступен официальный Docker-образ, который понадобится во втором варианте установки.
Hive Metastore подключается к PostgreSQL через JDBC. Драйвер нужно положить в каталог lib/.
export METASTORE_HOME="$(pwd)/apache-hive-metastore-4.2.0-bin" wget https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.13/postgresql-42.7.13.jar \ -P "$METASTORE_HOME/lib"
Проверьте, что файл скачался:
ls "$METASTORE_HOME/lib" | grep postgresql
Создайте файл $METASTORE_HOME/conf/metastore-site.xml:
<?xml version="1.0"?> <configuration> <property> <name>metastore.thrift.uris</name> <value>thrift://localhost:9083</value> </property> <property> <name>metastore.warehouse.dir</name> <value>/home/hive</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:postgresql://localhost:5432/metastore_db</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.postgresql.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive</value> </property> <property> <name>metastore.expression.proxy</name> <value>org.apache.hadoop.hive.metastore.DefaultPartitionExpressionProxy</value> </property> </configuration>
В HMS 4.x свойства hive.metastore.* переименовали в metastore.*. Старые названия работают как алиасы, но в новых конфигурациях лучше использовать актуальные ключи.
Блок javax.jdo.option.* не менялся со времён HMS 3.x. Здесь метастор получает параметры подключения к PostgreSQL и путь к warehouse-директории.
export JAVA_HOME="$(dirname "$(dirname "$(readlink -f "$(which java)")")")" export HADOOP_HOME="$(pwd)/hadoop-3.4.3"
Проверьте значения:
echo "$JAVA_HOME" echo "$HADOOP_HOME"
Обе команды должны вывести существующие пути.
cd "$METASTORE_HOME" bin/schematool -dbType postgres -initSchema
Параметр -dbType postgres обязателен. Если команда завершилась успешно, в выводе будет строка вида:
schemaTool completed
bin/start-metastore
В другом терминале проверьте доступность Thrift-порта:
nc -zv localhost 9083
Ответ succeeded означает, что HMS слушает порт 9083 и готов принимать запросы от SQL-движков.
Docker-вариант полезен для локального стенда и CI/CD. Не нужно отдельно устанавливать Hadoop и JDK: зависимости уже входят в образ.
Официальный образ Apache Hive содержит выделенные теги для метастора, включая standalone-metastore-4.2.0 и standalone-metastore-4.1.0. Для production удобнее конфигурация из архива или собственный образ с зафиксированными зависимостями, но для проверки связки Docker достаточно.
Создайте файл compose.yaml:
services: postgres: image: postgres:18 environment: POSTGRES_USER: hive POSTGRES_PASSWORD: hive POSTGRES_DB: metastore_db metastore: image: apache/hive:standalone-metastore-4.2.0 environment: SERVICE_NAME: metastore DB_DRIVER: postgres SERVICE_OPTS: >- -Djavax.jdo.option.ConnectionDriverName=org.postgresql.Driver -Djavax.jdo.option.ConnectionURL=jdbc:postgresql://postgres:5432/metastore_db -Djavax.jdo.option.ConnectionUserName=hive -Djavax.jdo.option.ConnectionPassword=hive ports: - "9083:9083" depends_on: - postgres volumes: - ./postgresql-42.7.13.jar:/opt/hive/lib/postgres.jar
Переменная SERVICE_NAME=metastore обязательна. Без неё контейнер не знает, какой сервис запускать. DB_DRIVER=postgres переключает бэкенд со встроенной Derby на PostgreSQL, а SERVICE_OPTS передаёт параметры JDBC-подключения.
JDBC-драйвер PostgreSQL в образ обычно не входит, поэтому его нужно скачать заранее и смонтировать в контейнер:
wget https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.13/postgresql-42.7.13.jar
Запустите стенд:
docker compose up -d
Проверьте Thrift-порт:
nc -zv localhost 9083
Если увидите Connection to localhost 9083 port succeeded, PostgreSQL запущен, схема применена, а HMS слушает запросы.
Для файлов на хосте добавьте отдельный volume mount под warehouse-директорию. Иначе таблицы будут записываться внутрь контейнера и исчезнут после его пересоздания.
Настройки S3 или HDFS можно передать через SERVICE_OPTS, но длинный набор JVM-флагов хуже читается и поддерживается, чем отдельный metastore-site.xml.
Если Hive Metastore нужен только как точка входа для Trino и Iceberg, вместо связки PostgreSQL и Thrift можно рассмотреть CedrusData Catalog. Это Iceberg REST-каталог с RBAC, Web UI и работой с Object Storage без Hadoop-зависимостей.
Проверим работу стенда на CedrusData Engine. Он использует тот же Hive-коннектор, что и upstream Trino.
Разверните CedrusData Engine по инструкции для установки из архива.
Создайте файл etc/catalog/hive.properties в директории CedrusData Engine:
connector.name=hive hive.metastore.uri=thrift://localhost:9083 hive.security=allow-all
connector.name=hive включает Hive-коннектор. Свойство hive.metastore.uri указывает на Thrift-сервис, запущенный в предыдущих шагах.
Параметр hive.security=allow-all отключает проверку прав доступа. Он годится только для локального стенда. В production для Hive-коннектора нужна отдельная модель авторизации.
Точный набор свойств лучше сверить с документацией установленной версии CedrusData Engine.
bin/launcher restart
Для проверки используем встроенный генератор TPC-DS. Реальные данные загружать не нужно. bin/trino --execute "CREATE SCHEMA hive.my_tpcds"
bin/trino --execute " CREATE TABLE hive.my_tpcds.call_center WITH (format = 'PARQUET') AS SELECT * FROM tpcds.sf1.call_center "
bin/trino --execute " SELECT cc_call_center_id, cc_name FROM hive.my_tpcds.call_center "
Если запрос вернул список call-центров, метастор отдал схему таблицы, а движок прочитал Parquet-файлы из warehouse-директории.
ls -R /home/hive
В каталоге my_tpcds/call_center/ должен появиться Parquet-файл. Метаданные таблицы лежат в PostgreSQL, а данные — в /home/hive.
bin/trino --execute "DROP TABLE hive.my_tpcds.call_center" bin/trino --execute "DROP SCHEMA hive.my_tpcds" ls -R /home/hive
После удаления схемы warehouse-директория должна очиститься. HMS удалит данные через Hadoop FileSystem API одновременно с метаданными.
| Ошибка | Причина | Что проверить |
| MetaException: Unable to open a test connection | PostgreSQL недоступен или указаны неверные credentials | docker ps, порт 5432, ConnectionUserName, ConnectionPassword |
| Could not find or load main class ...HiveMetaStore | Не задан HADOOP_HOME | Экспортировать HADOOP_HOME с путём к Hadoop 3.4.3 |
| java.lang.UnsupportedClassVersionError | JDK старее требуемой | HMS 4.2 требует JDK 21, HMS 4.1 — JDK 17 |
| SchemaVersion mismatch | Схема БД не соответствует версии HMS | Выполнить bin/schematool -dbType postgres -upgradeSchema или пересоздать metastore_db |
| TTransportException при подключении движка | HMS не запущен или закрыт порт 9083 | nc -zv localhost 9083, логи bin/start-metastore |
Локальный стенд — только отправная точка. Для production обычно нужно сделать ещё три вещи.
Перенести warehouse в Object Storage. Вместо локального пути укажите в metastore.warehouse.dir адрес вида s3a://bucket/path и настройте параметры fs.s3a.*. Endpoint и параметры для VK Cloud Object Storage берите из документации VK Cloud.
Подключить Apache Iceberg. Вместо Hive-коннектора можно использовать Iceberg-коннектор. Он добавляет ACID-транзакции, time travel и эволюцию схемы без пересоздания таблиц.
Заменить HMS на REST-каталог. CedrusData Catalog работает по Iceberg REST API, не требует Hadoop-зависимостей и включает RBAC. Для команд, которым Hive Metastore нужен только как совместимый слой для Trino и Iceberg, это способ убрать Thrift и внешний контур управления доступами.

CedrusData Catalog — Web UI и управление доступом поверх Iceberg REST API
Hive Metastore — реестр метаданных озера данных: схем таблиц, типов колонок, путей к файлам и партиций. Trino, Spark и другие движки обращаются к нему по Thrift API, чтобы узнать структуру таблицы перед чтением файлов.
Полный Hadoop-кластер не нужен. В standalone-режиме HMS использует Hadoop FileSystem API для операций с файлами, но не требует отдельного развёртывания HDFS или YARN.
Hive Metastore работает по Thrift, использует Hadoop-зависимости и обычно требует отдельного слоя RBAC. Iceberg REST Catalog использует HTTP API и поддерживает возможности Iceberg нативно.
Начиная с HMS 4.1, у Hive Metastore есть собственный Iceberg REST API. Для новых Iceberg-проектов чаще выбирают отдельный REST-каталог, а HMS оставляют для legacy-систем и переходных сценариев.
Да. Для этого в metastore.warehouse.dir укажите путь s3a://... и добавьте параметры_ fs.s3a.*_ для доступа к хранилищу. Для VK Cloud Object Storage значения endpoint и учётных данных нужно брать из документации сервиса.
В инструкции разобраны два способа запуска Hive Metastore: установка из архива для управляемого стенда и Docker-вариант для быстрого старта. Затем проверена связка с CedrusData Engine: от создания схемы до чтения тестовых данных TPC-DS.
Следующий шаг зависит от цели. Для production нужно перенести warehouse в объектное хранилище и настроить права доступа. Для Iceberg-таблиц стоит подключить Iceberg-коннектор. Если Hadoop-зависимости и Thrift больше не нужны, логичнее рассмотреть переход на Iceberg REST-каталог.
Наши специалисты свяжутся с вами в ближайшее время и ответят на все вопросы.

Будем держать в курсе новостей и облачных трендов




