AWS Glue와 Athena을(를) 함께 사용하는 모범 사례 - Amazon Athena

AWS Glue와 Athena을(를) 함께 사용하는 모범 사례

AWS Glue 데이터 카탈로그와 함께 Athena을(를) 사용하면 AWS Glue을(를) 사용하여 Athena에서 쿼리할 데이터베이스와 테이블(스키마)을 만들거나 Athena을(를) 사용하여 스키마를 만든 다음 AWS Glue 및 관련 서비스에서 사용할 수 있습니다. 이 주제에서는 두 방법을 사용할 때 고려할 사항과 모범 사례를 제공합니다.

기본적으로 Athena는 Presto를 사용하여 DML 문을 실행하고, Hive를 사용하여 스키마를 만들고 수정하는 DDL 문을 실행합니다. 이러한 기술을 사용할 경우 Athena와(과) AWS Glue의 원활한 작동을 위해 따라야 하는 몇 가지 규칙이 있습니다.

이 주제의 내용

데이터베이스, 테이블 및 열 이름

Athena에서 쿼리할 AWS Glue에 스키마를 생성하려면 다음 사항을 고려하십시오.

  • 데이터베이스 이름은 252자보다 길 수 없습니다.

  • 테이블 이름은 255자보다 길 수 없습니다.

  • 열 이름은 128자보다 길 수 없습니다.

  • 데이터베이스 이름, 테이블 이름 및 열 이름에 사용할 수 있는 유일한 문자는 소문자, 숫자 및 밑줄 문자입니다.

AWS Glue Catalog Manager를 사용하여 열의 이름을 바꿀 수 있지만, 현재는 AWS Glue 콘솔을 사용하여 테이블 이름과 데이터베이스 이름을 변경할 수 없습니다. 데이터베이스 이름을 수정하려면 새 데이터베이스를 만들고 그리로 테이블을 복사해야 합니다. 즉, 메타데이터를 새 엔터티로 복사합니다. 테이블에서도 비슷한 프로세스를 따를 수 있습니다. 이렇게 하려면 AWS Glue SDK나 AWS CLI를 사용하면 됩니다.

AWS Glue 크롤러 사용

AWS Glue 크롤러는 AWS Glue 데이터 카탈로그에서 데이터 세트의 스키마를 찾고 등록하는 데 도움이 됩니다. 크롤러가 데이터를 탐색하고 일부를 검사하여 스키마를 결정합니다. 뿐만 아니라 파티션도 찾고 등록할 수 있습니다. 자세한 정보는 AWS Glue 개발자 안내서에서 크롤러를 사용하여 데이터 카탈로그 작성을 참조하십시오.

AWS Glue 데이터 카탈로그와 Amazon S3의 동기화를 유지하기 위한 크롤러 예약

AWS Glue 크롤러는 일정 또는 필요에 따라 실행되도록 설정할 수 있습니다. 자세한 정보는 AWS Glue 개발자 안내서크롤러와 작업을 위한 시간 기반 일정을 참조하십시오.

정해진 시간에 분할된 테이블에 수신되는 데이터가 있는 경우 AWS Glue 크롤러가 일정에 따라 테이블 파티션을 검색하고 업데이트하도록 설정할 수 있습니다. 그러면 상당한 시간과 비용이 들 수 있는 MSCK REPAIR 명령을 실행하거나 수동으로 ALTER TABLE ADD PARTITION 명령을 실행할 필요가 없습니다. 자세한 정보는 AWS Glue 개발자 안내서테이블 파티션을 참조하십시오.

크롤러와 여러 데이터 원본 사용

AWS Glue 크롤러가 Amazon S3을(를) 스캔하고 여러 디렉터리를 발견하면 휴리스틱을 사용하여 테이블의 루트가 디렉터리 구조에서 어디에 있는지, 어떤 디렉터리가 테이블의 파티션인지 파악합니다. 간혹 둘 이상의 디렉터리에서 발견된 스키마가 유사한 경우, 크롤러가 이를 별도의 테이블 대신 파티션으로 처리할 수 있습니다. 크롤러가 개별 테이블을 찾도록 돕는 한 가지 방법은, 각 테이블의 루트 디렉터리를 크롤러의 데이터 저장소로 추가하는 것입니다.

Amazon S3에 있는 다음 파티션이 한 예입니다.

s3://bucket01/folder1/table1/partition1/file.txt s3://bucket01/folder1/table1/partition2/file.txt s3://bucket01/folder1/table1/partition3/file.txt s3://bucket01/folder1/table2/partition4/file.txt s3://bucket01/folder1/table2/partition5/file.txt

table1table2의 스키마가 비슷하고 AWS Glue에서 단일 데이터 원본이 s3://bucket01/folder1/으로 설정된 경우, 크롤러는 두 개의 파티션 열(table1table2가 포함된 파티션 열과 partition1부터 partition5까지 포함하는 두 번째 파티션 열)로 구성된 하나의 테이블을 만들 수 있습니다.

AWS Glue 크롤러가 의도대로 두 개의 개별 테이블을 생성하게 하려면 AWS Glue 콘솔을 사용하여 크롤러가 다음 절차처럼 두 개의 데이터 원본(s3://bucket01/folder1/table1/, s3://bucket01/folder1/table2)으로 구성되도록 설정하십시오.

AWS Glue에서 기존 크롤러에 다른 데이터 스토어를 추가하려면

  1. AWS Management 콘솔에 로그인하고 https://console.aws.amazon.com/glue/에서 AWS Glue 콘솔을 엽니다.

  2. Crawlers(크롤러)를 선택하고 원하는 크롤러를 선택한 다음, Action(작업), Edit crawler(크롤러 편집)를 선택합니다.

  3. [Add information about your crawler]에서 필요에 따라 추가 설정을 선택한 후, [Next]를 선택합니다.

  4. [Add a data store]에서 [Include path]를 테이블 수준 디렉터리로 변경합니다. 예를 들어 위 예에서는 s3://bucket01/folder1 to s3://bucket01/folder1/table1/을(를) 변경할 수 있습니다. [Next]를 선택합니다.

  5. [Add another data store]에서 [Yes], [Next]를 선택합니다.

  6. Include path(포함 경로)에 다른 테이블 수준 디렉터리(예: s3://bucket01/folder1/table2/)를 입력하고 다음을 선택합니다.

    1. 추가 테이블 수준 디렉터리에 대해 3-5단계를 반복하고 크롤러 구성을 완료합니다.

Include locations(포함 위치)의 새 값이 다음과 같이 데이터 스토어 아래에 표시됩니다.

"HIVE_PARTITION_SCHEMA_MISMATCH"를 피하기 위한 파티션 스키마 동기화

파티션 열이 있는 AWS Glue 데이터 카탈로그의 각 테이블에 대해 스키마는 테이블 내에 개별 파티션별로 테이블 수준에서 저장됩니다. 파티션 스키마는 파티션 내에서 읽는 데이터 샘플을 기반으로 AWS Glue 크롤러에 의해 채워집니다. 자세한 정보는 크롤러와 여러 데이터 원본 사용을 참조하십시오.

Athena이(가) 쿼리를 실행하면 쿼리에 필요한 모든 파티션의 스키마와 테이블 스키마를 검증합니다. 검증을 통해 열 데이터 형식을 순서대로 비교하고, 중복되는 열에 대해 일치하도록 합니다. 그러면 테이블 중간에서 열을 추가하거나 제거하는 등의 예기치 않은 작업을 방지할 수 있습니다. 파티션의 스키마가 테이블의 스키마와 다름을 Athena이(가) 감지하게 되면 Athena이(가) 쿼리를 처리하지 못하여 HIVE_PARTITION_SCHEMA_MISMATCH 메시지와 함께 실패할 수도 있습니다.

이 문제는 몇 가지 방법으로 해결할 수 있습니다. 첫째, 데이터가 실수로 추가된 경우 스키마 차이를 유발하는 데이터 파일을 제거하고 파티션을 삭제한 다음 데이터를 다시 크롤링할 수 있습니다. 둘째, 개별 파티션을 삭제한 다음 Athena 내에서 MSCK REPAIR을(를) 실행하여 테이블의 스키마를 사용하여 파티션을 다시 만들 수 있습니다. 이 두 번째 옵션은 적용된 스키마가 계속해서 데이터를 올바르게 읽을 것이 확실한 경우에만 유효합니다.

테이블 메타데이터 업데이트

크롤링 후 AWS Glue 크롤러는 Apache Hive, Presto 및 Spark 등 다른 외부 기술과 호환되도록 특정 테이블 메타데이터를 자동으로 할당합니다. 경우에 따라 크롤러가 메타데이터 속성을 잘못 할당할 수 있습니다. Athena을(를) 사용하여 테이블을 쿼리하기 전에 AWS Glue의 속성을 수동으로 수정하십시오. 자세한 정보는 AWS Glue개발자 안내서Viewing and Editing Table Details(테이블 세부 정보 보기 및 편집)를 참조하십시오.

CSV 파일에 각 데이터 필드를 묶는 인용 부호가 있으면 serializationLib 속성이 잘못되어 AWS Glue이(가) 메타데이터를 잘못 할당할 수 있습니다. 자세한 정보는 인용 부호로 묶인 CSV 데이터를 참조하십시오.

CSV 파일 작업

CSV 파일에는 각 열의 데이터 값이 인용 부호로 묶여 있기도 하고, 분석할 데이터의 일부가 아닌 헤더 값이 CSV 파일에 포함된 경우가 있습니다. AWS Glue을(를) 사용하여 이 파일에서 스키마를 생성하는 경우 이 단원의 지침을 따르십시오.

인용 부호로 묶인 CSV 데이터

인용 부호로 묶인 데이터 값이 있는 CSV 파일로부터 생성한 테이블에 대해 Athena에서 쿼리를 실행하는 경우, 올바른 SerDe 및 SerDe 속성을 지정하도록 AWS Glue의 테이블 정의를 업데이트합니다. 그러면 테이블 정의에 OpenCSVSerDe를 사용할 수 있습니다. OpenCSV SerDe에 대한 자세한 내용은 CSV 처리를 위한 OpenCSVSerDe 단원을 참조하십시오.

이 경우 다음과 같이 변경합니다.

  • 테이블의 SerDeInfo 필드에 속한 필드에서 serializationLib 속성을 org.apache.hadoop.hive.serde2.OpenCSVSerde로 변경합니다.

  • separatorChar, quoteChar, escapeChar에 적절한 값을 입력합니다. separatorChar 값은 쉼표이고, quoteChar 값은 큰따옴표(``)이며, escapeChar 값은 백슬래시(\)입니다.

예를 들어, 다음과 같은 레코드가 있는 CSV 파일의 경우

"John","Doe","123-555-1231","John said \"hello\"" "Jane","Doe","123-555-9876","Jane said \"hello\""

다음 예와 같이 AWS Glue 콘솔을 사용하여 테이블 세부 정보를 편집할 수 있습니다.

또는 AWS Glue의 테이블 정의에 다음과 같은 SerDeInfo 블록이 포함되도록 업데이트할 수 있습니다.

"SerDeInfo": { "name": "", "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde", "parameters": { "separatorChar": "," "quoteChar": """ "escapeChar": "\\" } },

자세한 정보는 AWS Glue 개발자 안내서Viewing and Editing Table Details(테이블 세부 정보 보기 및 편집)를 참조하십시오.

헤더가 포함된 CSV 파일

Athena을(를) 사용하여 쿼리할 AWS Glue에서 CSV 파일을 작성하는 경우, 헤더 정보가 Athena 쿼리 결과에 포함되지 않도록 CSV 헤더를 제거해야 합니다. 한 가지 방법은 추출, 변환 및 로드(ETL) 작업을 수행하는 AWS Glue 작업을 사용하는 것입니다. AWS Glue에서 PySpark Python 언어의 확장 언어를 사용하여 스크립트를 작성할 수 있습니다. 자세한 정보는 AWS Glue 개발자 안내서Glue 작업 작성을 참조하십시오.

다음 예는 from_options를 사용하여 동적 프레임을 작성하고 writeHeader 형식 옵션을 false로 설정하여 헤더 정보를 제거하는 AWS Glue 스크립트의 함수를 보여줍니다.

glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://MYBUCKET/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")

지리 공간 데이터 작업

AWS Glue는 기본적으로 WKT(Well-known Text), WKB(Well-Known Binary) 또는 기타 PostGIS 데이터 형식을 지원하지 않습니다. AWS Glue 분류자는 지리 공간 데이터를 구문 분석하며, CSV의 경우 varchar와 같이 해당 형식에 지원되는 데이터 형식을 사용하여 분류합니다. 다른 AWS Glue 테이블과 마찬가지로 Athena가 이러한 데이터 형식을 그대로 구문 분석할 수 있게 하려면 지리 공간 데이터에서 생성된 테이블의 속성을 업데이트해야 할 수 있습니다. 자세한 내용은 AWS Glue 크롤러 사용CSV 파일 작업 단원을 참조하십시오. Athena에서 AWS Glue 테이블의 일부 지리 공간 데이터 형식을 그대로 구문 분석하지 못할 수 있습니다. Athena에서 지리 공간 데이터 작업에 대한 자세한 내용은 지리 공간 데이터 쿼리 단원을 참조하십시오.

Athena와 함께 ETL에 AWS Glue 작업 사용

AWS Glue 작업은 ETL 작업을 수행합니다. AWS Glue 작업은 소스에서 데이터를 추출하고 데이터를 변환한 다음 대상으로 로드하는 스크립트를 실행합니다. 자세한 정보는 AWS Glue 개발자 안내서Glue 작업 작성을 참조하십시오.

AWS Glue ETL 작업에 Athena을(를) 사용하여 테이블 생성

Athena에서 생성한 테이블에는 데이터 형식을 식별하는 classification(이)라는 테이블 속성이 추가되어야 합니다. 그러면 AWS Glue이(가) ETL 작업에 이 테이블을 사용할 수 있습니다. 분류 값은 csv, parquet, orc, avro 또는 json일 수 있습니다. Athena에서의 CREATE TABLE 문 예제는 다음과 같습니다.

CREATE EXTERNAL TABLE sampleTable ( column1 INT, column2 INT ) STORED AS PARQUET TBLPROPERTIES ( 'classification'='parquet')

테이블을 만들 때 테이블 속성을 추가하지 않았다면 AWS Glue 콘솔을 사용하여 추가할 수 있습니다.

콘솔을 사용하여 분류 속성을 변경하려면

  1. [Edit Table]을 선택합니다.
  2. [Classification]에서 파일 형식을 선택하고 [Apply]를 선택합니다.

자세한 정보는 AWS Glue 개발자 안내서테이블 작업을 참조하십시오.

ETL 작업을 사용하여 쿼리 성능 최적화

AWS Glue 작업은 Athena에서 쿼리 성능을 최적화하는 형식으로 데이터를 변환하는 데 도움이 됩니다. 데이터 형식은 Athena의 쿼리 성능 및 쿼리 비용에 큰 영향을 줍니다.

Parquet 및 ORC 데이터 형식 사용을 권장합니다. AWS Glue은(는) 이 두 데이터 형식의 쓰기를 모두 지원하므로, 데이터를 Athena에 가장 적합한 형식으로 쉽고 빠르게 변환할 수 있습니다. 이러한 형식 및 성능을 개선하는 다른 방법에 대한 자세한 내용은 Amazon Athena를 위한 유용한 성능 튜닝 팁을 참조하십시오.

ORC로 변환할 때 SMALLINT 및 TINYINT 데이터 형식을 INT로 변환

AWS Glue ETL 작업에서 생성한 SMALLINTTINYINT 데이터 형식을 Athena이(가) 읽지 못하게 될 가능성을 줄이려면, ETL 작업을 위해 스크립트를 작성하거나 마법사를 사용할 때 SMALLINT, TINYINT을(를) INT(으)로 변환합니다.

ETL용 AWS Glue 작업 자동화

트리거를 기반으로 AWS Glue ETL 작업이 자동으로 실행되도록 구성할 수 있습니다. AWS 외부의 데이터가 Athena에서 쿼리하기에 최적화되지 않은 형식으로 Amazon S3 버킷에 푸시되는 동안에는 이 기능이 이상적입니다. 자세한 정보는 AWS Glue 개발자 안내서AWS Glue 작업 트리거를 참조하십시오.