Какой у вас опыт работы с AWS Glue и Apache Spark?

«Какой у вас опыт работы с AWS Glue и Apache Spark?» — вопрос из категории Облачные платформы, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я использовал AWS Glue для построения и поддержки ETL-пайплайнов в продакшн-среде. Основные задачи включали:

  • Разработка и оптимизация PySpark-скриптов для обработки больших объемов данных (сотни ГБ в день) из различных источников (S3, JDBC).
  • Настройка и мониторинг Glue Jobs: Подбор оптимальных типов воркеров (G.1X, G.2X), настройка количества исполнителей (NumberOfWorkers) и параллелизма для баланса стоимости и производительности.
  • Работа с Glue Data Catalog: Регистрация таблиц, управление схемами данных и использование crawlers для автоматического обнаружения данных.
  • Интеграция в CI/CD: Автоматизация развертывания скриптов через Terraform и AWS CodePipeline.

Пример скрипта для преобразования данных из CSV в Parquet:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

args = getResolvedOptions(sys.argv, ['JOB_NAME', 'INPUT_PATH', 'OUTPUT_PATH'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

# Чтение данных из S3
input_dyf = glueContext.create_dynamic_frame.from_options(
    connection_type="s3",
    format="csv",
    connection_options={"paths": [args['INPUT_PATH']], "header": True}
)

# Применение преобразований схемы
transformed_dyf = ApplyMapping.apply(
    frame=input_dyf,
    mappings=[("user_id", "string", "user_id", "string"),
              ("timestamp", "string", "event_time", "timestamp")]
)

# Запись в Parquet с партиционированием по дате
glueContext.write_dynamic_frame.from_options(
    frame=transformed_dyf,
    connection_type="s3",
    format="parquet",
    connection_options={
        "path": args['OUTPUT_PATH'],
        "partitionKeys": ["year", "month", "day"]
    }
)

job.commit()

Для отладки и мониторинга активно использовал CloudWatch Logs, метрики Glue и Spark UI.