MSCK REPAIR TABLE - Amazon Athena

MSCK REPAIR TABLE

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 table-name DROP PARTITION 명령을 실행합니다. 자세한 내용은 ALTER TABLE DROP PARTITION 단원을 참조하세요.

고려 사항 및 제한

MSCK REPAIR TABLE을 사용할 때는 다음 사항에 유의하세요.

  • 모든 파티션을 추가하려면 다소 시간이 걸릴 수 있습니다. 이 작업의 시간이 초과되면 카탈로그에 몇 개의 파티션만 추가되는 불완전한 상태가 됩니다. 모든 파티션이 추가될 때까지 동일한 테이블에서 MSCK REPAIR TABLE을 실행해야 합니다. 자세한 내용은 Athena에서 데이터 분할 단원을 참조하십시오.

  • Hive와 호환되지 않는 파티션의 경우 데이터를 쿼리할 수 있도록 파티션을 로드하려면 ALTER TABLE ADD PARTITION을 사용합니다.

  • Athena에 사용될 파티션 위치는 s3 프로토콜(예: s3://DOC-EXAMPLE-BUCKET/folder/)을 사용해야 합니다. Athena에서, 다른 프로토콜(예: s3a://bucket/folder/)을 사용하는 위치는 포함 테이블에서 MSCK REPAIR TABLE 쿼리를 실행할 때 쿼리 실패를 초래하게 됩니다.

  • MSCK REPAIR TABLE은 일치하는 파티션 스키마를 찾기 위해 폴더와 하위 폴더를 모두 스캔하기 때문에 별도의 폴더 계층 구조에 있는 별도의 테이블에 데이터를 보관해야 합니다. 예를 들어 테이블 1의 데이터를 s3://DOC-EXAMPLE-BUCKET1에 두고 테이블 2에 대한 데이터을 s3://DOC-EXAMPLE-BUCKET1/table-2-data에 두었다고 가정합시다. 두 테이블이 모두 문자열로 분할된 경우 MSCK REPAIR TABLE은 테이블 2의 파티션을 테이블 1에 추가합니다. 이를 방지하려면 대신에 s3://DOC-EXAMPLE-BUCKET1s3://DOC-EXAMPLE-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 작업에 대한 예는 Amazon S3 버킷에 대한 Athena의 계정 간 액세스의 버킷 정책 예시를 참조하세요.

  • 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 CloudFormation AWS::Glue::Table 템플릿을 사용하여 Athena에서 사용할 테이블을 만든 다음 SHOW CREATE TABLE 또는 MSCK REPAIR TABLE 같은 DDL 쿼리를 실행하면, 실패: NullPointerException Name이 null임(FAILED: NullPointerException Name is null)이라는 오류 메시지가 표시될 수 있습니다.

    이 오류를 해결하려면 AWS Glue CreateTable API 호출 또는 AWS CloudFormation 템플릿의 일부로 TableInput TableType 속성의 값을 지정하세요. 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://DOC-EXAMPLE-BUCKET/path/userId=1/ s3://DOC-EXAMPLE-BUCKET/path/userId=2/ s3://DOC-EXAMPLE-BUCKET/path/userId=3/

이 문제를 해결하려면 다음 중 한 가지를 사용하십시오.

  • Amazon S3 객체 키를 생성하는 경우 카멜 표기법 대신 소문자를 사용합니다.

    s3://DOC-EXAMPLE-BUCKET/path/userid=1/ s3://DOC-EXAMPLE-BUCKET/path/userid=2/ s3://DOC-EXAMPLE-BUCKET/path/userid=3/
  • 다음 예제와 같이 ALTER TABLE ADD PARTITION을 사용하여 위치를 재정의합니다.

    ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION (userId=1) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=1/' PARTITION (userId=2) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=2/' PARTITION (userId=3) LOCATION 's3://DOC-EXAMPLE-BUCKET/path/userId=3/'

Amazon S3 객체 키 이름은 대문자를 사용할 수 있지만 Amazon S3 버킷 이름 자체는 항상 소문자여야 합니다. 자세한 내용은 Amazon S3 사용 설명서객체 키 명명 지침버킷 이름 지정 규칙을 참조하세요.