← Назад к вопросам

Как работает Athena?

2.4 Senior🔥 61 комментариев
#DevOps и инфраструктура#Базы данных (SQL)

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает Athena

Athena (Amazon Athena) — это сервис AWS, который позволяет запрашивать данные, хранящиеся в S3, используя SQL без необходимости управления инфраструктурой. Это мощный инструмент для аналитики данных озер (data lakes).

Архитектура Athena

Athena строится на трёх китах:

Пользователь
    ↓
Запрос SQL
    ↓
Athena (обрабатывает запрос)
    ↓
Presto/Trino (распределённый движок запросов)
    ↓
S3 (сканирует файлы)
    ↓
Результат (сохранён в S3)

Как Athena обрабатывает запрос

Шаг 1: Парсинг и планирование

# Пользователь отправляет SQL запрос
SELECT COUNT(*) as total_users
FROM s3://my-bucket/users/
WHERE age > 25;

# Athena:
# 1. Парсит SQL (валидация синтаксиса)
# 2. Строит план выполнения (query plan)
# 3. Определяет, какие файлы нужно прочитать из S3

Шаг 2: Оптимизация

# Athena оптимизирует запрос:
# - Pushdown predicate: фильтр где возможно на уровне файла
# - Partition pruning: пропускает ненужные партиции
# - Column pruning: читает только нужные колонны

# Без оптимизации: читаем весь файл
# С оптимизацией: читаем только нужные данные

Шаг 3: Распределённое выполнение

# Presto распределяет работу между workers:
Worker 1: Обрабатывает файл 1
Worker 2: Обрабатывает файл 2
Worker 3: Обрабатывает файл 3
...
         ↓
      Объединение результатов

Шаг 4: Кэширование и результаты

# Результаты сохраняются в S3 (query results location)
# Можно кэшировать результаты для повторных запросов

Поддерживаемые форматы данных

# Athena работает со множеством форматов:

# 1. CSV
SELECT * FROM s3://bucket/data/
WHERE __presto_view = 'csv'

# 2. JSON (новые строки разделены)
{"user_id": 1, "name": "Alice"}
{"user_id": 2, "name": "Bob"}

# 3. Parquet (колончатый, эффективный)
# Рекомендуется для аналитики

# 4. ORC (оптимизированный колончатый)

# 5. Avro (схема в файле)

# 6. Regex и другие

Стоимость и оптимизация

# ❌ Дорого:
SELECT * FROM s3://bucket/data/  # Сканирует всё

# ✅ Дешево:
SELECT user_id, name
FROM s3://bucket/data/
WHERE year = 2024 AND month = 3  # Partition pruning

# Стоимость: $6.25 за 1 TB отсканированных данных
# Минимум: $0.02 за запрос

Интеграция с Python

import boto3
import pandas as pd
from awswrangler import athena

# Способ 1: Прямой SQL запрос
athena_client = boto3.client('athena', region_name='us-east-1')

response = athena_client.start_query_execution(
    QueryString='SELECT * FROM my_table WHERE age > 25',
    QueryExecutionContext={'Database': 'my_database'},
    ResultConfiguration={'OutputLocation': 's3://my-results/'}
)

query_id = response['QueryExecutionId']

# Способ 2: AWS Wrangler (удобнее)
df = athena.read_sql_table(
    table='users',
    database='my_database',
    s3_output='s3://my-results/'
)

print(df.head())

# Способ 3: Дождаться выполнения
while True:
    result = athena_client.get_query_execution(QueryExecutionId=query_id)
    status = result['QueryExecution']['Status']['State']
    if status in ['SUCCEEDED', 'FAILED', 'CANCELLED']:
        break
    print(f"Status: {status}")
    time.sleep(1)

Партиции для оптимизации

# Определение партиций при создании таблицы
CREATE EXTERNAL TABLE users (
    user_id INT,
    name STRING,
    email STRING
)
PARTITIONED BY (year INT, month INT)
STORED AS PARQUET
LOCATION 's3://bucket/users/';

-- Добавление партиций
ALTER TABLE users ADD IF NOT EXISTS
  PARTITION (year=2024, month=1) 
  LOCATION 's3://bucket/users/year=2024/month=1/';

-- Запрос использует только нужную партицию
SELECT * FROM users WHERE year=2024 AND month=3;

Преимущества и ограничения

Преимущества:

  • Нет управления инфраструктурой (serverless)
  • Простая интеграция с S3
  • Стандартный SQL (Presto)
  • Платить только за отсканированные данные
  • Интеграция с AWS Glue Data Catalog

Ограничения:

  • Не для real-time (запросы 1-5 сек минимум)
  • Сложные JOIN-ы медленнее
  • Нет транзакций
  • Лучше для read-only аналитики

Альтернативы

# Когда Athena хорош: Аналитика больших озер данных
# Когда использовать что-то другое:

# - Redshift: когда нужна скорость (OLAP хранилище)
# - BigQuery: если работаешь с Google Cloud
# - Spark/Databricks: для сложной обработки
# - PostgreSQL: для OLTP (operational queries)

Athena идеален для аналитики данных, хранящихся в S3, когда не нужна постоянно работающая инфраструктура.