← Назад к вопросам
Как устроена 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
- Оплата за результат: платишь только за сканированные данные