Hive 호환 파티션을 추가한 후 MSCK REPAIR TABLE
명령을 사용하여 카탈로그의 메타데이터를 업데이트합니다.
MSCK REPAIR TABLE
명령은 테이블을 생성한 후 파일 시스템에 추가된 Hive 호환 파티션을 위해 Amazon S3 등의 파일 시스템을 스캔합니다. MSCK REPAIR TABLE
은 테이블 메타데이터의 파티션과 S3의 파티션을 비교합니다. 테이블을 생성할 때 지정한 S3 위치에 새 파티션이 있으면 메타데이터와 Athena 테이블에 해당 파티션이 추가됩니다.
물리적 파티션을 추가하면 카탈로그의 메타데이터가 파일 시스템의 데이터 레이아웃과 일치하지 않게 되므로 새 파티션에 대한 정보를 카탈로그에 추가해야 합니다. 메타데이터를 업데이트하려면 Athena에서 새 파티션의 데이터를 쿼리할 수 있도록 MSCK REPAIR TABLE
을 실행합니다.
참고
MSCK REPAIR TABLE
은 메타데이터에 파티션을 추가하기만 합니다. 파티션을 제거하지는 않습니다. Amazon S3에서 파티션을 수동으로 삭제한 후 메타데이터에서 파티션을 제거하려면 ALTER TABLE
명령을 실행합니다. 자세한 내용은 ALTER TABLE DROP
PARTITION 단원을 참조하세요.table-name
DROP
PARTITION
고려 사항 및 제한
MSCK REPAIR TABLE
을 사용할 때는 다음 사항에 유의하세요.
-
모든 파티션을 추가하려면 다소 시간이 걸릴 수 있습니다. 이 작업의 시간이 초과되면 카탈로그에 몇 개의 파티션만 추가되는 불완전한 상태가 됩니다. 모든 파티션이 추가될 때까지 동일한 테이블에서
MSCK REPAIR TABLE
을 실행해야 합니다. 자세한 내용은 데이터 파티셔닝 단원을 참조하십시오. -
Hive와 호환되지 않는 파티션의 경우 데이터를 쿼리할 수 있도록 파티션을 로드하려면 ALTER TABLE ADD PARTITION을 사용합니다.
-
Athena에 사용될 파티션 위치는
s3
프로토콜(예:s3://amzn-s3-demo-bucket/
)을 사용해야 합니다. Athena에서, 다른 프로토콜(예:folder
/s3a://
)을 사용하는 위치는 포함 테이블에서bucket
/folder
/MSCK REPAIR TABLE
쿼리를 실행할 때 쿼리 실패를 초래하게 됩니다. -
MSCK REPAIR TABLE
은 일치하는 파티션 스키마를 찾기 위해 폴더와 하위 폴더를 모두 스캔하기 때문에 별도의 폴더 계층 구조에 있는 별도의 테이블에 데이터를 보관해야 합니다. 예를 들어 테이블 1의 데이터를s3://amzn-s3-demo-bucket1
에 두고 테이블 2에 대한 데이터을s3://amzn-s3-demo-bucket1/table-2-data
에 두었다고 가정합시다. 두 테이블이 모두 문자열로 분할된 경우MSCK REPAIR TABLE
은 테이블 2의 파티션을 테이블 1에 추가합니다. 이를 방지하려면 대신에s3://amzn-s3-demo-bucket1
및s3://amzn-s3-demo-bucket2
와 같은 별도의 폴더 구조를 사용하세요. 이 동작은 Amazon EMR과 Apache Hive에서도 동일합니다. -
알려진 문제로 인해 파티션 값에 콜론(
MSCK REPAIR TABLE
)이 포함된 경우(예: 파티션 값이 타임스탬프인 경우):
이 자동으로 실패합니다. 임시 해결책으로 ALTER TABLE ADD PARTITION을 사용합니다. -
MSCK REPAIR TABLE
에서는 밑줄(_)로 시작하는 파티션 열 이름을 추가하지 않습니다. 이 제한을 해결하려면 ALTER TABLE ADD PARTITION을 사용합니다.
시놉시스
MSCK REPAIR TABLE table_name
예시
MSCK REPAIR TABLE orders;
문제 해결
MSCK REPAIR TABLE
을 실행한 후 Athena가 AWS Glue Data Catalog의 테이블에 파티션을 추가하지 않으면 다음을 확인하세요.
-
AWS Glue 액세스 – AWS Identity and Access Management(IAM) 역할에
glue:BatchCreatePartition
작업을 허용하는 정책이 있는지 확인합니다. 자세한 내용은 이 문서의 후반부에서 IAM 정책에서 glue:BatchCreatePartition 허용 단원을 참조하세요. -
Amazon S3 액세스 - 역할에 Amazon S3에 액세스할 수 있는 충분한 권한(
s3:DescribeJob
작업 포함)이 있는 정책이 있는지 확인합니다. 허용할 Amazon S3 작업에 대한 예는 Athena에서 Amazon S3 버킷에 대한 크로스 계정 액세스 구성의 버킷 정책 예시를 참조하세요. -
Amazon S3 객체 키 대소문자 표기 방식 – Amazon S3 경로가 카멜 표기법이 아닌 소문자인지 확인합니다(예:
userId
대신userid
). 또는ALTER TABLE ADD PARTITION
을 사용하여 객체 키 이름을 지정합니다. 자세한 내용은 이 문서의 후반부에서 Amazon S3 경로 변경 또는 재정의 단원을 참조하세요. -
쿼리 시간 제한 –
MSCK REPAIR TABLE
은 처음으로 테이블을 만들거나 데이터와 파티션 메타 데이터 간의 패리티에 대한 불확실성이 있을 때 가장 적합합니다.MSCK REPAIR TABLE
을 사용해 새 파티션을 자주 추가하는데(예: 날마다) 쿼리 시간 제한이 발생하는 경우 ALTER TABLE ADD PARTITION 사용을 고려하는 것이 좋습니다. -
파일 시스템에서 파티션 누락 - Amazon S3에서 파티션을 수동으로 삭제한 다음
MSCK REPAIR TABLE
을 실행하면Partitions missing from filesystem
오류 메시지가 나타날 수 있습니다. 이는MSCK REPAIR TABLE
이 기한 경과된 파티션을 테이블 메타데이터를 제거하지 않았기 때문입니다. 테이블 메타데이터에서 삭제된 파티션을 제거하려면 ALTER TABLE DROP PARTITION을 대신 실행합니다. SHOW PARTITIONS는 비슷하게 파티션을 나열하지만 파일 시스템의 파티션을 제외하고 메타데이터의 파티션만 나열합니다. -
"NullPointerException name is null" 오류
TableType
속성을 지정하지 않고 AWS Glue CreateTable API 작업 또는 AWS CloudFormationAWS::Glue::Table
템플릿을 사용하여 Athena에서 사용할 테이블을 만든 다음SHOW CREATE TABLE
또는MSCK REPAIR TABLE
같은 DDL 쿼리를 실행하면,실패: NullPointerException Name이 null임(FAILED: NullPointerException Name is null)
이라는 오류 메시지가 표시될 수 있습니다.이 오류를 해결하려면 AWS Glue
CreateTable
API 호출 또는 AWS CloudFormation 템플릿의 일부로 TableInputTableType
속성의 값을 지정하세요.TableType
의 가능한 값은EXTERNAL_TABLE
또는VIRTUAL_VIEW
입니다.이 요구 사항은 AWS Glue
CreateTable
API 작업 또는AWS::Glue::Table
템플릿을 사용하여 테이블을 만들 때만 적용됩니다. DDL 문이나 AWS Glue 크롤러를 사용하여 Athena용 테이블을 생성할 경우TableType
속성이 자동으로 정의됩니다.
다음 섹션에서 여러 세부 정보를 추가로 제공합니다.
IAM 정책에서 glue:BatchCreatePartition 허용
MSCK
REPAIR TABLE
실행을 위해 사용 중인 역할에 연결된 IAM 정책을 검토합니다. Athena와 함께 AWS Glue Data Catalog를 사용하는 경우 IAM 정책에서 glue:BatchCreatePartition
작업을 허용해야 합니다. glue:BatchCreatePartition
작업을 허용하는 IAM 정책의 예는 AWS 관리형 정책: AmazonAthenaFullAccess 단원을 참조하세요.
Amazon S3 경로 변경 또는 재정의
Amazon S3 경로에 있는 하나 이상의 객체 키가 소문자가 아닌 카멜 표기법으로 표시된 경우 MSCK REPAIR TABLE
에서는 AWS Glue Data Catalog에 파티션을 추가하지 않을 수도 있습니다. 예를 들어 Amazon S3 경로에 객체 키 이름 userId
가 포함되어 있는 경우 다음 파티션은 AWS Glue Data Catalog에 추가되지 않을 수 있습니다.
s3://amzn-s3-demo-bucket/path/userId=1/
s3://amzn-s3-demo-bucket/path/userId=2/
s3://amzn-s3-demo-bucket/path/userId=3/
이 문제를 해결하려면 다음 중 한 가지를 사용하십시오.
-
Amazon S3 객체 키를 생성하는 경우 카멜 표기법 대신 소문자를 사용합니다.
s3://amzn-s3-demo-bucket/path/userid=1/ s3://amzn-s3-demo-bucket/path/userid=2/ s3://amzn-s3-demo-bucket/path/userid=3/
-
다음 예제와 같이 ALTER TABLE ADD PARTITION을 사용하여 위치를 재정의합니다.
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION (userId=1) LOCATION 's3://amzn-s3-demo-bucket/path/userId=1/' PARTITION (userId=2) LOCATION 's3://amzn-s3-demo-bucket/path/userId=2/' PARTITION (userId=3) LOCATION 's3://amzn-s3-demo-bucket/path/userId=3/'
Amazon S3 객체 키 이름은 대문자를 사용할 수 있지만 Amazon S3 버킷 이름 자체는 항상 소문자여야 합니다. 자세한 내용은 Amazon S3 사용 설명서의 객체 키 명명 지침 및 버킷 이름 지정 규칙을 참조하세요.