Amazon Athena DynamoDB 커넥터 - Amazon Athena

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon Athena DynamoDB 커넥터

Amazon DynamoDB 커넥터를 통해 Amazon Athena는 DynamoDB와 통신할 수 있고, 이로써 SQL을 사용하여 테이블을 쿼리할 수 있습니다. INSERT INTO 같은 쓰기 작업은 지원되지 않습니다.

계정에서 Lake Formation을 활성화한 경우 AWS Serverless Application Repository에 배포한 Athena 페더레이션형 Lambda 커넥터의 IAM 역할은 Lake Formation에서 AWS Glue Data Catalog에 대한 읽기 액세스 권한을 가지고 있어야 합니다.

필요 조건

매개 변수

이 섹션의 Lambda 환경 변수를 사용하여 DynamoDB 커넥터를 구성합니다.

  • spill_bucket – Lambda 함수 제한을 초과하는 데이터에 대한 Amazon S3 버킷을 지정합니다.

  • spill_prefix – (선택 사항) 기본값은 athena-federation-spill이라는 지정된 spill_bucket의 하위 폴더입니다. 미리 정해진 일 수 또는 시간보다 오래된 유출을 삭제하려면 이 위치에서 Amazon S3 스토리지 수명 주기를 구성하는 것이 좋습니다.

  • spill_put_request_headers – (선택 사항) 유출에 사용되는 Amazon S3 putObject 요청에 대한 요청 헤더 및 값의 JSON 인코딩 맵입니다(예: {"x-amz-server-side-encryption" : "AES256"}). 다른 가능한 헤더를 알아보려면 Amazon Simple Storage Service API Reference(Amazon Simple Storage Service API 참조)의 PutObject를 참조하세요.

  • kms_key_id – (선택 사항) 기본적으로 Amazon S3로 유출된 모든 데이터는 AES-GCM 인증 암호화 모드와 임의로 생성된 키를 사용하여 암호화됩니다. Lambda 함수가 a7e63k4b-8loc-40db-a2a1-4d0en2cd8331과 같이 KMS에서 생성된 더 강력한 암호화 키를 사용하도록 하려면 KMS 키 ID를 지정합니다.

  • disable_spill_encryption – (선택 사항) True로 설정하면 유출 암호화가 비활성화됩니다. S3로 유출되는 데이터가 AES-GCM을 사용하여 암호화되도록 기본값은 False입니다(임의로 생성된 키 또는 KMS를 사용하여 키 생성). 유출 암호화를 비활성화하면 특히 유출 위치가 서버 측 암호화를 사용하는 경우 성능이 향상될 수 있습니다.

  • disable_glue – (선택 사항) true로 설정된 경우 커넥터는 AWS Glue에서 보충 메타데이터 검색을 시도하지 않습니다.

  • glue_catalog – (선택 사항) 이 옵션을 사용하여 크로스 계정 AWS Glue 카탈로그를 지정합니다. 기본적으로 커넥터는 자체 AWS Glue 계정에서 메타데이터를 가져오려고 시도합니다.

  • disable_projection_and_casing – (선택 사항) 프로젝션과 대/소문자를 비활성화합니다. 열 이름에 대/소문자가 있는 DynamoDB 테이블을 쿼리하고 AWS Glue 테이블에 columnMapping 속성을 지정하지 않으려는 경우 사용합니다.

    disable_projection_and_casing 파라미터는 다음 값을 사용하여 대/소문자 및 열 매핑의 동작을 지정합니다.

    • auto(자동) - 이전에 지원되지 않는 형식이 감지되고 테이블에 열 이름 매핑이 설정되지 않은 경우 프로젝션과 대/소문자를 비활성화합니다. 이것이 기본 설정입니다.

    • always(항상) - 프로젝션과 대/소문자를 무조건 비활성화합니다. 이는 DynamoDB 열 이름에 대/소문자가 있지만 열 이름 매핑을 지정하지 않으려는 경우에 유용합니다.

    disable_projection_and_casing 파라미터를 사용할 때는 다음 사항에 유의하세요.

    • 파라미터를 사용하면 대역폭 사용량이 증가할 수 있습니다. 또한 Lambda 함수가 데이터 소스와 동일한 AWS 리전에 있지 않을 경우 대역폭 사용량이 증가하여 더 높은 표준 AWS 리전 간 전송 비용이 청구됩니다. 리전 간 전송 비용에 대한 자세한 내용은 AWS 파트너 네트워크 블로그의 서버 및 서버리스 아키텍처에 대한 AWS 데이터 전송 요금을 참조하세요.

    • 더 많은 수의 바이트가 전송되고 더 많은 수의 바이트가 더 많은 역직렬화 시간을 필요로 하기 때문에 전체 지연 시간이 늘어날 수 있습니다.

AWS Glue에서 데이터베이스 및 테이블 설정

커넥터의 기본 제공 스키마 추론 기능이 제한되어 있으므로 메타데이터에 AWS Glue를 사용할 수 있습니다. 이렇게 하려면 AWS Glue에 데이터베이스와 테이블이 있어야 합니다. DynamoDB에서 사용할 수 있도록 하려면 해당 속성을 편집해야 합니다.

AWS Glue 콘솔에서 데이터베이스 속성을 편집하려면 다음을 수행하세요.
  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/glue/에서 AWS Glue 콘솔을 엽니다.

  2. Databases(데이터베이스) 탭을 선택합니다.

    Databases(데이터베이스) 페이지에서 기존 데이터베이스를 편집하거나 Add database(데이터베이스 추가)를 선택하여 데이터베이스를 생성할 수 있습니다.

  3. 데이터베이스 목록에서 편집하려는 데이터베이스의 링크를 선택합니다.

  4. 편집을 선택합니다.

  5. Update a database)데이터베이스 업데이트) 페이지에서 Location(위치)에 문자열 dynamo-db-flag를 추가합니다. 이 키워드는 Athena DynamoDB 커넥터가 보충 메타데이터에 사용하고 default 이외의 AWS Glue 데이터베이스에 필요한 테이블이 데이터베이스에 포함되어 있음을 나타냅니다. dynamo-db-flag 속성은 데이터베이스가 많은 계정에서 데이터베이스를 필터링하는 데 유용합니다.

AWS Glue 콘솔에서 테이블 속성을 편집하려면
  1. AWS Management Console에 로그인하여 https://console.aws.amazon.com/glue/에서 AWS Glue 콘솔을 엽니다.

  2. 테이블 탭을 선택합니다.

    테이블 탭에서 기존 테이블을 편집합니다. 수동으로 또는 크롤러를 사용하여 테이블을 추가하는 방법에 대한 자세한 내용은 AWS Glue 개발자 안내서AWS Glue 콘솔에서 테이블 관련 작업을 참조하세요.

  3. 테이블 목록에서 편집하려는 테이블에 대한 링크를 선택합니다.

  4. Actions(작업), Edit table(테이블 편집)을 선택합니다.

  5. Edit table(테이블 편집) 페이지의 Table properties(테이블 속성) 섹션에서 필요에 따라 다음 테이블 속성을 추가합니다. AWS Glue DynamoDB 크롤러를 사용하는 경우 이러한 속성이 자동으로 설정됩니다.

    • dynamodb – 테이블을 보충 메타데이터에 사용할 수 있음을 Athena DynamoDB 커넥터에 나타내는 문자열입니다. classification(분류)이라는 필드 아래의 테이블 속성에 dynamodb를 입력합니다(정확히 일치).

      참고

      AWS Glue 콘솔의 테이블 작성 프로세스의 일부인 테이블 속성 설정 페이지에는 분류 필드가 있는 데이터 형식 섹션이 있습니다. 여기서는 dynamodb를 입력하거나 선택할 수 없습니다. 대신, 테이블을 생성한 후 테이블을 편집하고 테이블 속성 섹션에서 classificationdynamodb를 키-값 페어로 입력하는 단계를 수행합니다.

    • sourceTable – DynamoDB에서 소스 테이블 이름을 정의하는 선택적 테이블 속성입니다. AWS Glue 테이블 이름 지정 규칙으로 인해 DynamoDB 테이블과 동일한 이름으로 AWS Glue 테이블을 생성할 수 없는 경우 이 옵션을 사용합니다. 예를 들어, AWS Glue 테이블 이름에는 대문자가 허용되지 않지만 DynamoDB 테이블 이름에는 대문자가 허용됩니다.

    • columnMapping – 열 이름 매핑을 정의하는 선택적 테이블 속성입니다. AWS Glue 열 이름 지정 규칙으로 인해 DynamoDB 테이블과 동일한 열 이름으로 AWS Glue 테이블을 생성할 수 없는 경우 이 옵션을 사용합니다. 예를 들어, AWS Glue 열 이름에는 대문자가 허용되지 않지만 DynamoDB 열 이름에는 대문자가 허용됩니다. 속성 값은 col1=Col1,col2=Col2 형식이어야 합니다. 단, 열 매핑은 최상위 열 이름에만 적용되고 중첩된 필드에는 적용되지 않습니다.

    • defaultTimeZone – 명시적 표준 시간대가 없는 date 또는 datetime 값에 적용되는 선택적 테이블 속성입니다. 이 값을 설정하면 데이터 소스 기본 표준 시간대와 Athena 세션 시간대 간의 불일치를 방지하는 것이 좋습니다.

    • datetimeFormatMapping – AWS Glue date 또는 timestamp 데이터 형식의 열에서 데이터를 구문 분석할 때 사용할 date 또는 datetime 형식을 지정하는 선택적 테이블 속성입니다. 이 속성을 지정하지 않으면 커넥터는 ISO-8601 형식을 추론하려고 시도합니다. 커넥터가 date 또는 datetime 형식을 추론할 수 없거나 원시 문자열을 구문 분석할 수 없는 경우 결과에서 값이 생략됩니다.

      datetimeFormatMapping 값은 col1=someformat1,col2=someformat2 형식이어야 합니다. 다음은 몇 가지 예제 형식입니다.

      yyyyMMdd'T'HHmmss ddMMyyyy'T'HH:mm:ss

      열에 표준 시간대가 없는 date 또는 datetime 값이 있고 WHERE 절의 열을 사용하려는 경우 열에 대한 datetimeFormatMapping 속성을 설정합니다.

  6. 열을 수동으로 정의하는 경우 적절한 데이터 형식을 사용하는지 확인합니다. 크롤러를 사용한 경우 크롤러가 검색한 열과 유형을 검증합니다.

필요한 권한

이 커넥터에 필요한 IAM 정책에 대한 자세한 내용을 알아보려면 athena-dynamodb.yaml 파일의 Policies 섹션을 검토하세요. 다음 목록에 필요한 권한이 요약되어 있습니다.

  • Amazon S3 쓰기 액세스 - 대규모 쿼리의 결과 유출을 위해서는 커넥터에 Amazon S3 위치에 대한 쓰기 액세스 권한이 필요합니다.

  • Athena GetQueryExecution - 커넥터는 업스트림 Athena 쿼리가 종료된 경우 이 권한을 사용하여 빠른 실패를 수행합니다.

  • AWS Glue Data Catalog - 스키마 정보를 가져오기 위해 DynamoDB 커넥터에 AWS Glue Data Catalog에 대한 읽기 전용 액세스 권한이 필요합니다.

  • CloudWatch Logs - 로그를 저장하기 위해 커넥터 CloudWatch Logs에 대한 액세스 권한이 필요합니다.

  • DynamoDB 읽기 액세스 – 커넥터는 DescribeTable, ListSchemas, ListTables, QueryScan API 작업을 사용합니다.

성능

Athena DynamoDB 커넥터는 병렬 스캔을 지원하고 DynamoDB 쿼리의 일부로 조건자 푸시다운을 시도합니다. X개의 고유 값이 있는 해시 키 조건자는 DynamoDB에 대한 X개의 쿼리 호출을 생성합니다. 다른 모든 조건자 시나리오에서는 Y개의 스캔 호출이 발생합니다. 여기서 Y는 테이블 크기와 프로비저닝된 처리량을 기반으로 경험적으로 결정됩니다. 그러나 열 하위 세트를 선택할 때 쿼리 실행 런타임이 길어지는 경우가 있습니다.

LIMIT 절 및 간단한 조건자가 푸시다운되면 스캔하는 데이터가 줄어들 수 있으며 이에 따라 쿼리 실행 런타임이 감소할 수 있습니다.

LIMIT 절

LIMIT N 문은 쿼리로 스캔하는 데이터를 줄입니다. LIMIT N 푸시다운을 통해 커넥터는 Athena에 N개 행만 반환합니다.

Predicates

조건자는 부울 값으로 평가되고 여러 조건에 따라 행을 필터링하는 SQL 쿼리의 WHERE 절에 사용되는 표현식입니다. Athena DynamoDB 커넥터는 이러한 표현식을 결합하고 DynamoDB로 직접 푸시하여 기능을 개선하고 스캔하는 데이터를 줄일 수 있습니다.

다음 Athena DynamoDB 커넥터 연산자는 조건자 푸시다운을 지원합니다.

  • 부울: AND

  • 관계: EQUAL, NOT_EQUAL, LESS_THAN, LESS_THAN_OR_EQUAL, GREATER_THAN, GREATER_THAN_OR_EQUAL, IS_NULL

결합된 푸시다운 예제

쿼리 기능을 개선하기 위해 다음 예제와 같이 푸시다운 유형을 결합합니다.

SELECT * FROM my_table WHERE col_a > 10 and col_b < 10 LIMIT 10

DynamoDB를 비롯한 페더레이션된 쿼리의 성능을 개선하기 위해 조건자 푸시다운을 사용하는 방법에 대한 문서는 AWS 빅 데이터 블로그Improve federated queries with predicate pushdown in Amazon Athena를 참조하세요.

문제 해결

정렬 키 열의 다중 필터

오류 메시지: KeyConditionExpressions must only contain one condition per key

원인: 이 문제는 Athena 엔진 버전 3의 경우 DynamoDB 정렬 키 열에 하한 및 상한 필터가 모두 있는 쿼리에서 발생할 수 있습니다. DynamoDB는 정렬 키에 대해 둘 이상의 필터 조건을 지원하지 않으므로 커넥터가 두 조건이 모두 적용된 쿼리를 푸시다운하려고 하면 오류가 발생합니다.

솔루션: 커넥터를 버전 2023.11.1 이상으로 업데이트합니다. 커넥터 업데이트에 대한 지침은 데이터 소스 커넥터 업데이트 섹션을 참조하세요.

비용

커넥터 사용 비용은 사용되는 기본 AWS 리소스에 따라 다릅니다. 스캔을 사용하는 쿼리는 많은 읽기 용량 단위(RCU)를 사용할 수 있으므로 Amazon DynamoDB 요금 정보를 신중하게 고려하세요.

다음 사항도 참조하세요.