본문 바로가기

소프트웨어-이야기/인프라

(AWS) S3 SELECT - S3 파일에 쿼리 날려서 필요한 데이터만 다운받기

AWS S3 SELECT란?

AWS s3 / glacier에 저장된 데이터에 쿼리를 날려서, 필요한 데이터만 다운받을 수 있게 해주는 기능이다. 2018년 3월 기준, glacier select는 모든 리전에서 사용할 수 있지만, s3 select는 아직 프리뷰 상태이다.
프리뷰버전에서는 CSV와 JSON 포맷만 지원한다. 그리고 압축 포맷으로는 GZIP만 지원한다.

샘플 코드 

import boto3 from s3select import ResponseHandler class PrintingResponseHandler(ResponseHandler): def handle_records(self, record_data): print(record_data.decode('utf-8')) handler = PrintingResponseHandler() s3 = boto3.client('s3') response = s3.select_object_content( Bucket="super-secret-reinvent-stuff", Key="stuff.csv", SelectRequest={ 'ExpressionType': 'SQL', 'Expression': 'SELECT s._1 FROM S3Object AS s'', 'InputSerialization': { 'CompressionType': 'NONE', 'CSV': { 'FileHeaderInfo': 'IGNORE', 'RecordDelimiter': '\n', 'FieldDelimiter': ',', } }, 'OutputSerialization': { 'CSV': { 'RecordDelimiter': '\n', 'FieldDelimiter': ',', } } } ) handler.handle_response(response['Body'])

샘플 코드와 유투브 영상을 보니까, 특정 S3 파일에서 필요한 데이터만 선택해주는 기능인거 같다.

쿼리
GROUP BY, ORDER BY는 지원하지 않는다.
집계용 쿼리는 어디까지 지원하는지는 모르겠다. 우선 COUNT(*)쿼리는 지원한다.

가격 
SCAN, 데이터 조회량 만큼 과금된다고 한다. 

AWS S3 SELECT 장점

AWS S3 SELECT를 사용하면, 속도를 높이고, 비용을 절약할 수 있다. 

예를 들어 스파크로 일주일동안 특정 콘텐츠에 반응한 유저 데이터를 뽑아야한다고 생각해보자. 

그러면 스파크로 일주일치의 클릭로그를 다운받아야한다. 그리고 여기서 특정 콘텐츠를 클릭한 로그만 필터링해야한다. 

이 작업을 하려면, 일주일치의 로그양만큼 메모리를 사용하게 되고, 일주일치의 로그를 파싱하고, 필터링하는 데에도 시간이 많이 걸릴거다. 


그런데 S3 SELECT를 사용하면, 필요한 데이터만 다운받게 된다.  

그러면 서버에서 사용하는 메모리도 줄어들고, 파일을 다운받는 네트워크 비용도 줄어들고, 

로그를 파싱하고, 필터링하는 시간도 줄어들게 될거다. 


그래서 데이터를 처리하는 목적으로 사용되는 LAMDA 서버에서 비용절감 효과가 있을거라고 한다. 

왜냐면 메모리 사용량도 줄어들고, 로직 처리시간도 줄어들기 때문이다.


그래서 AWS LAMDA를 기반으로한 Serverless 서비스에서 S3 SELECT가 유용한 역할을 할거라고 한다. 

Athena, Redshift, EMR 같은 Serverless 서비스에도 S3 SELECT 기능을 지원할 예정인데, 

S3 SELECT를 사용하면, 필요한 파일만 스캐닝하게 되어서 비용과 시간이 절감될거라고 한다. 


참고 자료

(슬라이드쉐어) S3 Select를 통한 빠른 데이터 분석하기 - 트랙2, Community Day 2018 re:Invent 특집