본문 바로가기
🌴 DevOps/Cloud

⚡[Athena] S3에 저장된 데이터활용하기 | 데이터파티셔닝과 압축

by 카프리썬_ 2021. 6. 17.
728x90
728x90

프로젝트를 진행하던 중 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

 

AWS Athena를 사용해서 S3 데이터 조회해보자 by 번개장터

안녕하세요. 저는 번개장터 백앤드 엔지니어 이예진이라고 합니다. 이번에 번개장터의 클릭 로그 시스템을 개선하면서 사용한 AWS Athena를 소개하고 사용하는 방법을 공유하고자 글을 쓰게 되었

www.theteams.kr

참고

https://americanopeople.tistory.com/131

 

[AWS]Athena 사용 팁

AWS Athena란? AWS Athena는 S3에 저장된 파일에 쿼리를 날리면, 데이터를 가져올 수 있게 해주는 AWS 서비스이다. 구글의 빅쿼리랑 비슷한 서비스이다. AWS Athena를 왜 써야할까? 인프라를 관리하지 않아

americanopeople.tistory.com

 

728x90
반응형