AWS 기술 블로그

Amazon Redshift 스트리밍 수집을 이용한 실시간 분석

2022년 11월 : 이 블로그는 Amazon Redshift 스트리밍 수집이 정식 출시됨에 따라 도입된 변경 사항을 반영하기 위해 업데이트 되었습니다.

Amazon Redshift는 빠르고 확장이 쉽고 안전한 완전 관리형 클라우드 데이터 웨어하우스로, 표준 SQL을 사용하여 데이터를 간단하고 비용 효율적으로 분석할 수 있는 서비스입니다. Amazon Redshift는 다른 클라우드 데이터 웨어하우스보다 더 나은 가격 대비 성능을 제공하고 있고 이미 수만 고객이 Amazon Redshift를 사용하여 하루에 엑사바이트 규모의 데이터를 처리하고 있으며 고성능 BI 보고서, 대시보드, 데이터 탐색 및 분석과 같은 분석 워크로드에 동력을 제공하고 있습니다.

Amazon Simple Storage Service(Amazon S3)에서 데이터를 스테이징할 필요 없이 Kinesis 데이터 스트림에서 직접 데이터를 수집할 수 있는 Amazon Kinesis Data Streams를 위한 Amazon Redshift 스트리밍 수집을 출시하게 되어 기쁩니다. 스트리밍 수집을 사용하면 초당 수백 메가바이트의 데이터를 수 초의 짧은 지연으로 Amazon Redshift 클러스터로 수집할 수 있습니다.

본 블로그에서는 Kinesis Data Streams 을 생성하고, 스트리밍 데이터를 발생시켜 적재하고, 구체화된 뷰를 생성하고, 스트림을 쿼리하여 결과를 시각화하는 과정을 안내합니다. 또한 스트리밍 수집의 이점과 일반적인 사용 사례를 소개합니다.

스트리밍 수집의 필요성

그동안 많은 고객으로부터 배치 작업 스타일의 분석 과정을 낮은 지연 시간의 스트리밍 처리 방식으로 신속하게 처리할 수 있게 해달라는 요청이 있었습니다. 또한 고객들은 이 스트리밍 데이터를 데이터 웨어하우스의 다른 데이터와 병합하여 실시간 분석의 효과를 극대화하고 싶다고 합니다.

Amazon Redshift 스트리밍 수집의 이용 사례는, 지속적으로 생성되고, 생성 후 짧은 시간 내에 처리되어야 하는 데이터 작업이 해당됩니다. 데이터 소스의 범위는, IoT 장치부터 원격 측정 시스템까지, 그리고 유틸리티 서비스 사용이나 디바이스 위치정보 등에 이르기까지 다양할 수 있습니다.

스트리밍 수집 서비스가 출시되기전까지는 Kinesis Data Streams로 부터 실시간 데이터를 수집하려면 Amazon S3에 데이터를 내리고 COPY 명령을 사용하여 데이터를 적재해야했습니다. 이런 과거의 방식은 일반적으로 몇 분 정도의 지연 시간이 소요되고 또한 적재 후 추가적인 데이터 파이프라인이 필요했습니다. 그러나 이제 데이터 스트림에서 직접 데이터를 수집할 수 있습니다.

솔루션 개요

Amazon Redshift 스트리밍 수집을 사용하면 Amazon S3에 데이터를 내리고 클러스터에 적재할 때 발생하는 적재 지연 시간과 복잡성 없이 Kinesis Data Streams에 직접 연결할 수 있습니다. SQL을 사용하여 스트림 데이터에 연결하고 접근할 수 있으며 스트림을 기반으로 구체화된 뷰를 생성하므로 데이터 파이프라인이 단순해집니다. 구체화된 뷰는 ELT(Extract(추출), Load(적재) 및 Transform(변환)) 파이프라인의 일부로 SQL을 이용한 데이터 변환도 할 수 있습니다.

구체화된 뷰를 정의한 후 뷰 새로 고침으로 최신 스트림 데이터를 쿼리할 수 있습니다. 즉, 추가 비용 없이 SQL을 사용하여 스트리밍 데이터의 다운스트림 처리 및 변환을 수행하고, 실시간 분석을 위해 기존 BI 및 분석 도구를 사용할 수 있습니다.

Amazon Redshift 스트리밍 수집은 스트림 소비자 역할을 수행합니다. 구체화된 뷰는 스트림에서 꺼내진 데이터가 처음 도착하는 곳입니다. 구체화된 뷰를 새로 고치면(Refresh) Amazon Redshift 컴퓨팅 노드가 각 데이터 샤드를 컴퓨팅 슬라이스에 할당합니다. 각 슬라이스는 구체화된 뷰가 패리티(스트림 데이터의 끝)에 도달할 때까지 할당된 샤드의 데이터를 할당 받습니다. 구체화된 뷰의 첫 번째 새로 고침은 스트림의 TRIM_HORIZON (스트림으로 아직 소비되지 않은 영역을 가리킴)에서 데이터를 가져옵니다. 후속 새로 고침은 이전 새로 고침의 마지막 SEQUENCE_NUMBER (시퀀스 번호는 각 레코드의 공유 식별자)에서부터 스트림 데이터의 패리티에 도달할 때까지 데이터를 읽습니다. 다음 다이어그램은 이 워크플로를 설명합니다.

Amazon Redshift에서 스트리밍 수집 설정은 2단계 프로세스로 구성됩니다. 먼저 Kinesis Data Streams에 매핑할 외부 스키마를 생성한 다음 스트림에서 데이터를 가져오기 위한 구체화된 뷰를 생성합니다. 구체화딘 뷰는 점진적으로 유지관리할 수 있어야 합니다.

Kinesis 데이터 스트림 생성

먼저 스트리밍 데이터를 수신할 Kinesis 데이터 스트림을 만듭니다.

  1. Amazon Kinesis 콘솔에서 데이터 스트림을 선택합니다.
  2. 데이터 스트림 생성’을 선택합니다.
  3. 데이터 스트림 이름ev_stream_data를 입력합니다.
  4. 용량 모드는 ‘온디맨드’를 선택합니다.

Kinesis Data Generator로 스트리밍 데이터 생성

참고: Kinesos Data Generator는 Amazon Kinesis Streams이나 Amazon Kinesis Firehose 같은 스트리밍 데이터 솔루션을 구축시 필요한 테스트를 연속 스트림으로 쉽게 생성해서 테스트를 도와주는 오픈 소스 도구로, 브라우저에서 직접 실행하는 사용자 친화적 UI를 제공합니다. 아래 Json 포맷을 KDG 에 입력하여, ‘Send Data’ 버튼을 클릭하면 스키마와 min/max 규칙에 맞는 데이터가 생성되어 Kidnesis Data Streams로 데이터 스트림을 전송합니다. KDG 사용에 관한 자세한 내용은 아래 Link 에서 확인하시기 바랍니다.

Amazon Kinesis Data Generator(KDG) 유틸리티와 아래 템플릿에 명시된 규칙에 따라 JSON 형식의 데이터를 만들 수 있으며 템플릿은 다음과 같습니다.

{
   "_id" : "{{random.uuid}}",
   "clusterID": "{{random.number(
        {   "min":1,
            "max":50
        }
    )}}", 
    "connectionTime": "{{date.now("YYYY-MM-DD HH:mm:ss")}}",
    "kWhDelivered": "{{commerce.price}}",
    "stationID": "{{random.number(
        {   "min":1,
            "max":467
        }
    )}}",
      "spaceID": "{{random.word}}-{{random.number(
        {   "min":1,
            "max":20
        }
    )}}",
   "timezone": "America/Los_Angeles",
   "userID": "{{random.number(
        {   "min":1000,
            "max":500000
        }
    )}}"
}

아래 스크린샷은 Kinesis Data Generator 콘솔의 템플릿입니다.

참조 데이터 적재

앞 단계에서는 Kinesis Data Generator를 사용하여 만든 데이터를 스트림에 적재하는 방법을 보여드렸습니다. 이 섹션에서는 전기 자동차 충전소와 관련된 참조 데이터를 적재합니다.

Austin 시의 개방형 데이터 포털에서 Plug-In EVerywhere Charging Station Network 데이터를 다운로드합니다. 데이터 세트의 위도와 경도 값을 분할하고 테스트를 위한 임의의 siteid 값을 추가하여 이 테이블에 적재합니다.

CREATE TABLE ev_station
  (
     siteid                INTEGER,
     station_name          VARCHAR(100),
     address_1             VARCHAR(100),
     address_2             VARCHAR(100),
     city                  VARCHAR(100),
     state                 VARCHAR(100),
     postal_code           VARCHAR(100),
     no_of_ports           SMALLINT,
     pricing_policy        VARCHAR(100),
     usage_access          VARCHAR(100),
     category              VARCHAR(100),
     subcategory           VARCHAR(100),
     port_1_connector_type VARCHAR(100),
     voltage               VARCHAR(100),
     port_2_connector_type VARCHAR(100),
     latitude              DECIMAL(10,6),
     longitude             DECIMAL(10,6),
     pricing               VARCHAR(100),
     power_select          VARCHAR(100)
  ) DISTSTYLE ALL

구체화된 뷰 (Materialized View) 생성

SQL을 사용하여 데이터 스트림에 접근하고 바로 구체화된 뷰를 생성함으로써 데이터 파이프라인을 단순하게 만들 수 있습니다. 다음 단계를 완료하십시오.

  1. 외부 스키마를 만들어서 Kinesis Data Stream에서 Amazon Redshift Object로 매핑합니다.
    CREATE EXTERNAL SCHEMA evdata FROM KINESIS
    IAM_ROLE 'arn:aws:iam::0123456789:role/redshift-streaming-role';
  2. AWS Identity and Access Management (IAM) 역할을 생성하고 스트리밍 수집 시작하기를 참고하여 정책을 설정합니다. 이제 구체화된 뷰를 생성하여 스트림 데이터를 사용할 수 있습니다. SUPER 데이터타입을 사용하여 페이로드를 JSON 형식 그대로 저장하거나 Amazon Redshift JSON 함수를 사용하여 JSON 데이터를 개별적인 열로 구문 분석하도록 선택할 수 있습니다. 스키마가 잘 정의되어 있으므로 본 블로그에서는 두 번째 방법을 사용합니다.
  3. 스트림의 UUID가 분산키가 되고 refresh_time가 정렬키가 되도록 구체화된 뷰를 생성합니다. refresh_time은 레코드를 적재한 구체화된 뷰가 새로 고침된 시작 시간입니다. 구체화된 뷰는 자동 새로 고침으로 설정되며 데이터가 스트림에 도착하면 새로 고쳐집니다.
    CREATE MATERIALIZED VIEW ev_station_data_extract DISTKEY(6) sortkey(1) AUTO REFRESH YES AS
        SELECT 
        refresh_time,
        approximate_arrival_timestamp,
        partition_key,
        shard_id,
        sequence_number,
        json_extract_path_text(from_varbyte(kinesis_data, 'utf-8'),'_id',true)::character(36) as ID,
        json_extract_path_text(from_varbyte(kinesis_data, 'utf-8'),'clusterID',true)::varchar(30) as clusterID,
        json_extract_path_text(from_varbyte(kinesis_data, 'utf-8'),'connectionTime',true)::varchar(20) as connectionTime,
        json_extract_path_text(from_varbyte(kinesis_data, 'utf-8'),'kWhDelivered',true)::DECIMAL(10,2) as kWhDelivered,
        json_extract_path_text(from_varbyte(kinesis_data, 'utf-8'),'stationID',true)::DECIMAL(10,2) as stationID,
        json_extract_path_text(from_varbyte(kinesis_data, 'utf-8'),'spaceID',true)::varchar(100) as spaceID,
        json_extract_path_text(from_varbyte(kinesis_data, 'utf-8'),'timezone',true)::varchar(30) as timezone,
        json_extract_path_text(from_varbyte(kinesis_data, 'utf-8'),'userID',true)::varchar(30) as userID
        FROM evdata."ev_stream_data" 
        WHERE LENGTH(kinesis_data) < 65355;

    위의 필터는 65355 바이트보다 작은 레코드를 필터링합니다. 이는 json_extract_path_text가 varchar 데이터 유형으로 제한되기 때문입니다. 구체화된 뷰가 정의되어야 타입 변환 오류가 없습니다. 페이로드가 크고 스키마가 변경된다면 json_parse 함수를 사용하여 데이터를 SUPER 데이터 유형으로 지정하여 구체화된 뷰를 만드는 것이 더 안전합니다.

  4. 위의 구체화된 뷰는 아래와 같이 재작성될 수 있습니다.
    CREATE MATERIALIZED VIEW ev_station_data_extract sortkey(1) AUTO REFRESH YES AS
        SELECT 
        refresh_time,
        approximate_arrival_timestamp,
        partition_key,
        shard_id,
        sequence_number,
        json_parse(kinesis_data) as payload
        FROM evdata."ev_stream_data" 
        WHERE CAN_JSON_PARSE(kinesis_data);
    		

스트리밍 수집을 위한 구체하된 뷰 고침

구체화된 뷰는 KDS 스트림에 새 데이터가 있는 한 자동으로 새로 고쳐집니다. 자동 새로 고침을 비활성화하고 수동 새로 고침을 실행하거나 Redshift Console UI를 사용하여 수동 새로 고침을 예약할 수도 있습니다.

스트림에 쿼리하기

이제 새로 고쳐진 구체화된 뷰를 쿼리하여 사용량 통계를 얻을 수 있습니다.

SELECT to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS') AS connectiontime
,SUM(kWhDelivered) AS Energy_Consumed
,COUNT(distinct userID) AS #Users
FROM ev_station_data_extract
GROUP BY to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS')
ORDER BY 1 DESC;

아래 테이블은 결과입니다.

connectiontime energy_consumed #users
2022-02-27 23:52:07+00 72870 131
2022-02-27 23:52:06+00 510892 998
2022-02-27 23:52:05+00 461994 934
2022-02-27 23:52:04+00 540855 1064
2022-02-27 23:52:03+00 494818 999
2022-02-27 23:52:02+00 491586 1000
2022-02-27 23:52:01+00 499261 1000
2022-02-27 23:52:00+00 774286 1498
2022-02-27 23:51:59+00 505428 1000
2022-02-27 23:51:58+00 262413 500
2022-02-27 23:51:57+00 486567 1000
2022-02-27 23:51:56+00 477892 995
2022-02-27 23:51:55+00 591004 1173
2022-02-27 23:51:54+00 422243 823
2022-02-27 23:51:53+00 521112 1028
2022-02-27 23:51:52+00 240679 469
2022-02-27 23:51:51+00 547464 1104
2022-02-27 23:51:50+00 495332 993
2022-02-27 23:51:49+00 444154 898
2022-02-27 23:51:24+00 505007 998
2022-02-27 23:51:23+00 499133 999
2022-02-27 23:29:14+00 497747 997
2022-02-27 23:29:13+00 750031 1496

다음으로 구체화된 뷰를 참조 데이터와 조인하여 지난 5분간 충전소 소비 데이터를 분석하고 충전소 범주별로 분류할 수 있습니다.

SELECT to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS') AS connectiontime
,SUM(kWhDelivered) AS Energy_Consumed
,count(distinct userID) AS #Users
,st.category
FROM ev_station_data_extract ext
JOIN ev_station st
ON ext.stationID = st.siteid
WHERE approximatearrivaltimestamp > current_timestamp -interval '5 minutes'
GROUP BY to_timestamp(connectionTime, 'YYYY-MM-DD HH24:MI:SS'),st.category
ORDER BY 1 DESC, 2 DESC;

아래와 같이 결과를 볼 수 있습니다.

connectiontime energy_consumed #users category
2022-10-28 04:03:31+00 3312 7 Workplace
2022-10-28 04:03:31+00 855 1 Workplace
2022-10-28 04:03:31+00 643 1 Parking
2022-10-28 04:03:31+00 291 1 Multifamily Commercial
2022-10-28 04:03:30+00 1732 5 Workplace
2022-10-28 04:03:30+00 1243 2 Multifamily Commercial
2022-10-28 04:03:30+00 902 1 Parking
2022-10-28 04:03:30+00 823 1 Parking
2022-10-28 04:03:30+00 311 1 Healthcare
2022-10-28 04:03:28+00 1682 2 Multifamily Commercial
2022-10-28 04:03:28+00 1079 2 Parking
2022-10-28 04:03:28+00 690 3 Workplace
2022-10-28 04:03:28+00 640 1 Municipal
2022-10-28 04:03:28+00 557 1 Workplace
2022-10-28 04:03:28+00 163 1 Retail

시각화

Amazon QuickSight를 이용해서 간단하게 시각화를 할 수 있습니다. Quick start: Create an Amazon QuickSight analysis with a single visual using sample data를 참고해서 만듭니다. QuickSight에서 구체화된 뷰를 충전소 참조 데이터와 조인하여 데이터 세트를 만듭니다.

그런 다음 시간 경과에 따른 에너지 소비 및 연결된 사용자 수를 보여주는 대시보드를 만듭니다. 대시보드에는 카테고리별로 지도의 위치 목록도 표시됩니다.

스트리밍 수집의 혜택

이번 섹션에서는 스트리밍 수집의 혜택에 대해 알아보겠습니다.

저지연 고대역폭 성능

Amazon Redshift는 Kinesis Data Streams에서 초당 수 기가 바이트의 데이터를 처리할 수 있습니다. (처리량은 데이터 스트림의 샤드 수와 Amazon Redshift 클러스터 구성에 따라 다릅니다) 이를 통해 스트리밍 데이터를 사용할 때 짧은 지연 시간과 높은 대역폭을 경험할 수 있으므로 수 분이 아닌 수 초 만에 데이터에서 통찰력을 얻을 수 있습니다.

앞서 언급했듯이 Amazon Redshift에서 직접 수집 풀 방식을 사용할 때의 주요 장점은 짧은 지연 시간(초 단위)입니다. 이 방식은, 스트리밍 데이터를 사용하는 프로세스를 생성하고, Amazon S3에서 데이터를 내린 다음, COPY 명령을 실행하여 데이터를 Amazon Redshift로 적재하는 접근 방식과 대비됩니다. 이 접근 방식은 데이터 처리와 관련된 여러 단계를 거쳐야 하므로 수 분의 대기 시간이 발생합니다.

직접적인 구성

쉽게 시작할 수 있습니다. Amazon Redshift의 모든 설정 및 구성은 대부분의 클라우드 데이터 웨어하우스 사용자가 이미 익숙한 SQL을 사용합니다. 복잡한 파이프라인을 관리하지 않고도 수 초 만에 실시간 통찰력을 얻을 수 있습니다. Kinesis Data Streams이 포함된 Amazon Redshift는 완전 관리형이므로 인프라 관리 없이 스트리밍 애플리케이션을 실행할 수 있습니다.

향상된 생산성

새로운 기술이나 언어를 배울 필요 없이 Amazon Redshift 내에서 스트리밍 데이터와 기존의 친숙한 SQL을 사용하여 풍부한 분석을 수행할 수 있습니다. 다른 구체화된 뷰 또는 구체화된 뷰에 대한 뷰(View)를 생성하고 SQL을 작성하여 Amazon Redshift 내에서 대부분의 ELT 데이터 파이프라인 변환 작업을 수행할 수 있습니다.

스트리밍 수집의 사용 사례

스트리밍 데이터에 대한 실시간 분석으로 다양한 산업 분야 애플리케이션을 만들 수 있습니다. 다음은 많은 애플리케이션 사용 사례 중 일부입니다.

  1. 게임 경험 향상 – 게이머의 실시간 데이터를 분석하여 인 앱 구매율, 플레이어 잔존율 및 게임 경험 최적화에 집중할 수 있습니다.
  2. 온라인 광고에 대한 클릭스트림 사용자 데이터 분석 – 평균적인 고객은 단일 세션에서 수십 개의 웹사이트를 방문하지만, 마케터는 일반적으로 자신의 웹사이트만 분석합니다. 웨어하우스로 수집된 승인된 클릭스트림 데이터를 분석하여 고객의 이동 경로와 행동을 평가하고 적시에 고객에게 광고를 타겟팅할 수 있습니다.
  3. 스트림화된 POS 데이터에 대한 실시간 소매 분석 – 실시간 분석, 보고서 및 시각화를 위해 모든 글로벌 POS(판매 시점 데이터) 소매 판매 거래 데이터를 바로 사용하여 시각화할 수 있습니다.
  4. 실시간 애플리케이션 통찰력 제공 – 애플리케이션 로그 파일 및 네트워크 로그에서 스트리밍 데이터에 접근하고 분석하는 기능을 통해 개발자와 엔지니어는 실시간으로 문제를 해결하고 더 나은 제품과 예방 조치를 위한 경고 시스템을 제공할 수 있습니다.
  5. IoT 데이터 실시간 분석 – Amazon Redshift 스트리밍 수집기능은 위치 및 센서 데이터, 애플리케이션 모니터링, 사기 탐지, 라이브 리더보드와 같은 속성이나 디바이스 상태를 다루는 실시간 애플리케이션에 사용할 수 있습니다. Kinesis Data Streams를 사용하여 스트리밍 데이터를 수집하고, Amazon Kinesis Data Analytics를 사용하여 처리하고, Kinesis Data Streams를 사용하여 다양한 데이터 저장소나 애플리케이션에 결과를 전송할 수 있습니다.

결론

이 블로그는 Amazon Redshift 스트리밍 수집을 사용하여 Kinesis Data Streams에서 데이터를 수집하기 위해 Amazon Redshift 구체화된 뷰를 생성하는 방법을 설명하였습니다. 이 기능을 사용하면 데이터 파이프라인을 쉽게 구축하고 유지 관리하여 짧은 대기 시간과 높은 처리량으로 스트리밍 데이터를 수집하고 분석할 수 있습니다.

Amazon Redshift 스트리밍 수집 기능은 이제 Amazon Redshift를 사용할 수 있는 모든 AWS 리전에서 사용할 수 있습니다. Amazon Redshift 스트리밍 수집을 시작하려면 현재 트랙에서 Amazon Redshift 클러스터를 프로비저닝하고 클러스터가 버전 1.0.43980 이상을 실행 중인지 확인하십시오.

더 자세한 정보는 스트리밍 수집을 참고하십시오.

원문 : https://aws.amazon.com/ko/blogs/big-data/real-time-analytics-with-amazon-redshift-streaming-ingestion/

SeongHee Kang

SeongHee Kang

강성희 Partner SA 는 데이터 베이스 제품 엔지니어와 대용량 정보계 시스템 / 빅데이터 플랫폼 솔루션 엔지니어로 다양한 인더스트리에서 구축과 프리세일즈를 모두 경험하였으며 현재는 AWS Partner Core 팀에서 파트너사 엔지니어들의 Analytic 서비스 역량 강화를 위해 일하고 있습니다.