다루는 내용
· 아마존 Kinesis 이해하기
· 아마존 Kinesis 콘솔에서 생성하기
· 아마존 Kinesis CLI로 사용하기
· 아마존 Kinesis Application 개발하기
아마존 Kinesis 이해하기
아키텍트
Kinesis는 대량의 분산된 데이터 스트림을 실시간으로 처리하는 서비스이다. 로그 및 이벤트 데이터를 실시간으로 수집하여 분석하거나, 애플리케이션 및 서비스에서 생성되는 데이터를 수집하여 알림 할 수 있으며, ioT에서 생성되는 방대한 양의 데이터를 실시간으로 수집하여 활용 할 수 있다.
주요 개념
∙ 샤드 (Shard) : 스트림의 기본 처리 단위. 1shard = (read 2MB/s, write 1MB/s), (read 5req/s, write 1000req/s)
number_of_shards = max(incoming_write_bandwidth_in_KB/1000,outgoing_read_bandwidth_in_KB/2000)
∙ 레코드 (Record) : 스트림에 저장되는 데이터의 단위. (시퀀스 번호, 파티션 키, 데이터 Blob)
∙ 시퀀스 번호 (Sequence number) : 각 레코드에 대한 고유 식별자. 레코드 입력시 Kinesis에서 할당.
∙ 파티션 키 (Partition key) : 레코드를 여러 샤드에 분산 입력하기 위해 사용하는 키. producer에서 관리 해주어야 함.
∙ 데이터 Blob (Data blob) : 입력할 실제 데이터. 최대 50KB.
∙ 생성자 (Producer) : Kinesis에 레코드를 입력하는 것. (Web Server, Mobile 등)
∙ 소비자 (Consumer) : Kinesis에서 레코드를 가져와 처리하는 것. Amazon Kinesis Application 으로도 부른다.
아마존 Kinesis 콘솔에서 생성하기
이 문서는 Oregon 리전에서 작성되었음을 참고하기 바란다.
1. 콘솔에서 Kinesis 클릭
2. Create Stream 클릭
∙ Stream Name : kinesis-lab
∙ Number of Shards : 2
∙ Create 클릭
아마존 Kinesis CLI로 사용하기
아마존 Linux AMI로 생성된 EC2 인스턴스를 준비한다.
1. 인스턴스에 SSH 접속
2. 환경 설정
스트림 생성
CLI에서 스트림을 생성할 수 있다. 콘솔에서 생성한 스트림을 먼저 삭제한다.
1. 생성 및 확인
ACTIVE 상태가 되면 샤드에 대한 상세 내용을 보여 준다.
레코드 입력 (producer)
1. 레코드 입력
Producer 부분이다. partition-key는 producer에서 임의로 사용하며(동일한 partition-key를 사용하면 분산 shard를 사용할 수 없다.), SequenceNumber는 스트림에서 자동 생성한다.
레코드 가져오기 (consumer)
1. shard iterator 구하기
shard iterator는 레코드를 읽을 위치를 나타낸다. shard iterator는 300초 동안 유효하다.
2. 레코드 읽기
획득한 shard iterator 값으로 get-records를 실행한다.
aws kinesis get-records –shard-iterator XXXXXXXXXXXXXXXX
producer에서 입력했ata 던 Dblob는 Base64로 인코딩되어 있으므로 디코딩이 필요하다. 실제 입력된 데이터가 많은 경우 결과를 다 보여 주지는 않는다. NextShardIterator으로 다음 데이터셋을 가져올 수 있다.
더 이상 데이터가 없는 경우 위와 같은 결과를 응답한다.
아마존 Kinesis Application 개발하기
지금까지 실습한 내용으로 Kinesis의 개념은 이해하였으나 실제 사용하기엔 부족하다. 예제 Application으로 어떻게 활용하는지 알아 본다.
1. SDK 다운로드
http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip
· lib : aws java sdk 라이브러리 파일이 있다.
· third-party : 예제 소스에서 사용하는 java 라이브러리 파일들이 있다.
· samples : kinesis 예제 소스가 있다.
2. IDE (eclipse 실행)
∙ 소스 임포트 : 예제 소스를 eclipse로 가져온다.
∙ 라이브러리 추가
Add External JARs로 라이브러리를 추가한다.
∙ kinesis library는 https://github.com/awslabs/amazon-kinesis-client 소스를 컴파일 하거나,
http://central.maven.org/maven2/com/amazonaws/amazon-kinesis-client/1.2.1/amazon-kinesis-client-1.2.1.jar 를 다운로드 하면된다.
3. Producer 수정 (AmazonKinesisRecordProducerSample.java)
∙ Credential 정의
해당 소스는 인스턴스의 /root/.aws/credentials 파일을 참조하므로 생성해둔다.
∙ 리전 정의
해당 소스는 리전을 정의하지 않는다. (기본 리전, us-east-1을 사용한다.)
∙ 데이터 입력
적당히 수정해서 사용하자.
4. Consumer 수정 (AmazonKinesisApplicationSample.java)
∙ 스트림명 수정
∙ 리전 정의
5. 소스 컴파일 및 복사
컴파일한 class 파일과 참조할 라이브러리 파일을 EC2 인스턴스로 복사한다.
6. 실행
∙ Producer
java -cp .:./lib/* AmazonKinesisRecordProducerSample
∙ Consumer
java -cp .:./lib/* AmazonKinesisApplicationSample
7. 결과
Producer에서 다량을 데이터를 생성하여 kinesis 스트림으로 입력하고, Consumer에서 kinesis의 스트림을 읽어서 화면에 뿌려준다.
Consumer에서 읽은 data를 DynamoDB에 저장하거나, EMR로 분석할 수 있다.
참고
- Tutorial : http://docs.aws.amazon.com/kinesis/latest/dev/kinesis-sample-application.html
웹 서버의 log를 분석하여 레퍼러 정보를 도식화하는 것을 가정한 예제이다. Producer에서 레퍼러를 랜덤하게 생성하고, Consumer에서 읽은 데이터를 그래프로 표현하는 예제를 CloudFormation으로 제공하므로 쉽게 테스트 해볼 수 있다. - Kinesis : http://docs.aws.amazon.com/kinesis/latest/dev/introduction.html