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

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

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

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

이 주제의 내용

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

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

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

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

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

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

자세한 내용은 AWS Glue 개발자 안내서데이터베이스테이블을 참조하세요.

참고

AWS::Glue::Database AWS CloudFormation 템플릿을 사용하여 AWS Glue 데이터베이스를 생성하고 데이터베이스 이름을 지정하지 않으면 AWS Glue는 Athena와 호환되지 않는 resource_name–random_string 형식으로 데이터베이스 이름을 자동으로 생성합니다.

AWS Glue 카탈로그 관리자를 사용하여 열 이름을 바꿀 수 있지만 테이블 이름이나 데이터베이스 이름은 바꿀 수 없습니다. 데이터베이스 이름을 수정하려면 새 데이터베이스를 만들고 그곳으로 기존 데이터베이스의 테이블을 복사해야 합니다. 즉, 메타데이터를 새 엔터티로 복사합니다. 테이블에서도 비슷한 프로세스를 따를 수 있습니다. 이렇게 하려면 AWS Glue SDK나 AWS CLI를 사용하면 됩니다.

AWS Glue 크롤러 사용

AWS Glue 크롤러는 데이터 집합의 스키마를 검색하고 AWS Glue 데이터 카탈로그에 테이블로 등록하는 데 도움이 됩니다. 크롤러는 데이터를 살펴보고 스키마를 결정합니다. 뿐만 아니라 파티션도 찾고 등록할 수 있습니다. 자세한 내용은 AWS Glue 개발자 안내서크롤러 정의를 참조하세요. 성공적으로 크롤링된 데이터의 테이블은 Athena에서 쿼리할 수 있습니다.

참고

Athena는 AWS Glue 크롤러에 지정한 제외 패턴을 인식하지 못합니다. 예를 들어 .csv.json 파일이 모두 포함된 Amazon S3 버킷이 있는데 .json 파일을 크롤러에서 제외한다면 Athena는 두 파일 그룹을 모두 쿼리합니다. 이 문제를 방지하려면 제외할 파일을 다른 위치에 배치하면 됩니다.

AWS Glue Data Catalog와 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 크롤러가 의도대로 두 개의 개별 테이블을 생성하게 하려면 크롤러가 다음 절차처럼 두 개의 데이터 원본(s3://bucket01/folder1/table1/, s3://bucket01/folder1/table2)으로 구성되도록 설정합니다.

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

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

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

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

  4. 크롤러 원본 유형 지정(Specify crawler source type)에서 적절한 추가 설정을 선택하고 다음(Next)을 선택합니다.

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

  6. 다음을 선택합니다.

  7. 다른 데이터 스토어 추가(Add another data store)에서 예(Yes)], 다음(Next)을 선택합니다.

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

  9. 추가 테이블 수준 디렉터리를 추가하는 단계를 반복하고 크롤러 구성을 완료합니다.

    최종 화면에서 다음 이미지와 같이 위치 포함(Include locations)에 대한 새 값이 데이터 스토어(Data stores) 아래에 나타납니다.

  10. [마침]을 클릭합니다.

"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 개발자 안내서테이블 세부 정보 보기 및 편집을 참조하세요.

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

CSV 파일 작업

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

따옴표로 묶인 CSV 데이터

다음 예시처럼 데이터 필드를 큰따옴표로 묶은 CSV 파일이 있을 수 있습니다.

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

따옴표로 묶인 값을 가진 CSV 파일에서 생성된 테이블에 대해 Athena에서 쿼리를 실행하려면 OpenCSVSerDe를 사용하기 위해 AWS Glue에서 테이블 속성을 수정해야 합니다. OpenCSV SerDe에 대한 자세한 내용은 CSV 처리를 위한 OpenCSVSerDe 단원을 참조하세요.

AWS Glue 콘솔에서 테이블 속성을 편집하려면

  1. AWS Glue 콘솔 탐색 창에서 테이블을 선택합니다.

  2. 편집할 테이블을 선택한 다음 작업(Action), 테이블 세부 정보 편집(Edit table details)을 선택합니다.

  3. 테이블 세부 정보 편집(Edit table details) 대화 상자에서 다음 변경을 적용합니다.

    • Serde 직렬화 라이브러리(Serde serialization lib)org.apache.hadoop.hive.serde2.OpenCSVSerde를 입력합니다.

    • Serde 파라미터(Serde parameters)에서 escapeChar, quoteChar, separatorChar 키에 다음 값을 입력합니다.

      • escapeChar에 백슬래시(\)를 입력합니다.

      • quoteChar에 큰따옴표(")를 입력합니다.

      • separatorChar에 쉼표(,)를 입력합니다.

  4. 적용을 선택합니다.

자세한 내용은 AWS Glue 개발자 안내서테이블 세부 정보 보기 및 편집을 참조하세요.

프로그래밍 방식으로 AWS Glue 테이블 속성 업데이트

다음 JSON 예제처럼 AWS Glue UpdateTable API 작업 또는 update-table CLI 명령을 사용해 테이블 정의의 SerDeInfo 블록을 수정할 수 있습니다.

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

헤더가 포함된 CSV 파일

다음 예제와 같이 CREATE TABLE 문으로 Athena에서 테이블을 정의할 때 skip.header.line.count 테이블 속성을 사용하여 CSV 데이터의 헤더를 무시할 수 있습니다.

... STORED AS TEXTFILE LOCATION 's3://my_bucket/csvdata_folder/'; TBLPROPERTIES ("skip.header.line.count"="1")

또는 헤더 정보가 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 파티션 인덱싱 및 필터링

Athena는 분할된 테이블을 쿼리할 때 사용 가능한 테이블 파티션을 검색하고 쿼리와 관련된 하위 집합으로 필터링합니다. 새 데이터와 파티션이 추가되면 파티션을 처리하는 데 더 많은 시간이 필요하며 쿼리 런타임이 늘어날 수 있습니다. 시간이 지남에 따라 확장되는 파티션이 많은 테이블이 있는 경우 AWS Glue 파티션 인덱싱 및 필터링을 고려하세요. 파티션 처리를 최적화하고 고도로 분할된 테이블에서 쿼리 성능을 향상시키기 위해 Athena는 파티션 인덱싱을 사용합니다. 테이블의 속성에서 파티션 필터링을 설정하는 과정은 두 단계로 이루어집니다.

  1. AWS Glue에서 파티션 인덱스 생성

  2. 테이블에 대해 파티션 필터링 사용 설정

파티션 인덱스 생성

AWS Glue에서 파티션 인덱스를 생성하는 단계는 AWS Glue 개발자 안내서의 파티션 인덱스 작업을 참조하세요. AWS Glue의 파티션 인덱스에 대한 제한 사항은 해당 페이지의 파티션 인덱스 정보 섹션을 참조하세요.

파티션 필터링 사용 설정

테이블에 대해 파티션 필터링을 사용 설정하려면 AWS Glue에서 새 테이블 속성을 설정해야 합니다. AWS Glue에서 테이블 속성을 설정하는 방법에 대한 단계는 파티션 프로젝션 설정 페이지를 참조하세요. AWS Glue에서 테이블 세부 정보를 편집할 때 테이블 속성(Table properties) 섹션에 다음 키-값 페어를 추가합니다.

  • 키(Key)에서 partition_filtering.enabled를 추가합니다.

  • 값(Value)true를 추가합니다.

partition_filtering.enabled 값을 false로 설정하여 언제든지 이 테이블에서 파티션 프로젝션을 비활성화할 수 있습니다.

위의 단계를 완료한 후 Athena 콘솔로 돌아가서 데이터를 쿼리할 수 있습니다.

지리 공간 데이터 작업

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 작업을 위해 스크립트를 작성하거나 마법사를 사용할 때 SMALLINTTINYINTINT로 변환합니다.

ETL을 위한 AWS Glue 작업 자동화

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