Athena는 표준 SQL을 사용해 S3에 저장된 데이터를 간편하게 분석할 수 있는 대화식 쿼리 서비스로, 서버리스여서 관리할 인프라가 없으며 실행한 쿼리에 대해서만 비용을 지불하면 된다.
아테나는 실행한 쿼리가 스캔한 데이터의 용량 만큼 비용이 청구된다. 그렇기 때문에 데이터 압축과 파티셔닝을 하게 되면 스캔하는 데이터의 양을 제한해 비용을 절감할 수 있다.
→ 이 때, 아테나를 사용하기 위한 테이블 생성(CREATE)이나 파티셔닝을 위한 테이블 수정(UPDATE)과 같은 DDL 문과 실패한 쿼리문에 대한 비용은 청구되지 않는다.
아테나는 자동으로 확장되어 쿼리를 병렬로 실행하기 때문에 데이터 세트가 크고 쿼리가 복잡해도 결과를 빠르게 얻을 수 있다.
파티셔닝은 보통 날짜를 기준으로 한다. 즉, 날짜를 기준으로 쿼리가 스캔하는 범위를 제한할 수 있다.
파티셔닝 방법은 자동 매핑과 수동 매핑의 2가지가 있는데, 아직 로그가 S3에 쌓여 있지 않다면 자동 매핑 구조에 맞게 데이터를 적재하면 조금 더 편리하게 스캔할 수 있다.
버킷 구조
S3://your-bucket/pathToTable/<PARTITION_COLUMN_NAME>=<VALUE>/<PARTITION_COLUMN_NAME>=<VALUE>/
S3://my-bucket/log-data/year=2019/month=3/day=7
or
S3://my-bucket/log-data/dt=20190307/
테이블 생성
자동 매핑을 하고 난 다음, 테이블 생성시에는 파티션 컬럼을 설정해 주어야 한다.
CREATE TABLE mylogs( ... )
PARTITIONED BY
(year int, month int, day int);
이렇게 테이블을 생성한 뒤에 자동으로 파티션을 지정할 수 있도록 아래의 명령을 실행한다.
MSCK REPAIR TABLE mylogs;
위 명령어까지 실행하고 나면 자동으로 매핑이 이루어진다.
수동 매핑을 하게 되는 경우는 파일 구조에 파티션 컬럼이 존재하지 않는 경우인데, 이 때는 테이블 생성 후 ALTER 문을 이용해 수동 매핑을 해주어야 한다.
만약 아래와 같은 S3 버킷 파일 구조를 갖고 있다고 하자.
S3://my_bucket/log-data/20211227/
일단 테이블을 생성한다.
CREATE TABLE mylogs (...)
PARTITIONED BY (dt string);
그 다음 일자별로 파티션을 등록한다.
ALTER TABLE mylogs
ADD PARTITION (dt = '20211227')
location 'S3://my_bucket/log-data/20211227'
매핑이 끝났으면 데이터를 조회한다.
SHOW PARTITIONS <table_name>;
SELECT * FROM mylogs
WHERE dt = '20211227'
LIMIT 100;
앞서 실행한 쿼리가 스캔하는 데이터의 용량에 주의할 필요가 있다고 했는데, 그 이유는 해당 용량만큼 비용이 청구되기 때문이다.
아테나가 지원하는 데이터 형식은 CSV, TSV, JSON 등이 있다. 만약 파일 확장자가 없다면 아테나는 데이터를 압축되지 않은 일반 텍스트로 처리하기 때문에 주의해야 한다.
데이터가 압축된 경우 파일 이름에 ‘gz’(GZIP 형식의 확장자명)와 같은 압축 확장명이 포함되어 있는지 확인할 필요가 있다. 지원되는 압축 형식은 ‘GZIP’, ‘SNAPPY’ 등이 있으며 테이블을 생성할 때 압축 파일 형식을 지정해 주어야 한다(형식 생략시 기본은 GZIP이다).
CREATE TABLE mylogs (...)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
또한, 데이터 구문 분석 방법을 알 수 있도록 아테나에서 “SerDe(Serializer/Deserializer)” 라이브러리를 지원한다.
CREATE DATABASE test_db;
CREATE EXTERNAL TABLE mylogs (id int, type string, status int, created_at timestamp)
PARTITIONED BY (dt string) -- 날짜 컬럼 기준으로 데이터 파티셔닝
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION "s3://my_bucket/log-data/";
SELECT id, type
FROM mylogs
WHERE dt = '20211227';
참고로, 아테나가 사용하는 DB는 PrestoDB라고 한다.
참고
1) 데이터 형식: https://aws.amazon.com/ko/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/
2) SerDe: https://docs.aws.amazon.com/ko_kr/athena/latest/ug/serde-about.html