Совместная работа с таблицами с использованием Apache Hive™ Metastore
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
Вы можете сохранять данные из кластера Yandex Data Processing в бакет Yandex Object Storage, используя отдельный кластер Apache Hive™ Metastore для хранения метаданных таблиц. Это позволит затем работать с сохраненными данными другому кластеру Yandex Data Processing, имеющему доступ к бакету и подключенному к тому же кластеру Apache Hive™ Metastore.
Чтобы настроить совместное использование таблиц двумя кластерами Yandex Data Processing с помощью Apache Hive™ Metastore:
- Подключите Yandex Data Processing к Apache Hive™ Metastore.
- Создайте тестовую таблицу.
- Получите данные во втором кластере.
Если созданные ресурсы вам больше не нужны, удалите их.
Если в кластере Yandex Data Processing есть таблицы, которые должны быть доступны в другом кластере Yandex Data Processing, перенесите таблицы в нужный кластер с помощью Apache Hive™ Metastore.
Важно
Если вы хотите настроить политику доступа для бакета и подключаться к нему из кластера Apache Hive™ Metastore, вам потребуется дополнительная настройка инфраструктуры. Подробнее см. в инструкции.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- плата за вычислительные ресурсы кластера Yandex Data Processing и объем хранилища (см. тарифы Yandex Data Processing);
- плата за вычислительные ресурсы кластера Apache Hive™ Metastore (см. тарифы Yandex MetaData Hub);
- плата за хранение данных и операции с данными в бакете (см. тарифы Yandex Object Storage);
- плата за использование NAT-шлюза и исходящий через шлюз трафик (см. тарифы Yandex Virtual Private Cloud).
Перед началом работы
Подготовьте инфраструктуру:
-
Создайте сервисный аккаунт с именем
dataproc-s3-saи назначьте ему ролиdataproc.agentиdataproc.provisioner. -
В Object Storage создайте бакеты и настройте доступ к ним:
- Создайте бакет для исходных данных и предоставьте сервисному аккаунту кластера разрешение
READдля этого бакета. - Создайте бакет для результатов обработки и предоставьте сервисному аккаунту кластера разрешение
READ и WRITEдля этого бакета.
- Создайте бакет для исходных данных и предоставьте сервисному аккаунту кластера разрешение
-
Создайте облачную сеть с именем
dataproc-network. -
В сети
dataproc-networkсоздайте подсеть в любой зоне доступности. -
Настройте NAT-шлюз для созданной подсети.
-
Создайте два кластера Yandex Data Processing с именами
dataproc-sourceиdataproc-target, с любой подходящей конфигурацией хостов и следующими настройками:- Окружение —
PRODUCTION. - Сервисы:
SPARK;YARN.
- Сервисный аккаунт —
dataproc-sa. - Свойства —
spark:spark.sql.hive.metastore.sharedPrefixesсо значениемcom.amazonaws,ru.yandex.cloud. Нужно для выполнения заданий PySpark и для интеграции с Apache Hive™ Metastore. - Имя бакета — бакет, который вы создали для выходных данных.
- Сеть —
dataproc-network.
- Окружение —
-
Если в облачной сети используются группы безопасности, добавьте в группу безопасности кластеров Yandex Data Processing следующее правило для исходящего трафика:
- Диапазон портов —
9083. - Протокол —
Любой(Any). - Источник —
CIDR. - CIDR блоки —
0.0.0.0/0.
- Диапазон портов —
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации dataproc-to-dataproc.tf
.В этом файле описаны:
- сеть;
- подсеть;
- NAT-шлюз и таблица маршрутизации, необходимые для работы Yandex Data Processing;
- группы безопасности, необходимые для кластеров Yandex Data Processing;
- сервисный аккаунт, необходимый для работы кластера Yandex Data Processing;
- сервисный аккаунт, необходимый для создания бакетов в Object Storage;
- бакеты для входных и выходных данных;
- два кластера Yandex Data Processing.
-
Укажите в файле
dataproc-to-dataproc.tf:folder_id— идентификатор облачного каталога, такой же как в настройках провайдера.input-bucket— имя бакета для входных данных.output-bucket— имя бакета для выходных данных.dp_ssh_key— абсолютный путь к публичному ключу для кластеров Yandex Data Processing. Подробнее о подключении к хосту Yandex Data Processing по SSH.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Подключите Yandex Data Processing к Apache Hive™ Metastore
-
Создайте кластер Apache Hive™ Metastore с версией 3.1 в сети
dataproc-network. -
Добавьте в настройки кластеров Yandex Data Processing свойство
spark:spark.hive.metastore.urisсо значениемthrift://<IP-адрес_кластера_Apache Hive™ Metastore>:9083.Чтобы узнать IP-адрес кластера Apache Hive™ Metastore, в консоли управления
выберите сервис Yandex MetaData Hub и на левой панели выберите страницу Metastore-сервер. Для нужного кластера скопируйте значение из колонки IP-адрес.
Создайте тестовую таблицу
В кластере dataproc-source создайте тестовую таблицу countries и загрузите ее в Object Storage:
-
Подготовьте файл скрипта:
-
Создайте локально файл с именем
create-table.pyи скопируйте в него следующий скрипт:create-table.py
from pyspark.sql.types import * from pyspark.sql import SparkSession # Создание Spark-сессии spark = SparkSession.builder \ .appName("create-table") \ .enableHiveSupport() \ .getOrCreate() # Создание схемы данных schema = StructType([StructField('Name', StringType(), True), StructField('Capital', StringType(), True), StructField('Area', IntegerType(), True), StructField('Population', IntegerType(), True)]) # Создание датафрейма df = spark.createDataFrame([('Австралия', 'Канберра', 7686850, 19731984), ('Австрия', 'Вена', 83855, 7700000)], schema) # Запись датафрейма в бакет в виде таблицы countries df.write.mode("overwrite").option("path","s3a://<имя_выходного_бакета>/countries").saveAsTable("countries") -
Укажите в скрипте имя выходного бакета, в который будет сохранен файл с таблицей
countries. -
Создайте в бакете для входных данных папку
scriptsи загрузите в нее файлcreate-table.py.
-
-
Создайте задание PySpark, указав в поле Main python файл путь к файлу скрипта:
s3a://<имя_входного_бакета>/scripts/create-table.py. -
Дождитесь завершения задания и проверьте, что в выходном бакете в папке
countriesпоявился файлpart-00000-....
Теперь данные из созданной таблицы хранятся в бакете Object Storage, а метаинформация о ней — в кластере Apache Hive™ Metastore. Кластер dataproc-source можно удалить.
Получите данные во втором кластере
Загрузите метаинформацию о таблице countries в кластер dataproc-target и убедитесь, что таблица стала доступна в кластере для дальнейшей работы:
-
Подготовьте файл скрипта:
-
Создайте локально файл с именем
obtain-table.pyи скопируйте в него следующий скрипт:obtain-table.py
from pyspark.sql import SparkSession # Создание Spark-сессии spark = SparkSession.builder \ .appName("obtain-table") \ .enableHiveSupport() \ .getOrCreate() spark.catalog.listDatabases() # Получение информации о таблице countries из Apache Hive™ Metastore df = spark.sql("describe extended countries") # Запрос данных из таблицы countries df = spark.sql("select * from countries") # Перенос таблицы в бакет для проверки df.repartition(1).write.csv(path='s3a://<имя_выходного_бакета>/csv', header=True, sep=',') -
Укажите в скрипте имя выходного бакета, в который будет сохранен CSV-файл с таблицей
countries. -
Загрузите файл
obtain-table.pyв бакет для входных данных в папкуscripts.
-
-
Создайте задание PySpark, указав в поле Main python файл путь к файлу скрипта:
s3a://<имя_входного_бакета>/scripts/obtain-table.py. -
Дождитесь выполнения задания и убедитесь, что в выходном бакете появилась папка
csvс таблицей в формате CSV.
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них:
-
Удалите объекты из бакетов.
-
Удалите остальные ресурсы в зависимости от способа их создания:
ВручнуюTerraform-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy -
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
-
Apache® и Apache Hive™