2. 목차
• 실시간 데이터 분석 개요
• Amazon Kinesis Streams
• Amazon Elasticsearch Service
3. 데이터 분석 적용 분야
• 모바일 사용자 및 웹 클릭 스트림 분석
• 소셜 미디어 분석
• 사물 인터넷(IoT)
• 시스템 및 보안 로그 분석
• 애플리케이션 로그 및 웹 로그 분석
• 일반적인 웹 사이트 검색
• 지식 관리 시스템의 전체-텍스트 검색
4. 스트림 처리 (실시간)
• 데이터 스트림에 있는
이벤트에 실시간 응답
마이크로-배치(준 실시간)
• 데이터 스트림에 있는
이벤트의 작은 배치에 대해
거의 실시간 운영
실시간 분석의 두 가지 주요 처리 패턴
• 예:
• 디바이스 로그에 있는
하드웨어 에러를 사전에
감지
• 재고가 임계값 아래로
떨어질 때 알림
• 예:
• 활동 로그에서 부정행위 식별
• 성능에 대한 SLA 모니터링
6. “Elasticsearch API에 직접
접속하는 것만으로
유연하고 빠르게 서비스를
만들 수 있는 Amazon
Elasticsearch Services를
선택했습니다.”
Sean Curtis,
MLBAM 엔지니어링
부사장
“우리는 쉽고 빠르게
Kinesis를 시작하고 확장할
수 있었습니다. AWS는
Snowplow를 호스팅할 수
있는 좋은 플랫폼입니다.”
Alexander Dean,
Snowplow 창업자
고객의 소리
7. Amazon
Glacier
S3 DynamoDB
RDS
EMR
Amazon
Redshift
Data Pipeline
Amazon
Kinesis
CloudSearch
Kinesis-enabled
app
Lambda ML
SQS
ElastiCache
DynamoDB
Streams
Amazon
Elasticsearch
Service
다양한 분석 도구
9. Amazon Kinesis Streams
스트리밍 데이터 처리 애플리케이션 구축
쉬운 관리: 새로운 스트림을 생성하고, 데이터 처리 속도와 볼륨에 맞는 용량과
파티션 구성
실시간 애플리케이션 구축: Kinesis Client Library, Apache Spark/Storm, AWS
Lambda 등을 사용하여 스트리밍 데이터에서 사용자 정의 레코드 처리를 수행
낮은 비용: 어떤 규모의 워크로드라도 비용 효율적임
클릭 스트림
데이터 전송
클릭 스트림 데이터를
저장 및 노출
KCL 기반 앱으로 실시간
개인화 컨텐츠 생성
개인화된
컨텐츠 제안
10. 데이터
소스
앱#4
[머신 러닝]
AWS엔드포인트
앱#1
[집계 및
중복 제거]
데이터
소스
데이터
소스
데이터
소스
앱#2
[통계 지표
추출]
S3
DynamoDB
Redshift
앱#3
[슬라이딩
윈도우 분석]
데이터
소스
가용 영영
샤드 1
샤드 2
샤드 N
가영 영역 가용 영역
생산자(Producer) Amazon Kinesis Streams 소비자(Consumer)
Amazon Kinesis Streams
실시간 처리를 위한 관리형 서비스
11. 샤드 2
Amazon Kinesis Streams
데이터 보존 및 저장을 위한 관리형 기능
• 스트림은 한개 이상의 샤드로 구성됨
• 각 샤드는 최대 1MB/초, 최대1,000 TPS
데이터 레코드 입력 가능
• 각 샤드는 최대 2 MB/초, 최대 5 TPS
데이터 레코드 배출 가능
• 모든 데이터는 기본으로 24시간동안
저장됨
• 데이터 보존 기간 연장 가능 (최대 7일)
• 샤드들을 분할하거나 병합을 통해 확장
• 보존 기간 내에 있는 데이터 다시 재생
가능
샤드 1
샤드 2
샤드 1
샤드 3
샤드 2
샤드 1
샤드 2
샤드 1
샤드 3
샤드 2
샤드 1
지금-24시간
1:00-7:00 7:00-13:00 13:00-19:00 19:00-1:00
분할
(split)
분할
(split)
병합
(merge)
Kinesis 스트림
13. 관리형 버퍼
• 데이터를 안전하고 확장 가능한
방법으로 취합해서 저장할 수
있는 방법 고려 시 선택
• 집계 및 계산은 모두
소비자(Consumer)에게 위임
• 랜덤 파티션 키 생성 및 사용
• 가능한 샤드들에 균일하게
배포하기 위해, 샤드의 파티션
키에 대해 높은 카디넬리티를
보장해야 함
입력 모델 고려
업무에 따라 파티션 키 선택하는 정책
스트리밍 맵-리듀스
• 자연스럽게 데이터를 집계하는
방법으로 파티션 키를 활용
• 확장할 수 있는 파티션 키 설계
• “핫 파티션 키와 샤드”에 주의
• 예:
빌링 고객마다 파티션 키 배정
장치 ID마다 파티션 키 배정
주식 심볼 당 파티션 키 배정
14. 레코드 순서와 다중 샤드
순서 처리 요건에 따라 파티션 키 선택하는 정책
비순서 처리
• 많은 샤드들에 걸처서 분산하기 위해 랜덤
파티션 키를 사용하고 다중의
작업자(worker)들을 사용
정확한 순서 처리
• 파티션 키를 제어해서 동일한 샤드에 이벤트가
모이고 동일한 작업자가 읽을 수 있게 보장
두 가지 모두 필요? 전역 시퀀스 번호를 적용
전역 시퀀스 번호
얻기
비순서 스트림
캠페인 중심
스트림
부정행위 검사
스트림
이벤트 메타데이터
얻기
Id 이벤트 스트림 – 파티션 키
1 확인 캠페인 중심 스트림 - UUID
2 부정행위
비순서 스트림
부정행위 검사 스트림 – sessionid
생산자
15. Amazon Kinesis Streams 데이터 넣기
Put 인터페이스로 데이터 넣기
• Kinesis 생산자(Producer)는 PUT 호출을 통해서
데이터를 스트림에 저장. 각 레코드 <= 1 MB
• PutRecord {Data,StreamName,PartitionKey}
• PutRecords {Records{Data,PartitionKey},
StreamName}
• 파티션 키는 생산자(producer)에 의해 제공되고
샤드들에 걸처 PUT 레코드들을 분산되는데
사용됨
• PUT 호출이 성공적으로 이루어지면 고유한
시퀀스 번호를 생산자에게 반환
생산자
생산자
생산자
생산자
생산자
생산자
생산자
생산자
생산자
샤드 1
샤드 2
샤드 3
샤드 4
샤드 n
16. PutRecords {Records {Data,PartitionKey}, StreamName}
• 500 레코드 지원
• 레코드 =<1 MB, 전체 요청에 대해서 최대 5 MB
• 다른 파티션 키를 갖는 레코드 포함 가능
• 순서 보장 안 됨
• 성공 응답 – 샤드 ID 및 시퀀스 번호
• 실패 응답
Kinesis PutRecords API
Kinesis에 효율적으로 쓰기 위한 높은 처리량을 제공하는 API
17. • 실패 응답 예
• 재전송하기 위해, PutRecordsResult 오브젝트 조사
• 실패한 레코드를 확인하기 위해, FailedRecordCount 파라미터 검사
• 그리고, ErrorCode != NULL인 각 putRecordsEntry는 후속 요청에 추가 되어야
함
Kinesis PutRecords API (계속)
실패한 레코드 처리
18. 소비자 애플리케이션과 Stream API 사이의 중개자 역할
• 페이로드 크기를 증가시키고 처리량을 향상시키기 위해 사용자 레코드를
한데 모음
• 레코드들을 수집하고 다중의 레코드를 한 번의 요청으로 여러 샤드들에
쓰기위해 PutRecords 이용
• 자동 및 구성 가능한 재시도 메커니즘을 이용하여 하나 이상의 스트림들에
쓰기
• 배치 처리된 레코드들을 분리하기 위해 Amazon KCL와 완벽하게 통합
• 생산자(producer) 성능에 대한 가시성을 제공하기 위해 투명하게
CloudWatch 메트릭 제출
• 예제
https://github.com/awslabs/amazon-kinesis-producer/tree/master/java
Amazon Kinesis Producer Library
19. Amazon Kinesis 에이전트
• 사전 구축된 독립형 Java 애플리케이션
- http://docs.aws.amazon.com/streams/latest/dev/writing-with-agents.html
더 나은 효율성을 위해 넣기 전에 사전 배치 작업 수행:
• Flume,FLuntD 에이전트
- https://github.com/awslabs/aws-fluent-plugin-kinesis
기존 로깅 환경 활용하기
• log4j appender 옵션
- https://github.com/awslabs/kinesis-log4j-appender
Amazon Kinesis에 데이터 넣기
21. Get 인터페이스로 데이터 읽기
• 샤드 기반으로 스트림으로부터 데이터 읽기
• 스트림에서 데이터를 찾아오는 getRecords 와 getShardIterator API 제공:
• getRecords {Limit, ShardIterator}
• getShardIterator {ShardID, ShardIteratorType, StartingSequenceNumber,
StreamName}
• 샤드 반복자(iterator)는 샤드내에서 조회될 레코드의 위치를 결정:
• AT_SEQUENCE_NUMBER : 명시된 시퀀스 번호부터 읽기
• AFTER_SEQUENCE_NUMBER : 명시된 시퀀스 번호 이후부터 읽기
• TRIM_HORIZON : 가장 오래된 레코드부터 읽기
• LATEST : 가장 최근의 레코드부터 읽기
Amazon Kinesis Streams 데이터 읽기 API
22. Kinesis Client Library를 이용한 데이터 읽기 및 처리
내결함성, 적어도 한 번 보장, 실시간 처리를 위한 클라이언트 라이브러리
Shard 1
Shard 2
Shard 3
Shard n
Shard 4
KCL Worker 1
KCL Worker 2
EC2 Instance
KCL Worker 3
KCL Worker 4
EC2 Instance
KCL Worker n
EC2 Instance
Kinesis
Kinesis Client Library (KCL)
• 각 샤드로부터의 코드를 추상화
시킴으로해서 스트림으로부터의 읽기를
간소화시킴
• 각 샤드마다 자동적으로 Kinesis
작업자(worker) 시작
• 샤드의 수가 변경될 때 Kinesis 작업자의
수도 증가 및 감소
• 스트림내의 작업자 위치를 추적하기 위해
체크포인트 사용
• 작업자들이 실패하는 경우 재시작
샤드 1
샤드 2
샤드 3
샤드 4
샤드 n
KCL 작업자 1
KCL 작업자 2
KCL 작업자 3
KCL 작업자 4
KCL 작업자 n
23. Amazon
EMR
Amazon
Kinesis
Streams
HDFS
텀블링/고정
윈도우 집계
주기적인 출력
Amazon
Redshift
EMR에서 COPY
스트리밍 입력
https://github.com/awslabs/kinesis-storm-spout
Apache Spark 및 Storm 과 통합 패턴
데이터
스트림
Amazon
Kinesis Streams
24. AWS Lambda와 통합 패턴
스트림
Amazon
Kinesis
Streams
고객 애플리케이션
Console.log(‘Lo
ading function’);
Exports.handler
= function(…)
AWS Lambda
Lambda 함수
실행 규칙
25. AWS SDK
LOG4J
Flume
Fluentd
Get* APIs
Kinesis Client Library
+
Connector Library
Apache
Storm
Amazon Elastic
MapReduce
보내기 소비하기
AWS
Mobile SDK
Kinesis
Producer
Library
AWS Lambda
Apache
Spark
Amazon Kinesis Streams으로 데이터 넣고 사용하기
26. 4-6 백만 사용자 일일 활동 (DAU)
10억+ 글로벌 설치 (2010년 이후)
47개 샤드
[4] C4.2XL, [2] M3.Large
(ZK), [1] M3.Xlarge (Nimbus)
최대 1.2TB/일
Glu의 실시간 데이터 분석 아키텍처
7억~20억 이벤트/일
600B/이벤트
최대 1.2TB/일
Amazon
Redshift
Backfill
Aggregates
Lightweight Front-End
Real-time
Aggregates
Amazon Kinesis
Storm Spout
Amazon Kinesis
Connectors
Aggregates
30. Elasticsearch 소개
강력한 실시간 분산 기반 검색 및 분석 엔진
• 2010년에 처음 출시되어 인기 오픈 소스 검색 및 분석 엔진으로 성장
• Apache Lucene 기반으로 수백대까지 분산 클러스터를 구성 가능
• 유연한 스키마를 가진 JSON 데이터 스토어
• 개발자 친화적 RESTful API 제공
31. Elasticsearch 특징
강력한 실시간 분산 기반 검색 및 분석 엔진:
• 2010년에 처음 출시되어 인기 오픈 소스 검색 및 분석 엔진으로 성장
• Apache Lucene 기반으로 수백대까지 분산 클러스터를 구성 가능
• 유연한 스키마를 가진 JSON 데이터 스토어
• 개발자 친화적 RESTful API 제공
로그 수집기인 Logstash와 시각화 도구인
Kibana를 연결하여, ELK 스택을 통해 강력한
실시간 데이터 분석이 가능!
32. Amazon Elasticsearch Service는 ES
클러스터를 클라우드에 설치, 운영 및
확장을 용이하고 하는 관리형 서비스로
AWS 여러 서비스와 연계하기에
편리합니다!
Amazon Elasticsearch Service란?
33. 손쉽게
클러스터 설정
및 관리 가능
ELK 스택 지원
AWS IAM을
통한 사용자
인증 및
CloudWatch를
통한 모니터링
다른 AWS
자원과 손쉽게
통합 가능
Amazon Elasticsearch Service의 주요 이점
35. Amazon Elasticsearch 도메인 아키텍처 개요
Amazon Route
53
Elastic Load
Balancing
IAM
CloudWatch
Elasticsearch API
CloudTrail
노드 관리 – 마스터노드+데이터노드
단일 엔드포인트, REST API
IAM 통합
모니터링 – CloudWatch/CloudTrail
36. Shard 1 Shard 2
{
{
Id Id Id . . .
도큐먼트
{
인덱스
• 도큐먼트(document): 검색
단위 문서
• ID: 문서 고유 식별자. 문서당
하나
• 샤드(shard): 인덱스의 한
파트를 갖는 Lucene 인스턴스
• 인덱스(index): 검색 데이터
집합
Amazon Elasticsearch 도메인 내부 용어
샤드 1 샤드 2
38. Amazon Elasticsearch 도메인 접근 제어
사용자 기반 권한 관리
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:123456789012:user/susan"
},
"Action": [ "es:ESHttpGet", "es:ESHttpPut", "es:ESHttpPost",
"es:CreateElasticsearchDomain",
"es:ListDomainNames" ],
"Resource":
"arn:aws:es:ap-northeast-2:###:domain/logs/<index>/*"
} ] }
HTTP 메소드에 따른 허용/거부 및 정책 설정
인덱스에 대한 세부적인 권한 관리
39. Amazon Elasticsearch 도메인 접근 제어
IP 주소 기반 접근 제어 가능
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [ "es:ESHttpGet", "es:ESHttpPut", "es:ESHttpPost",
"es:CreateElasticsearchDomain",
"es:ListDomainNames" ],
"Resource":
"arn:aws:es:ap-northeast-2:###:domain/logs/<index>/*"
"Condition":
"IpAddress": {
"aws:SourceIp": [ "xx.xx.xx.xx/yy" ]
} } ] }
40. 시각화 도구 Kibana 기본 내장
Logstash 인덱서
Amazon
Elasticsearch
Service
애플리케이션 노드/
Logstash 포워더
API
엔드포인트
Kibana URL
• Endpoint search-domain-id.ap-northeast-2.es.amazonaws.com
• Kibana search-domain-id.ap-northeast-2.es.mazonaws.com/_plungin/kibana/
44. Logstash를 통한 데이터 로딩
애플리케이션 노드/
Logstash 포워더
Logstash 인덱서 Amazon
Elasticsearch
Service
https://github.com/awslabs/logstash-output-amazon_es
• Logstash는 다양한 시스템에서
발생하는 로그나 이벤트를
처리할 수 있도록 해주는
데이터 파이프라인
• Elasticsearch 도메인으로
데이터를 쉽게 보낼 수 있도록
함
• Github에 Amazon
Elasticsearch Service를 위한
Logstash 출력 플러그-인 제공
45. AWS Lambda를 통한 데이터 전달
Amazon
Lambda
Amazon
Elasticsearch
Service
Amazon S3
DynamoDB
Amazon
Kinesis
Streams
https://github.com/awslabs/amazon-elasticsearch-lambda-samples
• AWS Lambda는 이벤트에
응답하여 코드를 실행하고
자동으로 기본 컴퓨팅
리소스를 관리하는 서버 없는
컴퓨팅 서비스
• Lambda를 이용해서 AWS
다양한 서비스로부터 데이터를
Elasticsearch 도메인으로 쉽게
전달
• Java, Node.js, 및 python 언어
지원
46. CloudWatch Logs를 통한 데이터 스트리밍
CloudWatch
Logs
Amazon
Elasticsearch
Service
• Amazon CloudWatch Logs를
통해 시스템, 애플리케이션 및
커스텀 로그를 통합하고
모니터링 가능
• AWS의 S3, ELB, VPC Flow logs,
Config 및 CloudTail 등과 같은
다양한 서비스들도
CloudWatch Logs에 통합됨
• Amzon CloudWatch Logs에
통합된 로그 데이터를 쉽게 ES
도메인으로 스트리밍 할 수
있는 기능 제공
47. 13시 ~ 18시
Amazon
Elasticsearch
Service
실시간 분석
Amazon
SNS
푸시 메시지 전송
13시/18시 이벤트 개시/종료 -> 푸시 메시지 전송 -> 데이터 수집 -> 처리 -> 실시간 분석
Lambda
Scheduling
매일 13시/18시
이벤트 개시/종료
Lambda
데이터 처리
매일 12시 30분
게임 서버 확장
Lambda
Scheduling
12시 30분
Kinesis
인게임 이벤트 시스템 아키텍처
데이터 수집