AWS Glue 크롤러 실행 중에 여러 테이블이 생성되지 않도록 하려면 어떻게 해야 합니까?
AWS Glue 크롤러가 소스 데이터로부터 여러 개의 테이블을 생성하고 있습니다. 이런 일이 계속 발생하지 않도록 하려면 어떻게 해야 하는지 알고 싶습니다.
간략한 설명
AWS Glue 크롤러를 처음 실행하는 동안 크롤러는 스키마를 추론하기 위해 처음 1,000개의 레코드 또는 모든 파일의 첫 번째 메가바이트를 읽습니다. 크롤러가 읽는 데이터의 양은 파일 형식과 유효한 레코드의 가용성에 따라 달라집니다.
예를 들어 입력이 JSON 파일이면 크롤러는 파일의 처음 1MB를 읽습니다. 크롤러가 파일의 처음 1MB 내에서 유효한 레코드를 읽은 경우 크롤러는 스키마를 추론합니다. 크롤러가 스키마를 추론할 수 없는 경우 1MB 단위로 최대 10MB의 파일을 읽습니다.
.csv 파일의 경우 크롤러는 먼저 나오는 것을 기준으로 처음 1,000개 레코드 또는 처음 1MB의 데이터를 읽습니다. Parquet 파일의 경우 크롤러는 파일에서 직접 스키마를 추론합니다.
크롤러는 모든 하위 폴더와 파일에서 추론한 스키마를 비교한 다음, 테이블을 생성합니다.
소스 데이터 파일이 다음과 같은 파라미터에 대해 동일한 구성을 사용하지 않는 경우, 크롤러는 여러 테이블을 생성합니다.
- 형식(예: .csv, Parquet 또는 JSON)
- 압축 유형(예: SNAPPY, gzip 또는 bzip2)
- 스키마
- Amazon Simple Storage Service(Amazon S3) 파티션의 구조
해결 방법
크롤러 로그 확인
크롤러가 여러 테이블을 생성하도록 하는 파일을 식별하려면 다음 단계를 완료하십시오.
- AWS Glue 콘솔을 엽니다.
- 탐색 창에서 크롤러를 선택합니다.
- 검토할 크롤러를 선택합니다.
- Amazon CloudWatch 콘솔에서 로그를 보려면 로그 링크를 선택합니다.
AWS Glue가 이전 크롤러 실행 중에 여러 테이블을 생성한 경우 로그에는 다음과 유사한 항목이 포함됩니다.
[439d6bb5-ce7b-4fb7-9b4d-805346a37f88] INFO : Created table
2_part_00000_24cab769_750d_4ef0_9663_0cc6228ac858_c000_snappy_parquet in
database glue
[439d6bb5-ce7b-4fb7-9b4d-805346a37f88] INFO : Created table
2_part_00000_3518b196_caf5_481f_ba4f_3e968cbbdd67_c000_snappy_parquet in
database glue
[439d6bb5-ce7b-4fb7-9b4d-805346a37f88] INFO : Created table
2_part_00000_6d2fffc2_a893_4531_89fa_72c6224bb2d6_c000_snappy_parquet in
database glue
로그 항목에는 크롤러가 여러 테이블을 생성하도록 하는 파일의 이름이 포함됩니다.
여러 테이블 생성 방지
여러 테이블이 생성되는 것을 방지하려면 사용 사례에 따라 다음 작업 중 하나를 수행하십시오.
데이터 파일이 동일한 스키마, 형식 및 압축 유형을 사용하는지 확인
파일에서 다른 스키마를 사용하는 경우가 있습니다. 예를 들어 스키마 A의 경우 필드 X가 INT 유형이고, 스키마 B의 경우 필드 X가 BOOL 유형입니다.
이 사용 사례에서는 이상치 데이터를 읽기 위해 from_options 함수를 사용하여 AWS Glue 추출, 전환, 적재(ETL) 작업을 실행합니다. 그런 다음, 이상치 데이터 유형을 소스에 있는 올바른 데이터 유형 또는 가장 일반적인 데이터 유형으로 변환합니다.
또한 기존 테이블 DDL을 사용하여 Amazon Athena에서 테이블을 수동으로 생성할 수도 있습니다. 그런 다음, AWS Glue 크롤러를 실행하여 테이블 메타데이터를 업데이트합니다. 테이블의 기존 스키마를 덮어쓰지 않도록 크롤러를 구성하십시오.
크롤러 생성 시 호환되는 스키마 결합
크롤러는 폴더 수준에서 스키마를 추론하고 모든 폴더의 스키마를 비교합니다. 크롤러는 스키마가 일치하고 파티션 임계값이 70% 보다 높은지 확인합니다. 일치하는 경우 스키마는 테이블의 파티션으로 표시됩니다. 일치하지 않는 경우 크롤러는 모든 폴더에 대해 테이블을 생성합니다. 이로 인해 테이블 수가 많아집니다.
일부 입력 파일은 데이터가 서로 다른 스키마를 가질 수 있으며 다른 파일에서는 유사한 스키마를 가질 수 있습니다. 크롤러를 생성할 때 호환되는 스키마를 결합하십시오.
AWS Glue 콘솔의 크롤러의 출력 구성 페이지에 있는 Grouping behavior for S3 data (optional)(S3 데이터의 그룹화 동작(선택 사항))에서 Create a single schema for each S3 path(각 S3 경로에 대해 단일 스키마 생성)을 선택합니다. 데이터가 호환되는 경우 크롤러는 경로에 있는 Amazon S3 객체를 평가할 때 스키마의 유사성을 무시합니다.
자세한 내용은 각 Amazon S3 포함 경로에 대한 단일 스키마 생성을 참조하십시오.
입력 파일에 서로 다른 Amazon S3 경로가 있는지 확인
Amazon S3 접두사 내부의 구조가 일치하지 않는 경우 크롤러는 각 경로를 개별 테이블로 간주합니다. 그런 다음, 크롤러는 여러 개의 테이블을 생성합니다. 입력 파일에 서로 다른 Amazon S3 구조 또는 경로가 있는 경우에는 크롤러가 기본적으로 여러 개의 테이블을 생성합니다.
예를 들어 다음과 유사한 파티션 구조를 사용하여 s3://doc-example-bucket/doc-example-key/doc-example-table Amazon S3 경로에서 크롤러를 실행합니다.
- s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-20/doc-example-file1.csv
- s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-21/dox-example-file2.csv
- s3://doc-example-bucket/doc-example-key/doc-example-table/dt=2020-08-22/doc-example-file3.csv
그런 다음, 이전 세 파일에 다음 파일을 추가합니다.
- s3://doc-example-bucket/doc-example-key/doc-example-table/dox-example-file4.csv
- s3:// doc-example-bucket/doc-example-key/doc-example-table/doc-example-file5.csv
폴더 파티션 구조가 일치하지 않기 때문에 크롤러는 다른 크롤러 실행에서 5개의 개별 테이블을 생성합니다.
이 문제를 피하려면 스키마가 일치하는지 수동으로 또는 프로그래밍 방식으로 확인하십시오. 위 예제에서는 dt=xxxx-xx-xx 파티션이 없는 Amazon S3 파일을 삭제하거나, doc-example-file4.csv 및 doc-example-file5.csv 파일에 대해 파티션을 추가합니다. 원하지 않는 파일이나 폴더를 제외하려면 제외 패턴을 사용하십시오.
일관된 헤더 사용
.csv 형식의 데이터를 사용할 경우 일관된 헤더를 사용해야 합니다. 일부 파일에는 헤더가 있고 다른 파일에는 헤더가 없는 경우 크롤러는 여러 개의 테이블을 생성합니다.
크롤러 실행으로 생성된 여러 테이블 삭제
CloudWatch 로그의 크롤러 실행에서 테이블을 필터링합니다. 그런 다음, BatchDeleteTable API를 호출하여 테이블을 삭제합니다.
다음 단계를 완료하십시오.
- AWS Glue 콘솔을 엽니다.
- 탐색 창에서 크롤러를 선택합니다.
- 크롤러 실행에서 대상 크롤러 이름을 선택합니다.
- 실행 세부 정보 보기를 선택합니다.
- 크롤러 실행 세부 정보 페이지에서 BatchDeleteTable 호출에 사용할 크롤러 실행 ID를 기록해 둡니다.
- CloudWatch 로그를 선택한 다음, /aws-glue/crawlers 로그 그룹을 선택합니다.
- 작업을 선택하고 Export data to Amazon S3(Amazon S3로 데이터 내보내기)를 선택합니다.
- 데이터를 내보내려면 다음 정보를 입력합니다.
시간 범위에는 크롤러 실행의 시작 및 종료 시간을 사용합니다.
스트림 접두사에 크롤러 이름을 추가합니다.
크롤러 실행 로그를 내보낼 대상 S3 버킷과 접두사를 선택합니다. - /aws-glue/crawlers 로그 그룹의 경우 작업을 선택한 다음, View all exports to Amazon S3(Amazon S3에 대한 모든 내보내기 보기)를 선택합니다.
- /aws-glue/crawlers 로그 그룹 및 대상 S3 버킷에 대한 내보내기 작업을 선택합니다.
- View in Amazon S3(Amazon S3에서 보기)를 선택합니다.
- Amazon S3 콘솔에서 대상 크롤러 이름이 있는 폴더를 선택합니다.
- 내보낸 로그 파일을 .gz 형식으로 로컬 시스템 또는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 다운로드합니다. 그런 다음, 로컬 경로에 파일의 압축을 풉니다. BatchDeleteTable 호출에서 사용할 경로 위치를 기록해 둡니다.
- 테이블을 필터링하려면 로컬 시스템 또는 EC2 인스턴스에서 압축 해제된 파일을 스캔합니다.
- AWS Glue BatchDeleteTable API를 호출하여 테이블을 삭제합니다.
예제 스크립트:
import boto3 import re # input parameters catalogId='CatalogId' database = 'databaseName' crawlId= 'crawlRunId' logFilePath = 'local_decompressed_file_path' # function to extract the created tables by the given crawl run id in target database def extract_table_info(file_path, target_crawl_id, target_database): list_tables = [] with open(file_path, 'r') as file: for line in file: match = re.search(f'.*\\[{target_crawl_id}\\] INFO : Created table (\\w+(?:_[a-f0-9]+)*) in database {target_database}', line) if match: table_name = match.group(1) list_tables.append(table_name) return list(set(list_tables)) createdTables = extract_table_info(logFilePath, crawlId, database) # initialize the Glue client and make batch_delete_table API calls to delete the created tables client = boto3.client('glue') for i in range(len(createdTables) // 100 + 1): tables_to_delete = createdTables[100 * i : 100 * (i + 1)] response = client.batch_delete_table( CatalogId=catalogId, DatabaseName=database, TablesToDelete=tables_to_delete ) print(i) print(response)
참고: 예제 입력 파라미터를 원하는 입력 파라미터로 바꾸십시오. 위의 예제 스크립트는 로컬 시스템 또는 EC2 인스턴스의 기본 AWS 리전 설정을 사용합니다. boto3에서 리전을 변경하려면 구성을 참조하십시오.
관련 정보
관련 콘텐츠
- 질문됨 일 년 전lg...
- 질문됨 15일 전lg...
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 3년 전
- AWS 공식업데이트됨 3년 전
- AWS 공식업데이트됨 3년 전