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

Как устроена Athena под капотом?

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

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

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

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

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

Athena — это интерактивный сервис аналитики AWS, работающий поверх S3 и использующий Presto для выполнения SQL-запросов. Вот как она устроена изнутри:

1. Основной стек

Аthena построена на базе трёх компонентов:

User Query (SQL)
    ↓
Presto Query Engine (Распределённый SQL processor)
    ↓
Metadata Store (Glue Catalog) (Таблицы, колонки, типы данных)
    ↓
S3 (Storage Layer) (Parquet, ORC, CSV, JSON)

2. Presto Query Engine

Presto — это распределённый SQL движок, созданный Facebook (теперь Meta):

# Поток обработки запроса в Presto:
1. Parsing        → SELECT * FROM users WHERE age > 18
2. Analysis       → Проверка синтаксиса, валидация таблиц
3. Planning       → Построение плана выполнения
4. Optimization   → Оптимизация плана
5. Execution      → Распределённое выполнение на workers
6. Aggregation    → Объединение результатов

Это не MapReduce, а в-памяти распределённый процессор.

3. Metadata Store (Glue Catalog)

Athena использует AWS Glue для хранения метаданных таблиц:

# Структура в Glue
Database: analytics
├── Table: users
│   ├── Location: s3://my-bucket/data/users/
│   ├── InputFormat: parquet
│   ├── Columns: id, name, age, created_at
│   └── PartitionKeys: year, month

4. Data Scanning & Predicate Pushdown

Ключевая оптимизация для работы с S3:

# Без оптимизации: читает весь файл
SELECT * FROM events WHERE user_id = 123

# С predicate pushdown: читает только нужные данные
# 1. Presto анализирует WHERE условие
# 2. Передаёт фильтры в Parquet reader
# 3. Читает только релевантные row groups

5. Partition Pruning

Для партиционированных таблиц избегает сканирования ненужных партиций:

SELECT * FROM events 
WHERE year = 2024 AND month = 3 AND user_id = 123

# Читает только s3://bucket/data/events/year=2024/month=03/
# Вместо 1TB сканирует ~10GB

6. Execution Model

Coordinator (планирует запрос)
    ↓
Worker Pool (4-64 workers)
├── Worker 1, Worker 2, ...
    ↓
Read from S3 in parallel

7. Caching & Result Storage

# Результаты хранятся в S3
# Кэшируются на основе текста запроса
# Действителен 48 часов

if query_cached and cache_age < 48h:
    return cached_result  # Бесплатно!
else:
    execute_query()  # Платишь за сканированные данные

8. Биллинг

# Платишь за сканированные данные из S3 (за 1MB, минимум 10MB)
# НЕ платишь за результаты

billing = (bytes_scanned / (1024*1024)) * 0.000005  # $5 за 1TB

# Как снизить стоимость:
# 1. Partition pruning
# 2. Используй Parquet (сжатие)
# 3. Predicate pushdown
# 4. Projection (выбирай только нужные колонки)
# 5. Кэширование результатов

Ключевые характеристики

  • Масштабируемость: от МБ до ПБ данных
  • Низкая задержка: результаты за секунды-минуты
  • No ETL: запроси данные прямо в S3
  • SQL стандарт: ANSI SQL
  • Оплата за результат: платишь только за сканированные данные
Как устроена Athena под капотом? | PrepBro