Решение проблем в Apache Hive™ Metastore
В этом разделе описаны проблемы, возникающие в сервисе, а также способы их устранения.
- Ошибка при создании базы данных
- Отсутствие прав при подключении сервисного аккаунта к кластеру
- Блокировка таблиц Hive
Ошибка при создании базы данных в Apache Hive™ Metastore
Ошибка возникает, если создавать БД с помощью следующего запроса:
CREATE DATABASE IF NOT EXISTS <имя_БД>;
Решение
Apache Hive™ Metastore не позволяет создать базу данных или таблицу в Hive — они хранятся в бакете Yandex Object Storage, который привязан к кластеру Yandex Data Processing. Чтобы создать БД, выполните запрос:
CREATE DATABASE IF NOT EXISTS <имя_БД> LOCATION <местоположение_БД>;
В параметре LOCATION укажите путь до бакета и базы данных в нем в формате: s3a://<имя_бакета>/<имя_папки>/<имя_БД>. Указывать папку необязательно, но в нее объекты загружаются быстрее, чем в корень бакета.
Отсутствие прав при подключении сервисного аккаунта к кластеру
Текст ошибки:
ERROR: rpc error: code = PermissionDenied desc = you do not have permission to access the requested service account or service account does not exist
Ошибка возникает, если вы создаете или изменяете кластер и привязываете к нему сервисный аккаунт.
Решение
Назначьте вашему аккаунту в Yandex Cloud роль iam.serviceAccounts.user или выше.
Apache® и Apache Hive™
Блокировка таблиц Hive
При работе с Apache Hive™ Metastore может произойти блокировка таблицы Hive, например, если прервать работу скрипта.
Для снятия блокировки можно использовать:
- thrift-интерфейс Hive Metastore;
- python-скрипт, который запускается в той же виртуальной частной сети (VPC), что и Apache Hive™ Metastore.
Снятие блокировки с помощью python-скрипта
Важно
Apache Hive™ Metastore доступен только по внутреннему IP-адресу в виртуальной частной сети (VPC) и не имеет публичного DNS-имени. Это обеспечивает дополнительную безопасность, но требует, чтобы все сервисы, подключающиеся к Apache Hive™ Metastore, находились в той же VPC или имели настроенный сетевой доступ.
Чтобы снять блокировку:
-
Подключитесь к виртуальной машине или сервису, который находится в той же VPC, что и Apache Hive™ Metastore.
-
Установите зависимости:
pip install click pip install hive-metastore-client -
Создайте файл с именем
unlock.pyи скопируйте в него скрипт:unlock.py
import click from hive_metastore_client import HiveMetastoreClient from thrift_files.libraries.thrift_hive_metastore_client.ttypes import ShowLocksRequest, UnlockRequest class MetastoreClient: def __init__(self, metastore_hostname, metastore_port): self.metastore_hostname = metastore_hostname self.metastore_port = metastore_port self.metastore_client = HiveMetastoreClient(metastore_hostname, metastore_port) def show_locks(self, db_name, table): with self.metastore_client as metastore_client: req = ShowLocksRequest(dbname=db_name, tablename=table) return metastore_client.show_locks(req) def unlock(self, lock_id): with self.metastore_client as metastore_client: req = UnlockRequest(lockid=lock_id) return metastore_client.unlock(req) @click.group() @click.option( "--host", required=True, help="Metastore host", ) @click.option( "--port", type=int, help="Metastore port", default=9083, ) @click.pass_context def cli(ctx, host: str, port: int): """Hive Metastore CLI.""" ctx.obj = MetastoreClient(host, port) @cli.command("show-locks") @click.argument("db_name", required=True) @click.argument("table", required=True) @click.pass_obj def show_locks(client: MetastoreClient, db_name, table): """Show locks for table.""" result = client.show_locks(db_name, table) click.echo(result) @cli.command("unlock") @click.argument("lock_id", required=True, type=int) @click.pass_obj def unlock(client: MetastoreClient, lock_id): """Unlock by lock id.""" result = client.unlock(lock_id) click.echo(result) if __name__ == "__main__": cli() -
Чтобы посмотреть список блокировок, запустите скрипт:
python unlock.py --host <metastore-host> show-locks <db-name> <table-name>Где:
-
<metastore-host>— внутренний IP-адрес Apache Hive™ Metastore.Чтобы узнать IP-адрес:
- Перейдите на страницу каталога ресурсов
. - Перейдите в сервис Yandex MetaData Hub.
- На панели слева выберите
Metastore-сервер.
- Перейдите на страницу каталога ресурсов
-
<db-name>— имя базы данных. -
<table-name>— имя таблицы.
-
-
Чтобы снять блокировку, запустите скрипт:
python unlock.py --host <metastore-host> unlock <lock-id>Где:
<metastore-host>— внутренний IP-адрес Apache Hive™ Metastore.<lock-id>— идентификатор блокировки.