Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Плюсы и минусы AWS Athena
Athena — сервис AWS для анализа данных в S3 без необходимости управлять инфраструктурой. Разберу сильные и слабые стороны.
Плюсы Athena
1. Serverless — нет инфраструктуры
Плюс: не нужно создавать и управлять EC2 инстансами.
# Нужно просто запустить запрос
import boto3
athena = boto3.client('athena', region_name='us-east-1')
response = athena.start_query_execution(
QueryString='SELECT * FROM my_table WHERE year = 2024',
QueryExecutionContext={'Database': 'my_database'},
ResultConfiguration={'OutputLocation': 's3://my-bucket/results/'}
)
query_id = response['QueryExecutionId']
print(f"Query started: {query_id}")
# Результаты в S3 автоматически
2. Дешево для аналитики
Плюс: платишь только за отсканированные данные (~$5 за 1 TB).
Запрос 100 GB → $0.5
Запрос 1 TB → $5
Запрос 10 TB → $50
Нет платежей за простой серверов.
3. Работает с S3 напрямую
Плюс: не нужно загружать данные в БД.
# Данные в S3: s3://bucket/data/year=2024/month=01/data.parquet
# Athena сканирует прямо из S3
query = """
SELECT COUNT(*) FROM my_table
WHERE year = 2024 AND month = 01
"""
# Сканирует только партициям за 2024-01, не весь S3
4. Поддерживает множество форматов
Плюс: CSV, JSON, Parquet, ORC, CloudTrail логи, VPC Flow Logs и т.д.
# Автоматически парсит формат
query = "SELECT * FROM my_csv_table WHERE column = 'value'" # CSV
query = "SELECT * FROM my_json_table" # JSON
query = "SELECT * FROM my_parquet_table" # Parquet (самый эффективный)
5. Интеграция с AWS сервисами
Плюс: работает с CloudTrail, VPC Flow Logs, ALB логами, Glue Catalog и т.д.
# Анализ CloudTrail логов
query = """
SELECT eventname, count(*)
FROM cloudtrail_logs
WHERE eventtime > '2024-03-01'
GROUP BY eventname
"""
# VPC Flow Logs
query = """
SELECT srcaddr, dstaddr, SUM(bytes) as total_bytes
FROM vpc_flow_logs
WHERE action = 'REJECT'
GROUP BY srcaddr, dstaddr
"""
6. Запросы на SQL (стандартный язык)
Плюс: используешь привычный SQL, не нужно учить PySpark или Hive.
# Просто SQL
query = """
SELECT
user_id,
COUNT(*) as events,
AVG(duration) as avg_duration
FROM events
WHERE created_date >= DATE '2024-01-01'
GROUP BY user_id
HAVING COUNT(*) > 10
ORDER BY events DESC
LIMIT 100
"""
7. Партицирование и проекция
Плюс: можешь использовать partition pruning для ускорения.
Данные в S3:
s3://bucket/year=2024/month=01/day=15/data.parquet
s3://bucket/year=2024/month=01/day=16/data.parquet
s3://bucket/year=2024/month=02/day=01/data.parquet
Запрос:
SELECT * WHERE year = 2024 AND month = 01
Аthena сканирует ТОЛЬКО s3://bucket/year=2024/month=01/ — экономит деньги!
8. Быстрые результаты для аналитики
Плюс: для OLAP запросов работает достаточно быстро.
Время выполнения:
- 1-100 GB → несколько секунд
- 100 GB - 1 TB → 10-30 секунд
- > 1 TB → минуты (но всё равно дешевле чем другие сервисы)
Минусы Athena
1. Не подходит для OLTP (real-time queries)
Минус: есть overhead на startup каждого запроса.
# Нужен real-time запрос? → используй PostgreSQL/MySQL
# Нужен аналитический запрос один раз в час? → Athena отлично
# Времена:
# Простой запрос в PostgreSQL: 10 ms
# Простой запрос в Athena: 500-1000 ms (стартап)
# Сложный запрос в PostgreSQL: 5 s
# Сложный запрос в Athena: 10-20 s
2. Холодные старты
Минус: каждый запрос имеет overhead на планирование и оптимизацию.
Время выполнения распределяется:
- Queue time: 100-500 ms (ждем очереди)
- Planning time: 100-200 ms (оптимизация запроса)
- Execution time: 1-30 s (сам запрос)
- Total: 1.2-30+ s даже для быстрых запросов
3. Лимиты по запросам
Минус: сложные запросы могут быть медленными или дорогими.
# ❌ Плохо: JOIN с большими таблицами
query = """
SELECT a.*, b.*, c.*
FROM huge_table_1 a
JOIN huge_table_2 b ON a.id = b.id
JOIN huge_table_3 c ON b.id = c.id
"""
# Может отсканировать 10 TB → $50
# ✅ Хорошо: фильтруй сразу
query = """
SELECT a.id, b.value
FROM huge_table_1 a
WHERE a.year = 2024 -- Фильтруем по партиции
JOIN huge_table_2 b ON a.id = b.id
WHERE b.status = 'active' -- Еще фильруем
"""
4. Нет соединений между запросами
Минус: нельзя обновлять данные, только читать.
# ❌ Не работает (нет UPDATE/DELETE/INSERT)
query = "UPDATE my_table SET status = 'processed'"
# Чтобы обновить данные в S3, нужно:
# 1. Запрос к Athena → результат в S3
# 2. Lambda или Glue → обновить исходные файлы
# 3. Удалить старые файлы в S3
5. Проблемы с большими результатами
Минус: если результат > 10 GB, может быть дорогим и медленным.
# ❌ Плохо: запрос выгружает весь датасет
query = "SELECT * FROM huge_table" # Может быть 1 TB
# ✅ Хорошо: агрегируй данные
query = """
SELECT user_id, COUNT(*) as events
FROM huge_table
GROUP BY user_id
"""
# Результат может быть 1 GB вместо 1 TB
6. Затраты на хранение результатов
Минус: результаты сохраняются в S3, нужно платить за хранение.
Примечание:
- Каждый запрос сохраняет результаты в S3
- 1000 запросов × 1 GB = 1 TB хранилища в S3
- S3 Standard: $0.023/GB/месяц → $23/месяц только на результаты
Решение: удаляй результаты через 30 дней
7. DDL операции медленные
Минус: CREATE/ALTER TABLE, добавление партиций медленнее чем в обычной БД.
# Медленно (нужна инвентаризация S3)
query = "ALTER TABLE my_table ADD PARTITION (year=2024, month=3)"
# Лучше используй Glue Crawler
crawler = boto3.client('glue')
crawler.start_crawler(Name='my-crawler')
# Автоматически обнаружит новые партиции
8. Сложная оптимизация
Минус: для хорошей производительности нужно правильно структурировать данные в S3.
Чтобы Athena была быстрой:
1. Используй Parquet (вместо CSV) → сжимается в 10x
2. Партиционируй по часто фильтруемым колонкам
3. Используй ORC или AVRO для очень больших данных
4. Регулярно вычищай мусор в S3
5. Уделай Column statistics
Это требует инженерных знаний!
Сравнение с альтернативами
| Сервис | Тип | Стартап | Цена | Когда |
|---|---|---|---|---|
| Athena | Serverless SQL | 1-2 s | $5/TB | Аналитика, не real-time |
| Redshift | Data Warehouse | 0 | $0.25/hour | Data Warehouse, частые запросы |
| BigQuery | Serverless SQL | 1-2 s | $6.25/TB | Как Athena, но конкурент |
| RDS PostgreSQL | OLTP | 0 | $10-30/month | Real-time, транзакции |
| EMR + Spark | Big Data | 5-10 m | Высокая | Batch обработка, ML |
Когда использовать Athena
✅ Идеально для:
- Аналитические запросы 1-2 раза в день
- Логи, метрики (CloudTrail, VPC Flow Logs)
- Отчеты от разовых запросов
- Data Lakes в S3
- Запросы < 1 TB в день
❌ Плохо для:
- Real-time приложения (< 1 s)
- Часто повторяющиеся запросы (100+ в день)
- Транзакции (UPDATE, DELETE)
- Интерактивные дашборды с частыми обновлениями
Практический пример
import boto3
import time
athena = boto3.client('athena', region_name='us-east-1')
s3 = boto3.resource('s3')
def run_athena_query(query, database, output_location):
response = athena.start_query_execution(
QueryString=query,
QueryExecutionContext={'Database': database},
ResultConfiguration={'OutputLocation': output_location}
)
query_id = response['QueryExecutionId']
# Ждем завершения
while True:
response = athena.get_query_execution(QueryExecutionId=query_id)
status = response['QueryExecution']['Status']['State']
if status == 'SUCCEEDED':
break
elif status == 'FAILED':
raise Exception(f"Query failed: {response}")
else:
print(f"Status: {status}")
time.sleep(1)
# Получить результаты
result_location = response['QueryExecution']['ResultConfiguration']['OutputLocation']
result_key = result_location.split('s3://')[-1]
bucket, key = result_key.split('/', 1)
# Скачать результаты
obj = s3.Object(bucket, key)
results = obj.get()['Body'].read().decode('utf-8')
return results
# Запуск
query = """
SELECT
DATE(created_at) as date,
COUNT(*) as events,
COUNT(DISTINCT user_id) as users
FROM events
WHERE created_at >= DATE '2024-01-01'
GROUP BY DATE(created_at)
ORDER BY date DESC
"""
results = run_athena_query(
query=query,
database='analytics',
output_location='s3://my-bucket/athena-results/'
)
print(results)
Вывод
Athena — отличный выбор для аналитики больших данных в S3 без управления инфраструктурой. Но не используй её для real-time приложений. Выбирай правильный инструмент для задачи!