
Статья подготовлена с экспертом
Никита Янченков, руководитель подразделения Аналитические сервисы и управление данными

Команда, которая обсуждает переход с Hive Metastore на Iceberg REST Catalog, часто сравнивает два продукта. Такая постановка устарела. Начиная с версии 4.1.0, выпущенной 31 июля 2025 года, Hive Metastore сам публикует эндпоинты Iceberg REST Catalog API. Одну таблицу можно открыть через Thrift или REST: «Iceberg users can access Iceberg tables via either Hive Metastore Thrift API (using HiveCatalog) or Iceberg REST Catalog API». Метастор стал одной из реализаций протокола, с которым его обычно сравнивают.
Выбирать приходится не продукт, а режим эксплуатации каталога. Производительность здесь не главный критерий: публично измеримого порога, после которого Lakehouse обязательно должен отказаться от метастора, нет. Решение появляется, когда Hive Metastore не закрывает требования по своей архитектуре, а не когда достигается определённая нагрузка.
В этой статье — чек-лист из четырёх требований, три сценария по его итогам, признаки исчерпания метастора, сравнение четырёх режимов и разбор миграции со стоп-факторами. Возможно, менять ничего не понадобится: достаточно включить REST-эндпоинт у уже работающего метастора.

Никита Янченков, руководитель подразделения Аналитические сервисы и управление данными
Формулировка «Hive Metastore или Iceberg REST» смешивает транспорт, протокол и конкретный продукт. На деле есть четыре режима с разным порогом входа и набором ограничений.
Hive Metastore — сервис-реестр метаданных таблиц. Он хранит схемы, описания партиций и пути к файлам в реляционной БД. Движки подключаются к нему по Thrift, а на каждом клиенте работает JVM-прослойка. Так устроено большинство контуров, выросших из Hadoop.
REST-слой включается через порт сервлета metastore.catalog.servlet.port. Thrift и REST работают одновременно с одними и теми же таблицами.
Функциональность выходила в двух релизах:
Последний фикс важен для эксплуатации. В версии 4.1.0 REST-путь ещё сырой, поэтому ориентироваться стоит на Hive 4.2.0. На сентябрь 2026 года актуальны Hive 4.2.1, Apache Iceberg 1.11.0 и Trino 483.
Это отдельный stateless-сервис, реализующий спецификацию Iceberg REST Catalog. Состояние хранится в бэкенд-БД, а сервис масштабируется горизонтальными репликами за балансировщиком. К этому классу относятся Apache Polaris, Project Nessie, Lakekeeper и другие реализации. Как соотносятся Polaris, Nessie и другие реализации, мы разбирали отдельно.
Здесь REST-протокол дополнен эксплуатационной обвязкой: интерфейсом управления, ролями и пользователями, средствами обслуживания таблиц. На российском рынке в таком режиме работает CedrusData Catalog.
Сравнение часто становится некорректным из-за двух мифов.
Миф 1. У метастора нет современной аутентификации. У REST-слоя Hive есть четыре метода аутентификации:
Миф 2. OAuth2 в Iceberg REST устарел. Устарел встроенный эндпоинт выдачи токенов /v1/oauth/tokens: он помечен в спецификации как_ DEPRECATED for REMOVAL_ с версии Iceberg Java 1.6.0. Клиентам предлагают использовать внешний сервер через свойство oauth2-server-uri. Так устроен REST-слой Hive Metastore и продуктовые каталоги.
Всё это относится к техническому каталогу, то есть реестру таблиц для движков. Каталог данных в смысле governance, с владельцами, глоссарием и политиками доступа, решает другую задачу.
Каждое требование проверяется на собственном контуре.
Что это. Клиент не хранит постоянный ключ к бакету. Он запрашивает у каталога короткоживущие креды. В спецификации Iceberg REST для этого есть credential vending и remote signing, эндпоинты /credentials и /sign.
Почему Thrift-путь не закрывает требование. Hive Metastore не работает с выдачей временных кредов. Ключи объектного хранилища остаются в конфигурации движка. Включение REST-эндпоинта у метастора ничего не меняет: в опубликованном Hive ответе /v1/config есть операции с таблицами, представлениями и транзакциями, но нет ни /credentials, ни /sign.
Если движок не должен получать постоянные ключи к бакету, метастор не закроет требование ни через Thrift, ни через собственный REST API.
Обход через свойства каталога небезопасен. Документация Apache Polaris для федерации метастора прямо запрещает хранить креды объектного хранилища в свойствах каталога: секреты возвращаются клиентам через /config.
Как проверить у себя. Найдите, где лежит ключ к бакету: в catalog properties координатора, переменных окружения воркеров или секрете оркестратора. Посчитайте число людей и сервисов с доступом к нему, а также оцените последствия ротации. Если один бессрочный ключ хранится в конфигурации, требование уже актуально.
Что это. Одна транзакция обновляет несколько таблиц целиком: либо изменения попадают во все таблицы, либо не попадают никуда. В спецификации для этого используется POST /v1/{prefix}/transactions/commit, операция commitTransaction. При успешном коммите сервер возвращает 204, при конфликте требований — 409 с CommitFailedException, после чего клиент может повторить операцию.
Почему Thrift-путь не закрывает требование. Поддержка мультитабличного коммита реализована в REST-каталоге: метод commitTransaction(SessionContext, List
С REST-режимом Hive Metastore ситуация не такая однозначная. Эндпоинт POST /v1/{prefix}/transactions/commit есть в опубликованном примере ответа /v1/config. Но заявленный эндпоинт ещё не доказывает реализацию, проверенную в бою.
Как проверить у себя. Посмотрите, есть ли пайплайны, в которых одновременно должны обновляться факт, витрина и словарь измерений. Разберите сценарий падения между коммитами: потребуется ручной откат, повторный прогон или витрины разойдутся на несколько часов. Если компенсирующая логика уже написана вручную и её приходится сопровождать, требование горит.
Что это. Сервис каталога определяет, кто видит namespace и кто может писать в таблицу. Правило действует сразу для всех движков.
Почему Thrift-путь не закрывает требование самостоятельно. Нельзя считать, что в Hive Metastore нет RBAC. Контроль доступа есть, но подключается внешним компонентом. Hive документирует интеграцию с Apache Ranger через RangerHiveAuthorizerFactory, с правами на уровне базы и таблицы. Ranger также поддерживает маскирование колонок и фильтрацию строк.
Это рабочая архитектура, но она требует отдельного продукта, его развёртывания, обновления и дежурства. В REST-каталогах контроль доступа встроен в сервис, поэтому правила описываются в одном месте.
Как проверить у себя. Посчитайте, сколько систем участвует в описании одного правила доступа: Ranger, конфигурации движков, политики бакета, гранты в БД метаданных. Если правило живёт в трёх местах и у него два владельца, рассинхрон почти неизбежен. Требование особенно жёсткое в Data Mesh-контурах, где данными владеют доменные команды, а не единая платформенная.
Что это. Python-сервис, Go-приложение или cloud-native компонент обращается к каталогу по обычному HTTP без JVM-прослойки.
Это единственное из четырёх требований, которое Hive Metastore способен закрыть сам. Thrift требует JVM на каждом клиенте, а REST-эндпоинт метастора доступен по HTTP. Достаточно включить сервлет и сохранить Thrift для существующих клиентов. Но переходить на REST стоит только с Hive 4.2.0: в 4.1.0 REST-слой падал на обычном метасторе.
Как проверить у себя. Посчитайте Thrift-клиентов и их владельцев. Это прямой множитель стоимости миграции: при переходе на REST клиентов придётся переписывать или проксировать.
Если ни одно из требований не оказалось критичным, Hive Metastore можно оставить как есть. Не стоит начинать миграцию только потому, что появился Iceberg REST Catalog: работающий метастор не требует замены без конкретной причины.
Если нужен только доступ к каталогу для клиентов вне JVM, достаточно обновить Hive до версии 4.2.0 и включить Iceberg REST API. Thrift-клиенты продолжат работать, а новые сервисы смогут обращаться к тем же таблицам по HTTP.
Если требуются временные креды к объектному хранилищу или единый контроль доступа на уровне каталога, одного Hive Metastore уже недостаточно. Эти возможности не появятся от включения REST-эндпоинта, поэтому придётся рассматривать отдельный Iceberg REST-каталог или готовый каталоговый продукт.
С мультитабличными транзакциями ситуация менее однозначная. REST-слой Hive Metastore публикует нужный эндпоинт, но его стоит проверить на собственном стенде с Hive 4.2.0. Если коммит нескольких таблиц работает и покрывает нужный сценарий, можно обойтись обновлением.
Живой Hadoop-контур, где метастор уже развёрнут и обслуживается, не обязательно нужно считать техническим долгом. Остаться на нём стоит и в следующих случаях.
В production есть non-Iceberg форматы. Это жёсткое ограничение. Iceberg REST описывает Iceberg-таблицы и представления, но не Hive-таблицы произвольного формата. CedrusData Catalog прямо указывает, что не реализует Hive Metastore Thrift API и не заменяет Hive в остальных сценариях. Если в контуре есть текстовые таблицы, кастомные SerDe или форматы вне Avro, Parquet и ORC, метастор остаётся необходимым.
Есть внутренние сервисы, завязанные на Thrift. Каждый такой клиент нужно учитывать в смете миграции.
Нет бюджета на миграцию, но нужна REST-совместимость. Можно включить Iceberg REST API у самого метастора и не отключать Thrift. Такой переход получится провести постепенно.
Есть три варианта, от наименее до наиболее инвазивного.
Двойной API у метастора, Hive 4.2+. Самый дешёвый путь: Thrift-клиенты остаются без изменений, а новые движки используют REST. Для эксплуатации нужна версия не ниже Hive 4.2.0.
Федерация метастора через Polaris. Документация проекта, пока в ветке in-dev/unreleased, описывает федерацию с существующим Hive Metastore. Внешний HMS остаётся источником истины для метаданных, а Polaris берёт на себя доступ, политики и подключение нескольких движков.
Перед пилотом нужно учесть ограничения:
Несколько каталогов в одном движке. Trino может одновременно работать с каталогом hive.metastore=thrift и каталогом iceberg.catalog.type=rest. Это удобный переходный режим: новые витрины создаются в REST-каталоге, исторические таблицы остаются на прежнем месте.
Этот сценарий появляется, когда требуется выдавать временные креды, нужен встроенный каталоговый контроль доступа или контур стал мультидвижковым. REST сокращает число интеграций: вместо коннектора для каждой пары «движок × каталог» достаточно один раз реализовать клиент на стороне движка и один раз — сервер на стороне каталога.
В этом сценарии уместен режим «каталог как продукт». Рассмотрим CedrusData Catalog по тому же чек-листу.
Что продукт закрывает:
Чего продукт пока не закрывает:

CedrusData Catalog — Iceberg REST для клиентов вне JVM, Web UI и управление пользователями из коробки
По этим признакам нельзя определить универсальный момент, когда Hive Metastore пора менять. Это ориентиры из документации вендоров и практики эксплуатации: они показывают, где стоит проверить настройки и модель партиционирования, но не задают жёсткий предел для метастора.
| Признак | Ориентир или симптом | Источник |
| Партиции на запрос | Один запрос должен обращаться не более чем к 10 000 партиций | Cloudera, тюнинг метастора, документация версии 7.3.1 |
| Партиции на таблицу | После 10 000 партиций операции со всеми партициями, например DROP TABLE, могут падать. Это soft cap | Cloudera Community, «Hive Partitioning — maximum for cluster» |
| Латентность и число соединений | С ростом числа открытых соединений растёт латентность | Cloudera |
| Симптом в production | Socket Timeout при перечислении партиций до того, как запрос попадёт в планировщик. При миллионах партиций растёт риск отказа всего контура | lakeFS |
| Давление на реляционную БД | Удаление партиций у крупных таблиц может потребовать ограничить конкурентность одним запросом в пиковое время | lakeFS |
| Исторический архитектурный корень | При выборке партиций использовалась схема 1+N запросов к БД. Задачу завели в 2013 году и закрыли в Hive 0.12, но нагрузка на реляционную БД при большом числе партиций осталась | ASF Jira HIVE-4051 |
Цифру в 10 000 партиций часто воспринимают как общий предел, но это лишь рекомендация Cloudera по настройке Hive Metastore в конкретной сборке. Она не описывает возможности Iceberg REST-каталогов и не подходит для их сравнения.
Публичных замеров, которые сопоставляли бы задержки разных каталогов в одинаковых условиях, тоже нет. Поэтому утверждать, что REST-каталог быстрее Hive Metastore в несколько раз, пока не на чем.
В таблице сравниваются не конкретные продукты, а способы работы с каталогом. У Hive Metastore есть два разных режима: классический доступ через Thrift и REST API для Iceberg. Их возможности зависят от версии Hive и настроек, поэтому они вынесены в отдельные колонки.
| Критерий | Метастор через Thrift | Метастор с Iceberg REST API, Hive 4.1+ | Iceberg REST-каталоги в общем случае | CedrusData Catalog |
| Legacy-слой | Тяжеловесный, тянет Hadoop-наследие | Тот же процесс и та же БД метаданных, REST поверх них | Легковесный stateless-сервис | Легковесный: Java 21, метаданные в PostgreSQL или SQLite |
| RBAC | Нативного нет, подключается внешний Ranger на уровне базы и таблицы | То же: Ranger, конфигурация описана в документации Hive | Контроль доступа встроен в сервис, полнота зависит от реализации | RBAC, управление пользователями и группами |
| UI управления | Нет | Нет | Зависит от реализации | Web UI и навигатор объектов |
| Обслуживание Iceberg | Нет | Нет | Зависит от реализации: Polaris хранит политики и не исполняет их, Unity Catalog выполняет автоматически | Управление обслуживанием подтверждено, автоматическое обслуживание в плане развития |
| OAuth | Нет, контур Kerberos и SASL | OAuth 2 с внешним Authorization Server с Hive 4.2, а также JWT, simple, none | OAuth2 через внешний oauth2-server-uri; встроенный /v1/oauth/tokens депрекирован | OAuth2 client credentials flow и Bearer-токен |
| Pluggable-архитектура | Нет | Нет | Зависит от реализации | Заявлена |
| Снимок каталога, согласованный по нескольким таблицам | Нет | Нет | Зависит от реализации | Заявлен |
| Мультитабличные транзакции | Нет: в HiveCatalog.java не реализованы | Эндпоинт заявлен в примере /v1/config, реализация не проверена | Часть протокола, входит в набор эндпоинтов по умолчанию | В плане развития, роадмап на август 2026 года |
Time travel для одной таблицы обеспечивает сам формат Iceberg, поэтому он работает и с Hive Metastore. Можно открыть состояние таблицы на конкретный момент времени или по идентификатору снапшота.
Каталог отвечает за согласованный снимок нескольких таблиц. Например, чтобы факт, витрина и справочник читались в состоянии на один и тот же момент. Поэтому фраза «Hive Metastore не поддерживает time travel» неточна: речь здесь идёт о согласованном состоянии набора таблиц, а не об истории отдельной таблицы.
Команды CONVERT TO ICEBERG не существует, хотя она регулярно попадает в технические задания. Для миграции используются три операции: snapshot, migrate и add_files.
CALL catalog.system.snapshot('db.src', 'db.dst')
Команда создаёт Iceberg-таблицу поверх файлов исходной таблицы, не забирая файлы себе. Отсюда два ограничения:
В Trino эта процедура не поддерживается.
CALL catalog.system.migrate('db.sample')
У процедуры есть два явных стоп-фактора:
Расхождение движков по бакетированию особенно опасно. Spark на бакетированной таблице падает, тогда как Trino мигрирует её как небакетированную Iceberg-таблицу. Ошибка Spark видна сразу, а тихая потеря бакетирования проявится позже, например в профиле запросов. Перед миграцией проверьте, каким движком она будет выполняться.
План отката уже предусмотрен. По умолчанию исходная таблица сохраняется под именем table_BACKUP_. Поведение регулируют аргументы drop_backup и backup_table_name. Не нужно писать отдельный механизм отката, достаточно не удалить резервную таблицу раньше времени.
Процедура не проверяет, соответствует ли схема добавляемых файлов схеме Iceberg-таблицы. Добавленные файлы могут быть физически удалены последующими операциями Iceberg. Использовать add_files стоит только тогда, когда migrate и snapshot не подходят.
В Trino часть процедур отключена по умолчанию:
iceberg.register-table-procedure.enabled=true iceberg.add-files-procedure.enabled=true
Оба флага по умолчанию имеют значение false. system.migrate отдельным флагом не закрыта. В Trino add_files вызывается через ALTER TABLE ... EXECUTE, а не через system.add_files. Для аргумента _recursive_director_y значение по умолчанию — fail.
Если процедура «не находится», сначала проверьте флаги, а уже потом ищите ошибку в конфигурации или баг движка.
Смена каталога и перенос данных — разные операции. При переводе таблиц с legacy-каталога на REST переписывать файлы не требуется: меняются только метаданные. Публичных замеров такой миграции нет, поэтому обещать конкретное время выполнения не стоит.
Стоимость миграции в человеко-днях также нельзя вывести из публичных данных. Её оценивают по параметрам конкретного контура:
Публично измеримого порога производительности, после которого Lakehouse обязательно нужно переводить с Hive Metastore на другой каталог, нет. Цифра «не более 10 000 партиций на запрос» — ориентир Cloudera для тюнинга Hive Metastore в документации версии 7.3.1, а не характеристика самого продукта и тем более не универсальная константа для других каталогов.
Таймауты при перечислении партиций могут означать, что метастор пора тюнинговать или что в контуре неудачно выбрана модель партиционирования. Каталог меняют по функциональным причинам: нужны временные креды к хранилищу, атомарные операции над несколькими таблицами, контроль доступа на уровне каталога или клиенты вне JVM.
Нет. Time travel — свойство формата Apache Iceberg. Снапшот таблицы по идентификатору или времени доступен и в том случае, если Iceberg-таблица зарегистрирована в Hive Metastore.
Каталог отвечает за другую возможность: согласованный снимок нескольких таблиц. Он позволяет прочитать набор витрин в состоянии на один момент времени. Hive Metastore не предоставляет именно такую функцию, но это не означает отсутствия time travel у отдельных Iceberg-таблиц.
Iceberg REST Catalog — открытая спецификация HTTP API для операций с каталогом Apache Iceberg: работы с namespace и таблицами, загрузки метаданных, коммита изменений, снапшотов и представлений.
По сравнению с Thrift-путём REST даёт три ключевые возможности:
В REST-режиме — да, начиная с Hive 4.2.0, где появилась поддержка OAuth 2 (HIVE-29020). Документация Hive описывает интеграцию с внешним Authorization Server, например Keycloak.
REST-слой Hive поддерживает четыре метода аутентификации:
В классическом Thrift-контуре OAuth нет: там используются Kerberos и SASL. Поэтому фраза «Hive Metastore не поддерживает OAuth» применима только к Thrift-пути.
Есть три основных риска.
Неподдерживаемые форматы. Процедура migrate завершится с ошибкой, если хотя бы одна партиция использует формат вне Avro, Parquet или ORC. Таблицы с кастомными SerDe придётся не мигрировать, а перезаписывать в поддерживаемый формат.
Бакетирование. Spark не мигрирует бакетированные таблицы. Trino ведёт себя иначе: переносит такую таблицу как небакетированную Iceberg-таблицу. Формально миграция пройдёт, но бакетирование исчезнет, и последствия могут проявиться позже в профиле запросов.
Ожидание команды CONVERT TO ICEBERG. Такой команды нет. Для перехода используют snapshot, migrate или add_files. При migrate исходная таблица по умолчанию сохраняется под именем table_BACKUP_, поэтому откат предусмотрен сразу. Главное — не удалить резервную таблицу раньше времени.
Нет. CedrusData Catalog позиционируется как замена Hive Metastore для Apache Iceberg. Он не реализует Hive Metastore Thrift API и не заменяет Hive в сценариях, не связанных с Iceberg.
На практике это означает:
Каталог выбирают от требований контура, а не от того, насколько новый или модный протокол появился на рынке.
Иногда правильный результат проверки — ничего не менять. Если Hive Metastore нормально обслуживается и справляется с нагрузкой, новый протокол не повод для миграции. Переход нужен, когда появляются задачи, которые метастор не может закрыть своей архитектурой.
Наши специалисты свяжутся с вами в ближайшее время и ответят на все вопросы.

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




