AWS/Athena

[Athena] TOO_MANY_OPEN_PARTITIONS

데이터엔지니어 주형권 2023. 7. 13. 21:21
반응형

안녕하세요. 주형권입니다.

현재 회사에서 AWS 기반의 환경에서 Athena Iceberg(이하 Iceberg)를 이용하여 Data Lake를 구축하고 있습니다. 

Iceberg 테이블에 데이터를 마이그레이션 하거나 ELT를 할때 다음과 같은 오류가 발생 하여서 간략하게 글을 써봅니다.

 


무슨 오류가 발생 하였는가?

 

TOO_MANY_OPEN_PARTITIONS : Exceeded limit of 100 open writers for partitions/buckets

 

다음과 같이 파티션이 100개 이상 쓸 수 없다고 나오는데요. 

이는 INSERT 및 UPDATE , MERGE등에서 모두 발생 하였습니다. 

 

어떻게 해결 하였는가?

이 부분은 해결 방법이 없습니다... 공식 홈페이지에 내용이 나오긴 하는데, 단순히 나누어서 넣으라는 이야기로 보입니다. ( 해결 방법 ) 결론적으로 해결 방법은 100개의 파티션을 넘어서지 말고 넣어라.. 입니다. 

 

한번에 100개 이상의 파티션을 변경 할 수 없다는게 ... 그리고 건수가 몇건이던지 무조건 100개 이상의 파티션을 넘으면 안됩니다. 예를 들어서 날짜로 파티션을 걸었다고 하고 100일 이상의 데이터를 INSERT , UPDATE , MERGE등이 불가능 합니다. 그래서 100일 이하의 단위로 나누어서 넣어야 합니다.

 

그리고 100일 이상의 파티션을 넣는다고 하면 그 건수가 몇건이든 상관 없이 실패 합니다. 예를 들어서 2023-01-01 ~ 2023-06-01 의 기간에 데이터가 1일에 1건의 데이터가 있다고 가정하고 INSERT 할 경우 실행이 불가능 합니다. 이미 100일 이상(파티션 100개)이상이기 때문 입니다.

 

그래서 결국 나누어서 넣어야 합니다. 한번에 원본(옮기고자 하는 소스 테이블)을 100개 이하의 파티션으로 읽어서 타겟으로 조금씩 밀어 넣어야 하는 이슈가 있습니다.

 

순차적으로 Partition 100개 이하로 넣는다.

 


또 다른 문제

여기서 문제가 하나 더 있습니다. Iceberg에서 Partition을 보면 날짜 이외에 숫자등의 컬럼에도 파티션을 설정 할 수 있습니다. 대부분의 사람들이 RDB에서 ELT를 하거나 ETL을 할때 숫자 형태로 한다면 RDB의 PK 값에 파티션을 걸어서 MERGE를 하는 생각을 많이 할 것 같습니다. 

 

iceberg partion

 

하지만... 파티션 100개 제한으로 인하여 한번에 넣을 수 있는 건수가 100개 입니다. (RDB의 PK로 파티션을 걸었다면..) 그래서 PK 컬럼에 파티션을 걸어서 MERGE를 해야 한다면 이는 거의 불가능 한 이야기 같습니다. MERGE를 하려면 TEMP 성 테이블에 데이터를 모두 넣고 원본과 MERGE를 해야 하는데, TEMP 테이블의 경우 Partion을 생성하지 않고 넣는다고 하여도 MERGE를 할때 이미 100개의 Partition을 넘기 때문에 MERGE시에도 같은 에러가 발생 합니다.

 


참고 

https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-creating-tables.html

 

Creating Iceberg tables - Amazon Athena

Running CREATE EXTERNAL TABLE results in the error message External keyword not supported for table type ICEBERG.

docs.aws.amazon.com

https://docs.aws.amazon.com/athena/latest/ug/partitions.html

 

Partitioning data in Athena - Amazon Athena

Partitioning data in Athena By partitioning your data, you can restrict the amount of data scanned by each query, thus improving performance and reducing cost. You can partition your data by any key. A common practice is to partition the data based on time

docs.aws.amazon.com

 

 

반응형