Работа с Yandex Object Storage из PySpark-задания без использования Hive
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
В бакетах Yandex Object Storage можно хранить как файлы, необходимые для выполнения заданий в кластере Yandex Managed Service for Apache Spark™, так и результаты выполнения заданий.
Кластеры Yandex Managed Service for Apache Spark™ уже сконфигурированы для работы с S3-хранилищами. Чтобы использовать бакет Object Storage в PySpark-задании:
- Предоставьте сервисному аккаунту кластера Yandex Managed Service for Apache Spark™ разрешение на доступ к бакету Object Storage.
- Укажите путь к каталогу в бакете Object Storage в аргументах задания.
В этом руководстве показан пример прямой работы с данными в бакете Object Storage из PySpark-задания без использования Hive. Этот подход имеет следующие ограничения:
- доступ к данным возможен только по путям в Object Storage, но не по именам таблиц;
- метаданные о таблицах не создаются и не сохраняются.
Примечание
Для того чтобы обращаться к данным по имени таблицы и хранить метаданные таблиц, используйте локальный или глобальный каталог Hive:
- Локальный каталог — для работы с данными и метаданными в пределах одного кластера.
- Глобальный каталог (кластер Apache Hive™ Metastore) — для работы с общими метаданными таблиц из нескольких кластеров Yandex Managed Service for Apache Spark™.
Чтобы реализовать описанный пример:
- Подготовьте инфраструктуру.
- Подготовьте файл с данными.
- Подготовьте PySpark-задание.
- Проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Необходимые платные ресурсы
- Кластер Managed Service for Apache Spark™: выделенные хостам вычислительные ресурсы (тарифы Managed Service for Apache Spark™).
- Бакеты Object Storage: использование хранилища и выполнение операций с данными (тарифы Object Storage).
- Сервис Yandex Cloud Logging: объем записываемых данных и время их хранения (тарифы Cloud Logging).
Подготовьте инфраструктуру
-
Создайте сервисный аккаунт
spark-agentдля кластера Yandex Managed Service for Apache Spark™ с ролью managed-spark.integrationProvider — чтобы кластер Yandex Managed Service for Apache Spark™ мог взаимодействовать с другими ресурсами. -
<бакет_для_исходного_кода_PySpark_задания>.<бакет_для_данных_PySpark_задания>.
-
Предоставьте разрешения для сервисного аккаунта
spark-agentна созданные бакеты:<бакет_для_исходного_кода_PySpark_задания>— разрешениеREAD.<бакет_для_данных_PySpark_задания>— разрешениеREAD и WRITE.
-
Создайте облачную сеть с именем
spark-network.Вместе с ней автоматически будут созданы три подсети в разных зонах доступности.
-
Создайте кластер Yandex Managed Service for Apache Spark™ с параметрами:
- Сервисный аккаунт —
spark-agent. - Сеть —
spark-network. - Подсеть —
spark-network-kz1-a.
- Сервисный аккаунт —
Подготовьте файл с данными
-
Создайте локально файл с именем
input.csvи скопируйте в него скрипт:id,value 1,10 2,20 3,30 4,40 5,50 -
Создайте в бакете
<бакет_для_данных_PySpark_задания>папкуinputи загрузите в нее файлinput.csv.
Подготовьте PySpark-задание
Для PySpark-задания используется Python-скрипт, который:
- считывает CSV-файл из бакета Object Storage;
- регистрирует DataFrame как временное представление Spark SQL;
- выполняет SQL-запрос;
- сохраняет результат в бакете Object Storage в формате Parquet.
Подготовьте файл скрипта:
-
Создайте локально файл с именем
job_process_data.pyи скопируйте в него скрипт:job_process_data.py
import sys from pyspark.sql import SparkSession def main(): if len(sys.argv) != 3: print( "Usage: job_process_data <input_path> <output_path>", file=sys.stderr ) sys.exit(-1) input_path = sys.argv[1] output_path = sys.argv[2] spark = ( SparkSession.builder .appName("object-storage-example") .config("spark.executor.instances", 1) .getOrCreate() ) df = spark.read.load( input_path, format="csv", header=True, inferSchema=True ) df.createOrReplaceTempView("source_data") result_df = spark.sql(""" SELECT id, value FROM source_data WHERE value >= 30 """) result_df.write.mode("overwrite").save( output_path, format="parquet" ) spark.stop() if __name__ == "__main__": main() -
Создайте в бакете
<бакет_для_исходного_кода_PySpark_задания>папкуscriptsи загрузите в нее файлjob_process_data.py. -
Создайте задание с параметрами:
- Тип задания — PySpark.
- Main python файл –
s3a://<бакет_для_исходного_кода_PySpark_задания>/scripts/job_process_data.py. - Аргументы:
s3a://<бакет_для_данных_PySpark_задания>/input/input.csv.s3a://<бакет_для_данных_PySpark_задания>/output.
Проверьте результат
- В консоли управления
выберите каталог. - Перейдите в сервис Managed Service for Apache Spark.
- Нажмите на имя нужного кластера и выберите вкладку Задания.
- Дождитесь, когда созданное PySpark-задание перейдет в статус Done.
- Убедитесь, что в бакете
<бакет_для_данных_PySpark_задания>в папкеoutputпоявились файлы*.parquet. Результат обработки данных доступен другим Spark-заданиям по путиs3a://<бакет_для_данных_PySpark_задания>/output.
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы не платить за них: