프로젝트를 진행하던 중 athea로 s3에 적재된 데이터들을(데이터레이크) 쿼리해야하는 일이 생겼다.
사실 boto3로 athena를 처리하지만, 실제로 콘솔에서도 익숙해지기 위해 athena를 파볼예정!
로그를 적재하는 목적으로 사용할 수도 있다 -> 다음엔 웹로그를 적재해봐야지!
DB에서 로그를 S3에서 동일하게 가져올때 제약이 있다.
로그를 가져올때 조건을 거는부분, 많은 양의 압축된 로그파일을 로드하고, 압축을 푸는데 시간이 많이 소요.
이러한 문제를 아테나를 통해 해결할 수 있다.
AWS Athena란?
s3에서 표준 SQL을 사용하여 데이터를 쉽게 바로 분석할 수 있는 대화형쿼리서비스
아테나에 데이터가 저장되어 있는 S3를 설정해두고, 테이블 생성후, 쿼리를 실행하면 -> 데이터를 가져올 수 있다
아테나를 쓰면 뭐가 좋은가?
- 파일 로드, 파일압축, 파일압축풀기 이런 과정이 필요없다
- SQL로 제약조건을 걸어 원하는 데이터만 가져올 수 있다
- 서버리스 서비스이기 떄문에 따로 인프라를 관리할 필요가 없다
- 실행한 쿼리에 대해서만 비용을 지불한다. 실행한 쿼리가 스캔한 데이터의 용량만큼만 비용청구.
테이블 생성을 위한 CREATE, 파티셔닝을 위한 ALTER 같은 DDL문, 실패한쿼리문은 비용청구X
어떻게하면 효율적으로 쓸 수 있는가?
- 데이터압축과 파티셔닝을 하게 되면 스캔하는 데이터의 양을 제한할 수 있다->비용절감
데이터파티셔닝
S3에 쌓인 많은 로그를 조회할떄 성능을 향상시키고, 비용을 절감하는 방법
파티셔닝을 하지 않으면 아테나 쿼리는 모든 데이터를 스캔한다.
파티셔닝을 통해 쿼리당 스캔하는 데이터의 양을 줄일 수 있다. 보통 날짜기준으로 쿼리가 스캔하는 범위를 제한.
어떻게 파티셔닝을 하는가? S3 파일구조에서 파티션컬럼을 매핑을 하는 것이다.
1) 데이터파티셔닝을 위한 자동매핑 구조일 경우?
S3://your-bucket/pathToTable/<PARTITION_COLUMN_NAME>=<VALUE>/<PARTITION_COLUMN_NAME>=<VALUE>/
즉 , 아래와 같은 구조로 되어 있다면 year, month,day 등이 파티션컬럼이 된다.
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
2) S3 파일구조가 자동매핑구조가 아닐 경우?
예를 들어 이러한 구조라면 ALTER문을 통해 수동으로 파티셔닝을 해줘야한다.
s3://my_bucket/log-data/20180307/
파티션컬럼을 직접 찾을수 없기 때문에 아래와 같은 ALTER문을 추가로 진행해야한다.
ALTER TABLE <tablename> ADD PARTITION
(PARTITION_COLUMN_NAME = <VALUE>, PARTITION_COLUMN2_NAME = <VALUE>)
LOCATION ‘s3://yourBucket/pathToTable/YYYY/MM/DD/
예를 들어 이렇게 ALTER문을 수행한다.
ALTER TABLE mylogs ADD PARTITION (dt='20190307') location 's3://my_bucket/log-data/20180307/'
그러면 이제 저 일자별로 로그를 모으기 떄문에 매일 새로운 폴더가 생긴다. 그리고 그떄마다 파티션을 등록해줘야한다.
파티셔닝이 되면 아래의 쿼리로 파티션들을 확인하고, 쿼리조건을 가지고 쿼리할 수 있다.
SHOW PARTITIONS <table_name>
SELECT * FROM mylogs WHERE dt = '20190307' LIMIT 100
데이터압축
아테나는 CSV,TSV,JSON, 사용자 지정 구분기호 등 다양한 데이터형식 지원
SerDe라이브러리 : 테이블생성시 아테나가 사용되는 형식과 데이터 구문 분석방법을 알 수 있는 라이브러리
아테나 사용시 데이터를 압축해서 사용하는 것을 권장한다.
파일 용량이 작으면 네트워크 비용 감소, 쿼리속도 향상, 스캔되는 데이터의 크기 감소 => 비용절감
지원되는 압축형식 >> AWS 공식문서 보러가기
- snappy : Parquet 데이터 스토리지 형식의 파일에 대한 기본압축형식
- zlip : ORC 데이터스토리지 형식의 파일에 대한 기본압축형식
- gzip : 데이터파일에 .gz확장프로그램 사용, 디폴트 값
테이블 생성시 압축파일 형식 지정 (디폴트 : gzip)
아네타는 PrestoDB를 사용
참고
https://www.theteams.kr/teams/7937/post/70685
참고
https://americanopeople.tistory.com/131
'🌴 DevOps > Cloud' 카테고리의 다른 글
🎯[Lambda] 람다의 장점과 단점 | 콜드스타트와 동시성제한 (0) | 2021.08.09 |
---|---|
[EMR] EMR이란? Elastic MapReduce 마스터노드 접속해보기 (1) | 2021.08.08 |
[Athena] parquet형식 S3 데이터 가져오기 (0) | 2021.06.25 |
[DynamoDB] DynamoDB란? 파티션키와 정렬키 (1) | 2021.06.15 |
[AWS] 람다에서 Python 패키지 사용하기 | Layer(계층)란? (0) | 2021.06.10 |
[VPC] 서브넷 추가시, IP주소가 부족하다면? | VPC에 보조CIDR 연결 (0) | 2021.05.13 |