AWS 서비스 정리 | Athena

Jihun Kim·2022년 1월 26일
0

aws

목록 보기
13/16
post-thumbnail
post-custom-banner

Athena는 표준 SQL을 사용해 S3에 저장된 데이터를 간편하게 분석할 수 있는 대화식 쿼리 서비스로, 서버리스여서 관리할 인프라가 없으며 실행한 쿼리에 대해서만 비용을 지불하면 된다.

  • 아테나는 실행한 쿼리가 스캔한 데이터의 용량 만큼 비용이 청구된다. 그렇기 때문에 데이터 압축과 파티셔닝을 하게 되면 스캔하는 데이터의 양을 제한해 비용을 절감할 수 있다.

    → 이 때, 아테나를 사용하기 위한 테이블 생성(CREATE)이나 파티셔닝을 위한 테이블 수정(UPDATE)과 같은 DDL 문과 실패한 쿼리문에 대한 비용은 청구되지 않는다.

  • 아테나는 자동으로 확장되어 쿼리를 병렬로 실행하기 때문에 데이터 세트가 크고 쿼리가 복잡해도 결과를 빠르게 얻을 수 있다.



Athena 성능 향상을 위한 방법

1. 데이터 파티셔닝

파티셔닝은 보통 날짜를 기준으로 한다. 즉, 날짜를 기준으로 쿼리가 스캔하는 범위를 제한할 수 있다.

파티셔닝 방법은 자동 매핑과 수동 매핑의 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'


데이터 조회

매핑이 끝났으면 데이터를 조회한다.

  1. 현재까지 생성된 파티션들을 확인할 수 있다.
SHOW PARTITIONS <table_name>;
  1. 데이터 조회
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)” 라이브러리를 지원한다.



사용예시

  1. 데이터 베이스 생성
CREATE DATABASE test_db;
  1. 테이블 생성
  • ‘JsonSerDe’는 SerDe에 JSON 데이터 형식을 지정한 것이다.
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/";
  1. 데이터 파티셔닝
  • 수동 혹은 자동 매핑
  1. 데이터 조회
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

https://www.theteams.kr/teams/7937/post/70685

profile
쿄쿄
post-custom-banner

0개의 댓글