점점 커지는 RDB Table, S3로 귀양 보내고 Athena로 불러오기 - feat. Optimization with Spark Bucketing
두줄요약
MySQL 이력 데이터를 S3·Athena 구조로 옮기며 발생한 객체 호출 비용 문제를 분석했습니다. user id 버케팅과 일별 파티션으로 Athena 비용을 약 700배 줄였습니다.
문제 상황
- 마이데이터 이벤트 로그 누적으로 인한 MySQL 테이블 크기와 저장 비용 증가
- 사용자별 1년치 데이터를 Athena로 조회하면서 광범위한 S3 Object 스캔과 호출 비용 발생
구조와 흐름
- MySQL 직접 조회 구조에서 Kafka 이벤트 발행, Spark 적재, S3 Parquet 저장, Athena 조회 구조로 전환
- 날짜·시간 파티션을 일별 파티션으로 변경하고 user id 기반 버케팅 적용
- Athena CTAS로 Spark 버케팅 형식 호환 문제를 우회하는 임시 테이블·파티션 교체 절차 구성
선택 이유
- 저렴한 S3 저장소 활용과 Athena의 서비스 조회 안정성 고려
- 특정 user id 조회 패턴과 높은 카디널리티에 적합한 user id 버케팅 키 선택
성능/운영 포인트
- 버켓 키와 버킷 수 기반 repartition으로 Spark Executor별 중복 파일 생성을 억제
- CloudTrail 로그를 Athena로 조회해 S3 GetObject 호출 수 확인
- 버케팅·일별 파티션 적용 후 Athena 호출 비용 약 700배 절감




