← Назад к вопросам
Как работает 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, когда не нужна постоянно работающая инфраструктура.