BLOG

Amazon Athena를 사용하여 Amazon DynamoDB 데이터의 고급 분석을 수행하고 시각화를 구축하는 방법
작성일: 2018-06-12

Amazon DynamoDB 서비스에서 수십억 개의 항목과 초당 수백만 개의 요청을 처리하여 막대한 분석 값을 얻을 수 있습니다. 그러나 분석 값을 얻으려면 데이터를 내보내야 합니다. DynamoDB 테이블에서 분석 플랫폼으로 데이터를 복사하면 풍부한 인사이트(insight)를 얻을 수 있습니다. 이를 위해 잘 설계된 빅 데이터 파이프라인을 통해 트랜잭션 처리와 분석을 분리할 수 있습니다. 이 게시글에서는 DynamoDB 테이블에서 Amazon S3로 데이터를 전환하는 대규모 데이터 파이프라인을 구축하는 방법을 보여 줍니다. 이렇게 하면 완전히 관리되는 사전 쿼리 서비스인 Amazon Athena를 사용하여 고급 분석을 수행하고 Amazon QuickSight를 사용하여 시각화 및 애드혹분석(ad hoc analyses)을 할 수 있습니다.

 

대부분의 분리된 빅 데이터 애플리케이션에는 스토리지와 컴퓨팅을 구분하는 공통 파이프라인이 있어 새로운 프로세싱 기술을 활용할 수 있습니다. 데이터 내구성에 영향을 주지 않으면서 여러 분석 엔진에 컴퓨팅 리소스를 탄력적으로 프로비저닝 할 수 있습니다. 저장 및 처리 단계를 반복하여 다운스트림 애플리케이션이 빠르게 사용할 수 있는 형식으로 데이터를 형성하도록 파이프라인을 설계할 수도 있습니다.

 

빅 데이터 파이프라인 설계에 영향을 미치는 세가지 주요 특성은 다음과 같습니다.

 

  • 전체 파이프라인의 레이턴시(latency) – 데이터에서 인사이트를 얻기까지시간이 얼마나 됩니까? 밀리초, 분, 일 중 어느 것으로 하시겠습니까?
  • 데이터 처리량 – 수집 및 처리해야 하는 데이터 양이 얼마입니까? 기가 바이트, 테라 바이트 또는 페타 바이트를 처리하고 계십니까?
  • 비용 – 애플리케이션의 목표 예산은 얼마입니까? AWS에서 가장 비용 효율적인 옵션이 적합할 수 있습니다.

 

빅 데이터 파이프라인을 설계할 때 고려해야 할 기타 핵심 사항으로는 데이터 구조, 접근 패턴, 데이터 온도, 가용성 및 내구성, 서비스의 완벽한 관리 여부 등이 있습니다. 이러한 특성을 기반으로 작업에 적합한 툴을 사용하는 것이 잘 구성된 빅 데이터 파이프라인의 핵심입니다.

 

계층형 빅 데이터 파이프라인

 

계층화된 빅 데이터 파이프라인을 살펴보기 전에, 이 솔루션이 사용하는 주요 서비스와 기능을 살펴보겠습니다.

 

파이프라인의 DynamoDB 기능

 

DynamoDB에서 테이블과 항목 및 속성은 작업하는 핵심 구성 요소입니다. 표는 항목의 모음이며 각 항목은 속성의 모음입니다. DynamoDB에서는 기본 키를 사용하여 테이블의 각 항목을 식별합니다. 보조 인덱스는 더 많은 쿼리 유연성을 제공합니다. 자세한 내용은 DynamoDB 개발자 설명서 에서 Amazon DynamoDB: 작동 방법을 참조하십시오.

 

DynamoDB TTL(Time To Live)을 사용하면 스토리지 비용을 줄이기 위한 방법으로 더 이상 관련이 없는 항목을 자동으로 삭제할 수 있습니다. 이 게시글에서는 테이블에서 TTL을 사용하도록 설정하고 ttl 특성을 사용하여 삭제할 타임 스탬프를 설정합니다. TTL에 대한 자세한 내용은 Time to Live: 작동 방식을 참조하십시오.

 

그런 다음 DynamoDB 스트림을 사용하여 항목 수준 수정(item-level)의 시간 순(time-ordered sequence)으로 캡처하고 Amazon S3에 복사할 수 있습니다. DynamoDB 스트림에 대한 자세한 내용은 DynamoDB 스트림으로 테이블 활동 캡처하기를 참조하십시오.

 

파이프라인의 AWS Lambda 기능

 

AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고 코드를 실행할 수 있는 컴퓨팅 서비스입니다. Lambda는 필요할 때만 코드를 실행하며 초당 수천 개의 요청으로 자동 확장됩니다. Lambda는 고가용성을 보장하며, 서버와 운영 체제 유지 보수(maintenance)와 패치를 관리합니다. Lambda를 사용하면 코드가 실행 중일 때 소비된 컴퓨팅 시간에 대해서만 지불합니다.

 

Lambda는 오브젝트를 S3 버킷에 넣을 때와 같은 이벤트에 반응하여 코드를 호출하는 기능을 제공합니다. 저희의 경우 Lambda는 DynamoDB 테이블에 대한 업데이트에 대응하여 이런 방식으로 제공합니다. 이 게시글에서는 Amazon Kinesis Data Firehose를 사용하여 Amazon S3에 항목을 복사하기 위해 DynamoDB 스트림에서 트리거한 Lambda 함수를 생성합니다.

 

예를 들어 전체 데이터셋에 대한 분석을 수행하려는 경우 모든 항목을 Amazon S3에 복사할 수 있습니다. TTL으로 삭제된 항목만 복사할 수도 있습니다. TTL으로 삭제된 항목의 레코드에는 사용자가 삭제한 항목과 구분할 수 있는 추가 메타 데이터 속성이 있습니다. TTL 삭제에 대한 userIdentity 필드(다음 예 참조)는 DynamoDB가 TTL의 일부로 삭제를 수행했음을 나타냅니다.

 

“userIdentity”: {

                “Type”: “Service”,

                “PrincipalId”: “dynamodb.amazonaws.com”

            }

 

TTL 데이터만 전환하려면 eventNameREMOVE되고 userIdentitydynamodb.amazonaws.com 에 동등한 PrincipalID를 포함하는 레코드를 복사하도록 Lambda 함수를 수정하십시오.

 

Lambda를 파이프라인의 일부로 두면 Amazon S3에 저장하기 전에 데이터에 대한 간단한 전환을 수행할 수 있는 추가적인 기회를 제공합니다. 이 솔루션의 Lambda 함수는 중첩된 JSON 데이터의 일부를 삭제하므로 향후 다른 데이터셋과 쉽게 결합할 수 있습니다.

 

파이프라인에 있는 Amazon Athena의 기능

 

Athena는 표준 SQL을 사용하여 Amazon S3에서 데이터를 직접적으로 분석하기 쉽게 해 주는 대화형 쿼리 서비스입니다. Athena에는 서버가 없으므로 설정하거나 관리할 인프라가 없으며, 사용자는 실행하는 쿼리에 대해서만 비용을 지불합니다. Athena는 자동으로(병렬로 쿼리 검사) 확장하여 대규모 데이터셋과 복잡한 쿼리를 사용하더라도 빠르게 결과를 확인할 수 있습니다. Athena 설정에 대한 자세한 내용은 Athena 사용자 가이드 설정을 참조하십시오.

 

DynamoDB의 데이터는 JSON 형식으로 Amazon S3에 저장됩니다. 일반적으로 데이터를 SQL 조회에 더 적합한 형식으로 변환하려면 추출, 변환 및 로드(ETL)프로세스가 필요합니다. 하지만 Athena에서는 읽기 전용 스키마라는 접근 방식을 사용하여 쿼리를 실행할 때 스키마를 데이터에 투영할 수 있습니다. 따라서 데이터 로드 또는 ETL이 필요하지 않습니다. 이 게시글의 솔루션은 JSON serializer/deserializer (SerDe)를 사용하여 원문 JSON 레코드를 구문 분석하고 Hive 데이터 정의 언어를 사용하여 외부 테이블을 만듭니다. 스키마가 생성된 후에 데이터 조회를 시작할 수 있습니다.

 

모두 합하여

 

모든 부분에 대해 설명된 대로 end-to-end 파이프라인을 검토해 보겠습니다. 다음 다이어그램에서는 솔루션의 작동 방식을 보여 줍니다.

 

 

 

  1. 애플리케이션이 데이터를 DynamoDB 테이블에 씁니다. 이 게시글에서는 샘플 데이터셋을 사용하여 DynamoDB 테이블을 채우는 샘플 Python 함수를 제공합니다.
  2. DynamoDB TTL 테이블 구성은 표의 타임 스탬프 속성을 기준으로 항목을 만료하고 삭제합니다.
  3. DynamoDB 스트림은 항목 수준(item-level) 수정의 시간 순서(a time-ordered sequence)를 캡처합니다.
  4. Lambda 함수는 DynamoDB 스트림을 주시하며(listen) 항목(item)을 Kinesis Data Firehose 전송 스트림에 작성합니다. 제공되는 함수는 새로운 모든 아이템을 Kinesis Data Firehose 전송 스트림에 저장합니다. UserIdentity 필드의 추가 메타 데이터 속성을 기반으로 TTL이 삭제한 항목에 대해서만 레코드를 저장하도록 기능을 수정할 수 있습니다.
  5. Kinesis Data Firehose는 Amazon S3에 데이터를 보냅니다.
  6. 데이터가 Amazon S3에 있으면 Athena를 사용하여 외부 테이블을 만들고 파티션을 설정한 다음 데이터 쿼리를 시작합니다.
  7. 또한 데이터를 시각화하고 Athena 또는 Amazon S3에서 직접적으로 임시 데이터 쿼리를 수행하도록 Amazon QuickSight를 설정할 수 있습니다.
  8. 애플리케이션은 DynamoDB에서 직접적으로 hot data를 쿼리하고 Athena API 또는 Amazon QuickSight 시각화를 통해 분석 데이터에 액세스 할 수도 있습니다.

 

솔루션 구현하기

 

제공된 AWS CloudFormation 템플릿은 DynamoDB 테이블, DynamoDB 스트림, S3 버킷, Kinesis Data Firehose 전송 스트림 및 Lambda 함수를 배포합니다. 다음 섹션 “솔루션 검증 및 데이터 쿼리”에서 설명한 대로 Athena 및 Amazon QuickSight를 수동으로 구성해야 합니다.

 

솔루션을 배포하려면:

 

  1. Lambda 함수 코드 ddb-to-firehose.py를 다운로드하고 원하는 S3 버킷에 업로드합니다. S3 버킷이 솔루션을 배포하려는 AWS 리전에 있는지 확인합니다. 버킷 이름을 기록합니다.
  2. Github에서 데스크 톱으로 CloudFormation 템플릿을 다운로드합니다.
  3. CloudFormation 콘솔로 이동하여 스택 새로 만들기(CreateStack)을 선택합니다.
  4. Amazon S3에 템플릿 업로드(Upload a template to Amazone S3)를 선택하고 방금 다운로드한 ddbathenablog_cf.yaml 템플릿을 찾습니다. 다음(Next)을 선택합니다.
  5. 스택 이름 및 DynamoDB 테이블 이름(예: 동영상)을 지정합니다. 1단계에서 Lambda 함수 코드를 업로드한 버킷 이름도 지정합니다. 다음(Next)을 선택합니다.
  6. 옵션에서 다음(Next)을 선택합니다.
  7. 마지막 페이지에서 AWS CloudFormation에서 사용자 정의 이름으로 IAM 리소스를 생성할 수 있음을 승인합니다(I acknowledge that AWS CloudFormation might create IAM resources) 확인을 선택하고 생성을 선택합니다.
  8. AWS CloudFormation 스택(AWS 리소스 모음)이 완전히 배포되고 상태가 생성완료로 표시될 때까지 잠시 기다렸다가 다음 섹션으로 이동하십시오.

 

솔루션 검증 및 데이터 쿼리

 

솔루션을 검증하고 DynamoDB 테이블을 빠르게 채우려면 이 게시글에 연결된 데이터 파일과 Python 함수를 다운로드합니다. Python 스크립트는 인터넷 동영상 데이터베이스(IMDb)에서 수천 편의 영화에 대한 정보를 포함하는 샘플 데이터 파일을 로드합니다. 각 동영상마다 파일에 연도, 제목 및 정보라는 JSON 맵이 있습니다. 다음 샘플 코드에서 데이터의 형태를 볼 수 있습니다.

 

{

    “year” : 2013,

    “title” : “Turn It Down, Or Else!”,

    “info” : {

        “directors” : [

            “Alice Smith”,

            “Bob Jones”

        ],

        “release_date” : “2013-01-18T00:00:00Z”,

        “rating” : 6.2,

        “genres” : [

            “Comedy”,

            “Drama”

        ],

        “image_url” : “http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg”,

        “plot” : “A rock band plays their music at high volumes, annoying the neighbors.”,

        “rank” : 11,

        “running_time_secs” : 5215,

        “actors” : [

            “David Matthewman”,

            “Ann Thomas”,

            “Jonathan G. Neff”

       ]

    }

}

 

솔루션을 검증하고 DynamoDB 테이블을 채우려면:

 

  1. LoadMovieData.py  스크립트와 moviedata.zip을 다운로드합니다. moviedata.zip 아카이브에서 moviedata.json 파일의 압축을 풉니다.
  2. LoadMovieData.py 스크립트를 편집하고 AWS 리전 및 테이블 이름과 일치하는 region_name  dynamodb. Table 값을 업데이트합니다.

 

dynamodb = boto3.resource(‘dynamodb’, region_name=’us-east-1′)

table = dynamodb.Table(‘movies’)

 

  1. 명령 창을 열고 다음 Python 스크립트를 실행하여 데이터를 업로드 합니다.

 

PATH\LoadMovieData.py PATH\moviedata.json

 

DynamoDB 테이블에 레코드가 로드 될 때 다음 출력이 표시되기 시작해야 합니다.

 

10 rows inserted

20 rows inserted

30 rows inserted

4600 rows inserted

 

  1. DynamoDB 콘솔을 열고 테이블을 선택한 다음 동영상 테이블을 선택하고 항목을 선택합니다. 다음 스크린샷에 표시된 것처럼 처음 100개 항목이 표시됩니다.

 

 

 

  1. Amazon S3 콘솔을 열고 이 솔루션에서 생성한 버킷을 엽니다. AWS CloudFormation 콘솔에서 스택 이름을 선택하고 리소스를 선택하여 버킷 이름을 찾을 수 있습니다. Amazon S3의 데이터는 다음 스크린 샷과 유사하게 나타납니다.

 

Amazon S3의 각 개체에는 Data Firehose 버퍼 설정에 기반한 여러 동영상 레코드가 포함되어 있습니다.

 

  1. Athena 콘솔을 엽니다. 원하는 데이터베이스를 선택하고 다음의 Hive DDL 문장을 붙여 넣습니다. 위치를 동영상 데이터가 들어 있는 S3 버킷으로 대체합니다. 처음으로 Athena를 사용하는 경우에는 먼저 Athena 사용자 가이드에서 시작하기를 참조하고 샘플 데이터베이스를 생성하십시오.

 

CREATE EXTERNAL TABLE `movies`(

  `year` int,

  `createtime` int,

  `title` string,

  `expiretime` int,

  `info` string,

  `actor1` string,

  `actor2` string,

  `director1` string,

  `director2` string,

  `genre1` string,

  `genre2` string,

  `rating` double)

ROW FORMAT SERDE

  ‘org.openx.data.jsonserde.JsonSerDe’

LOCATION

‘s3://your-bucket-name/path/to/data/’

 

Athena 콘솔에서 데이터를 쿼리할 수 있습니다. 예를 들어, 다음 쿼리를 실행하여 genre1 로 평균 등급을 받습니다.

 

SELECT genre1, avg(rating) as avg_rating FROM “sampledb”.”movies” group by genre1 order by avg_rating desc

 

  1. Amazon QuickSight 콘솔을 엽니다. Amazon QuickSight를 처음 사용하는 경우에는 Amazon QuickSight 사용자 가이드Amazon QuickSight에서 데이터 분석 시작하기를 참조하십시오. 데이터 관리를 선택하고 새 데이터셋을 선택합니다. 데이터셋 생성 페이지에서 Athena를 선택하고 선택한 데이터 원본 이름(예:동영상)을 제공한 다음 데이터 소스 생성을 선택합니다. 다음 스크린샷에서 이러한 예를 볼 수 있습니다.

 

 

8. 여기에 있는 이미지에서 표 선택 페이지에 있는 데이터베이스와 동영상 테이블을 선택한 다음 선택을 선택합니다.

 

 

 

  1. 데이터 셋 생성 완료 페이지에서 직접 데이터 조회를 선택한 다음 시각화를 선택하십시오.10. 이제 간단한 시각화를 만들 수 있습니다. Y축에 genre1actor1을 놓고 X축에 rating (평균)을 놓습니다. 다음 스크린 샷은 이것을 보여 줍니다.

 

  1. 이제 genre1로 평균 등급을 확인할 수 있습니다. actor1에 의한 등급을 보려면 드라마를 선택한 다음 actor1까지 드릴 다운을 선택합니다.

결과는 genre1 내의 actor1뷰별로 평균 등급을 보여 줍니다.

결론

이 게시물의 분석 및 시각화 솔루션 예제에서는 DynamoDB 테이블 데이터에 포함된 인사이트(insight)를 활용하는 방법을 보여 줍니다. 이 게시물에서는 DynamoDB 테이블에서 S3 버킷으로 데이터를 빠르게 전환할 수 있는 계층형 빅데이터 파이프라인을 작성합니다. 그런 다음 Athena에서 고급 분석을 수행하고 Amazon QuickSight를 사용하여 시각화합니다. 이 솔루션을 사용하면 모든 DynamoDB 데이터를 Amazon S3에 복사할 수 있습니다. 또한 DynamoDB TTL을 사용하여 만료된 레코드만 이동할 수 있습니다. 이 분리된 솔루션을 사용하면 주요 고려사항-대기시간, 처리량 및 비용 면에서 파이프라인의 각 단계에 최적의 분석 서비스를 사용할 수 있습니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/database/how-to-perform-advanced-analytics-and-build-visualizations-of-your-amazon-dynamodb-data-by-using-amazon-athena/

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.