Amazon Web Services 한국 블로그

Amazon Athena와 AWS Lambda 기반 데이터 소스간 통합 질의 기능 살펴보기

최근 기업들은 다양한 애플리케이션을 개발할 때, 요구 사항에 적합한 데이터 저장소를 사용합니다. 예를 들어, 소셜 네트워크 서비스를 만들 때는 전통적인 관계형 DB 보다는 Amazon Neptune과 같은 그래프 데이터베이스 가 가장 적합합니다. 유연한 스키마가 필요한 워크로드의 경우, Amazon DocumentDB (MongoDB 호환)이 더 적합합니다.

Amazon.com의 CTO이자 부사장 인 Werner Vogels는 “하나의 데이터베이스가 여러 가지 개별 사용 사례의 요구를 모두 충족시킬 수 있는 경우는 거의 없다.”라고 하였습니다. 현재 개발자들은 다양한 목적으로 따로 만들어진 데이터베이스 엔진을 사용하여 고도로 분산된 애플리케이션을 구축합니다. 즉, 복잡한 응용 프로그램을 더 작은 조각으로 나눠서 올바른 작업에 적합한 도구를 선택할 수 있는 마이크로서비스 아키텍처를 활용하는 기법을 채용하고 있습니다.

이러한 아키텍처 하에서는 데이터 분석 관점에서 데이터 저장소 및 애플리케이션의 수가 증가함에 따라 여러 데이터 소스에서 통합 분석을 실행하는 것이 어려워 질 수 있습니다.

Amazon Athena 통합 질의 기능 소개

Amazon Athena 통합 질의(Federated Query)는 데이터 분석가, 엔지니어 및 데이터 과학자가 관계형, 비-관계형, 객체 및 사용자 지정 데이터 소스에 저장된 데이터에 대해 SQL 질의를 실행할 수 있는 기능입니다.

Athena의 경우, 기존에 Amazon S3의 정규 데이터 파일에 대한 질의를 실행하는 반면  통합 질의를 사용하 단일 SQL 질의문을 통해 온-프레미스에서 부터 클라우드 내 데이터 소스를 함께 분석 할 수 있습니다. Athena는 AWS Lambda에서 실행되는 데이터 소스 커넥터를 사용하여 통합 질의를 실행합니다. 즉, Amazon DynamoDB , Apache HBase, Amazon DocumentDBAmazon Redshift , Amazon CloudWatch를 위한 오픈 소스 Athena 데이터 소스 커넥터를 보유하고 있습니다.

이 데이터 커넥터는 Apache 2.0 라이센스에 따라 AWS CloudWatch 지표 및 로그, MySQL 및 PostgreSQL과 같은 JDBC 호환 관계형 데이터 소스 등을 지원합니다. 본 커넥터를 사용하여 이러한 데이터 소스에 대해 Athena에서 통합 SQL 쿼리를 실행할 수 있습니다.

분산된 데이터에 대한 분석 기능을 실행하는 것은 복잡하고 시간 소모적 일 수 있습니다. 기존에는 개별 분석가는 각 데이터 소스에 접근하기 위한 새로운 프로그래밍 언어와 데이터 액세스 구문을 배우고, 데이터를 쉽게 질의하기 전에 데이터웨어 하우스로 추출, 변환 및 로드 할 복잡한 파이프 라인을 구축해야 합니다. 데이터 파이프 라인을 통해 총 분석 시간이 늘어나고  시스템 전체의 데이터 정확성 및 일관성을 검증하기 위해 사용자 정의 프로세스가 필요해집니다. 소스 애플리케이션이 수정 될 때마다 데이터 파이프 라인을 업데이트하고 수정을 위해 데이터를 다시 통계해야 합니다.

Amazon Athena 통합 질의는 이러한 분산 데이터 환경에서 복잡성을 제거합니다. 데이터 분석가는 익숙한 SQL 구문을 사용하여 여러 데이터 소스에서 데이터를 결합하여 빠른 분석을 수행하거나 예약 된 SQL 쿼리를 사용하여 후속 분석을 위해 Amazon S3에서 결과를 추출 및 저장할 수 있습니다.

좀 더 효율적인 통합 분석을 위해 Athena Query Federation SDK를 사용하여 손쉽게 데이터 소스에 대한 커넥터를 구축 가능하며, 커넥터는 AWS Lambda에서 실행되므로 Athena의 서버리스 아키텍처를 통해 최대 수요에 맞게 인프라 나 규모를 관리 할 필요가 없습니다.

Athena Query Federation SDK는  100 줄 미만의 소스 코드로 데이터 소스에 대한 커넥터를 구축하여  공유 할 수 있습니다. 커넥터는 Lambda 함수를 통해 데이터 소스에서 사용 가능한 데이터베이스, 테이블 및 열을 검색합니다. 통합 질의가 실행되면, Athena는 해당 커넥터를 호출하여 읽어야 하는 테이블 부분을 식별하고 병렬 처리를 관리하며 필터 조건자를 활용합니다. 커넥터는 질의에서 요청 된 데이터를 반환하기 위한 형식으로 Apache Arrow를 사용하므로 커넥터를 C, C ++, Java, Python 및 Rust와 같은 언어로 구현할 수 있습니다.

데이터 소스 커넥터

AWS에서 제공하는 다양한 오픈 소스 커넥터를 사용하거나 직접 구축하거나 기존 커넥터에 기여하거나 커뮤니티 또는 마켓 플레이스에서 만든 커넥터를 사용할 수 있습니다. 데이터 소스 유형에 따라 커넥터는 메타 데이터 정보를 관리합니다. 스캔, 읽기 또는 필터링이 필요한 테이블의 특정 부분을 식별합니다. 병렬 처리를 관리합니다.

각 데이터 커넥터는 각각 데이터 소스에 고유 한 메타 데이터 용과 레코드 읽기 용의 두 가지 Lambda 함수로 구성됩니다. 커넥터 코드는 오픈 소스이며 Lambda 함수로 배포해야 합니다. Lambda 함수를 AWS Serverless Application Repository에 배포 하고 Athena와 함께 사용할 수도 있습니다. Lambda 함수가 배포되면 고유 한 Amazon 리소스 이름 또는 ARN이 생성됩니다. 본 ARN을 Athena에 등록해야합니다. ARN을 등록하면 Athena는 쿼리 실행 중에 어떤 Lambda 함수와 대화 할 것인지 이해할 수 있습니다. 두 ARN이 모두 등록되면 등록 된 데이터 소스를 쿼리 할 수 ​​있습니다.

페더레이션 된 데이터 소스에서 쿼리가 실행될 때 Athena는 메타 데이터와 데이터를 동시에 읽는 Lambda 호출을 제거합니다. 병렬 호출 수는 계정에 적용된 Lambda 동시성 제한에 따라 다릅니다. 예를 들어, 300 개의 동시 Lambda 호출 제한이 있는 경우 Athena는 레코드 읽기를 위해 300 개의 병렬 Lambda 함수를 호출 할 수 있습니다. 병렬로 실행되는 두 개의 쿼리에 대해 Athena는 동시 실행 수의 두 배를 호출합니다.

그림 1은 Athena Federated Queries의 작동 방식을 보여줍니다. 통합 질의를 Athena에 제출하면 Athena가 올바른 Lambda 기반 커넥터를 호출하여 데이터 소스에 연결합니다. Athena는 Lambda 호출을 제거하여 메타 데이터와 데이터를 동시에 읽습니다.

그림 1 : Athena 통합 질의 아키텍처

다양한 데이터 분석 도구에서 통합 질의 사용해 보기

이 블로그 게시물에서는 데이터 분석가가 여러 데이터베이스에서 데이터를 질의하여 하나의 SQL 구문에서 더 빠르게 분석하는 방법을 보여줍니다. 예를 들어, 다음과 같은 특수 목적의 데이터 소스를 활용하는 가상의 전자 상거래 회사를 생각해보십시오.

아키텍처가 다음과 같은 가상 전자 상거래 회사를 사용한다고 가정 해보십시오.

  1. Amazon EMR에서 실행되는 Apache HBase(NoSQL)에 저장된 지불 거래 레코드를 저장합니다.
  2. 아직 주문 되지 않은 고객 주문으로 정의 된 활성 주문은 처리 엔진이 해당 주문을 신속하게 검색 할 수 있도록 Amazon ElastiCache (Redis)에 저장합니다.
  3. 이메일 주소, 배송 정보 등과 같은 고객 데이터는 Amazon DocumentDB에 저장합니다.
  4. Amazon Aurora (관계형 DB)에 제품 카탈로그를 저장합니다.
  5. Amazon CloudWatch Logs에 주문 과정의 로그 정보를 저장ㅇ합니다.
  6. Amazon Redshift (데이터웨어 하우스)에 과거 주문 및 분석 정보를 저장합니다.
  7. Amazon DynamoDB (NoSQL)에 배송 추적 데이터를 저장합니다.
  8. AWS IoT를 사용하는 태블릿을 사용하면서 배달을 수행합니다.

이러한 가상의 전자 상거래 회사에서 물건을 구매한 고객이 주문이 이상하다고 고객 센터에 문의를 했습니다.  일부 주문 상품은 실제로 배송되었지만, 보류 중으로 표시 되고, 다른 상품은 배송 된 것으로 표시 되지만 실제로 배송되지 않았다는 것입니다. 데이터 분석가들이 이 문제를 해결하기 위해 아래와 같은 방법을 사용해 보겠습니다.

Athena 통합 질의를 통한 주문 상태 확인하기

데이터 분석가는 Athena의 통합 질의를 사용하여 여러 소스의 레코드를 빠르게 분석 할 수 있습니다. 결과 데이터를 추출하고 Amazon S3에 저장 한 다음 Athena를 사용하여 쿼리 할 수 있는 파이프 라인을 설정할 수 있습니다.

그림 2는 Athena가 Lambda 기반 커넥터를 호출하여 동일한 쿼리에서 온-프레미스 및 클라우드에 있는 데이터 소스와 연결하는 것을 보여줍니다. 여기서는 Athena는 S3에서 데이터를 스캔하고 Lambda 기반 커넥터를 실행하여 EMR, Dynamo DB, MySQL, RedShift, ElastiCache (Redis) 및 Amazon Aurora에서 HBase의 데이터를 읽습니다.

그림 2 : 통합 질의 예.

데이터 분석가는 이 저장소 에있는 다음 커넥터를 등록하고 사용할 수 있으며 다음과 같은 쿼리를 실행할 수 있습니다.

  1. Redis내 모든 주문 내역을받습니다. ( athena-redis 참조)
  2. 정규식 일치 및 추출을 사용하여 Cloudwatch 로그에서 ‘WARN’또는 ‘ERROR’이벤트가있는 주문에 대해 JOIN합니다. ( athena-cloudwatch 참조)
  3. EC2 인벤토리에 가입하여 ‘WARN’또는 ‘ERROR’를 기록한 주문 프로세서의 호스트 이름 및 상태를 가져옵니다. athena-cmdb 참조)
  4. 영향을받는 주문에 대한 고객 연락처 정보를 얻기 위해 DocumentDB를 JOIN합니다. athena-docdb 참조)
  5. 배송 상태 및 추적 세부 정보를 얻기 위해 DynamoDB를 JOIN합니다. athena-dynamodb 참조)
  6. HBase에 JOIN하여 영향을받는 주문에 대한 지불 상태를 얻습니다. athena-hbase 참조)

개별 데이터 소스 커넥터 등록

Athena Query Editor에서 Connect 데이터 소스 흐름 을 사용하여 데이터 소스 커넥터를 등록 할 수 있습니다 .

  1. 쿼리 편집기 에서 데이터 소스 연결 또는 데이터 소스 연결을 선택 하십시오 .
  2. 다음 스크린 샷과 같이 연결하려는 데이터 소스를 선택하십시오. Query Federation SDK를 사용하여 고유 한 데이터 소스 커넥터를 작성하도록 선택할 수도 있습니다 .
  3. UX의 나머지 단계에 따라 등록을 완료하십시오. 그들은 (아래 스크린 샷에서와 같이)를 선택하여 데이터 소스에 대한 커넥터 기능을 구성하는 것을 포함한다 이름 은 AS 카탈로그 이름 쿼리에 사용하고, 설명을 제공한다.

샘플 질의문

데이터 소스 커넥터 등록이 완료되면 고객 서비스 분석가는 다음 샘플 쿼리를 작성하여 하나의 SQL 쿼리에서 영향을받는 주문을 식별하여 조직의 비즈니스 속도를 높일 수 있습니다.

다음은 샘플 통합 질의에 대한 데모입니다.

WITH logs 
     AS (SELECT log_stream, 
                message                                          AS 
                order_processor_log, 
                Regexp_extract(message, '.*orderId=(\d+) .*', 1) AS orderId, 
                Regexp_extract(message, '(.*):.*', 1)            AS log_level 
         FROM 
     "lambda:cloudwatch"."/var/ecommerce-engine/order-processor".all_log_streams 
         WHERE  Regexp_extract(message, '(.*):.*', 1) != 'WARN'), 
     active_orders 
     AS (SELECT * 
         FROM   redis.redis_db.redis_customer_orders), 
     order_processors 
     AS (SELECT instanceid, 
                publicipaddress, 
                state.NAME 
         FROM   awscmdb.ec2.ec2_instances), 
     customer 
     AS (SELECT id, 
                email 
         FROM   docdb.customers.customer_info), 
     addresses 
     AS (SELECT id, 
                is_residential, 
                address.street AS street 
         FROM   docdb.customers.customer_addresses),
     shipments 
     AS ( SELECT order_id, 
                 shipment_id, 
                 from_unixtime(cast(shipped_date as double)) as shipment_time,
                 carrier
        FROM lambda_ddb.default.order_shipments),
     payments
     AS ( SELECT "summary:order_id", 
                 "summary:status", 
                 "summary:cc_id", 
                 "details:network" 
        FROM "hbase".hbase_payments.transactions)
         
SELECT _key_            AS redis_order_id, 
       customer_id, 
       customer.email   AS cust_email, 
       "summary:cc_id"  AS credit_card,
       "details:network" AS CC_type,
       "summary:status" AS payment_status,
       status           AS redis_status, 
       addresses.street AS street_address, 
       shipments.shipment_time as shipment_time,
       shipments.carrier as shipment_carrier,
       publicipaddress  AS ec2_order_processor, 
       NAME             AS ec2_state, 
       log_level, 
       order_processor_log 
FROM   active_orders 
       LEFT JOIN logs 
              ON logs.orderid = active_orders._key_ 
       LEFT JOIN order_processors 
              ON logs.log_stream = order_processors.instanceid 
       LEFT JOIN customer 
              ON customer.id = customer_id 
       LEFT JOIN addresses 
              ON addresses.id = address_id 
       LEFT JOIN shipments
              ON shipments.order_id = active_orders._key_
       LEFT JOIN payments
              ON payments."summary:order_id" = active_orders._key_

또한, Athena는 모든 쿼리 결과를 질의에 지정한 S3 버킷에 저장합니다. 위의 사례에서 S3에 데이터를 수집하도록 요구하는 경우, Athena의 통합 질의문을 사용하여 데이터 소스를 등록하고 S3에 수집하고 CTAS 문 또는 INSERT INTO 문을 사용하여 Glue 카탈로그 뿐만 아니라 파티션 및 메타 데이터를 만들 수 있습니다 데이터 형식을 지원되는 형식 으로 변환 합니다 .

마무리

이 블로그에서는 Athena의 새로운 통합 질의 기능을 소개했습니다.  사례를 통해 Athena 데이터 소스 커넥터를 등록하고 사용하여 통합 질의를 작성하여 Athena를 계정에서 AWS Lambda가 액세스 할 수있는 모든 데이터 소스에 연결하는 방법을 살펴 보았습니다. 마지막으로, 통합 질의를 사용하여 더 빠른 분석을 수행 할 수있을뿐만 아니라 S3에서 데이터 레이크로 데이터를 추출, 변환 및로드 할 수 있습니다.

Athena 통합 질의는 미국 동부 (버지니아 북부) 리전의 미리보기에서 사용할 수 있습니다. Athena FAQ에서 다음 단계에 따라 미리보기를 시작하십시오. 본 기능에 대한 자세한 내용은 여기에서 데이터 소스에 연결 설명서를 참조하세요. 기존 커넥터 사용을 시작하려면 이 데이터 소스에 연결 안내서 활용하시고, Athena Query Federation SDK를 사용하여 자체 데이터 소스 커넥터를 구축하는 방법을 알아 보려면 GitHub에서 Athena 예제 를 직접 실습해 보시기 바랍니다.

– Janak Agarwal, AWS Athena 제품 담당