S3 성능 최적화 하는 법 (S3 파티셔닝)

2025. 1. 5. 23:43Cloud

728x90
반응형

S3를 데이터 저장소로 사용할 때, 성능 최적화 하는 법을 알아보겠습니다.

 

amazon s3

1. 개요

Amazon S3는 실제로 사용할 땐 디렉토리 구조로 보이지만, 내부적으로는 파일명 prefix 기반으로 해싱하여 데이터를 물리적인 디스크에 분산 저장하는 것으로 알려져 있습니다. 이를 통해 고성능과 대규모 확장성을 가능하게 합니다. 하지만 잘못된 데이터 적재는 메타데이터 오버헤드 또는 병목을 유발할 수 있습니다.

 

2. 예제로 보는 파티셔닝

예제 1)

 

 

City/Paris.txt
City/London.txt
City/NewYork.txt
City/Tokyo.txt
City/Seoul.txt

S3 버킷의 내부 파일의 구조가 위와 같이 설계된다면, 이 파일들을 같은 파티션에 저장될 가능성이 높습니다. 이 경우, City를 해시로 하는 특정 파티션에 요청이 집중되어 성능 병목이 발생할 수 있습니다.

S3는 일반적으로 적은 수의 객체에 대해 초당 5,000건 이상의 연속 요청을 받게되면 503 에러를 응답으로 줄 수 있다고 합니다. 이러한 문제는 접두사(prefix)를 다양화하여 해결할 수 있습니다.

예를 들어, S3 버킷에서 접두사 10개를 생성하여 병렬로 읽기 요청을 분산하면, 읽기 성능을 초당 50,000건의 요청으로 확장할 수 있습니다. 마찬가지로, 여러 접두사에 데이터를 나눠 쓰면 쓰기 작업의 성능도 확장할 수 있습니다.

예제 2)

France/Paris.txt
UK/London.txt
USA/NewYork.txt
Japan/Tokyo.txt
Korea/Seoul.txt

S3 버킷의 내부 파일의 구조가 위와 같이 설계된다면, 이 파일들을 다른 파티션에 저장될 가능성이 높습니다.
위 경우에는 문제가 없지만, 모든 나라 이름을 쓴다거나 날짜를 prefix로 사용하는 경우 등에서는 다수의 요청이 들어오는 경우, 메타데이터 오버헤드가 발생하여 성능이 저하될 수 있습니다.

예제 3)

Europe/Paris.txt
Europe/London.txt
NorthAmerica/NewYork.txt
Asia/Tokyo.txt
Asia/Seoul.txt


접두사를 다양화하여 데이터를 여러 파티션에 고르게 분산시켰습니다.

이와 같은 설계는 메타데이터 검색 및 파일 탐색 성능을 크게 향상시키며, 대규모 데이터 처리 시 병목 현상을 방지합니다.

 

3. 좋은 Prefix 설계의 조건

- 고르게 분산:
접두사를 기준으로 데이터가 여러 파티션에 고르게 저장될 수 있도록 설계해야 합니다.
예: 날짜, 대륙, 국가, 무작위 문자열을 활용한 분산.

- 논리적인 데이터 그룹화:
데이터를 효과적으로 검색할 수 있도록 논리적인 구조를 반영해야 합니다.
예: 2023/01/Europe/와 같은 시간 및 지역 기반의 계층 구조.

- 너무 세밀하거나 단일화되지 않도록:
세밀한 파티셔닝은 메타데이터 오버헤드를 증가시키고, 단일화된 파티셔닝은 병목을 유발합니다.
쿼리에 자주 사용되고, 카디널리티가 낮은 값이 좋은 prefix입니다.

 


4. 데이터 사용 서비스에서의 S3 구조 설계 중요성

S3 데이터를 사용하는 서비스에서는 S3 구조를 효율적으로 설계하는 것이 중요합니다. 예를 들어, AWS Glue와 Amazon Athena와 같은 서비스는 데이터의 파티셔닝과 구조에 따라 처리 속도와 쿼리 성능이 크게 달라질 수 있습니다.

aws glue

- AWS Glue
Glue는 데이터를 추출, 변환, 적재(ETL)하는 데 사용되며, 데이터의 파티셔닝은 작업 범위를 제한하여 처리 속도를 높이는 데 중요한 역할을 합니다.
예를 들어, 날짜나 지역을 기준으로 접두사를 설계하면 Glue는 필요한 데이터만 처리하여 작업 효율을 극대화할 수 있습니다.

 

amazon athena

- Amazon Athena
Athena는 S3에 저장된 데이터를 SQL로 분석할 수 있는 서비스로, 효율적인 파티셔닝은 쿼리 성능에 직접적인 영향을 미칩니다.
S3에 적재된 데이터의 파티셔닝을 적절하게 구성하면, 데이터를 스캔하는 범위를 최소화하여 빠른 응답 시간과 비용 절감 효과를 얻을 수 있습니다.

참고자료: 

https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html

https://docs.aws.amazon.com/ko_kr/athena/latest/ug/ctas-partitioning-and-bucketing-what-is-partitioning.html

https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-prefixes.html

https://ottl-seo.tistory.com/205

https://bcho.tistory.com/730

https://blog.banksalad.com/tech/data-optimization-with-bucketing/