top of page

우리는 서버리스 시대에 살고 있습니다. “Kinesis” 서버 없는 파이프라인

우리는 서버리스 시대에 살고 있습니다. “Kinesis” 서버 없는 파이프라인

우리는 서버리스 시대에 살고있습니다. "Kinesis" 서버 없는 파이프라인


Written by Minhyeok Cha


원래는 바로 작성하려 했으나, 회사 일정이 겹쳐서 시간이 많이 지났습니다. 한 달 정도 지나긴 했지만, 바로 이어서 Kinesis Data Stream에 대한 설명과 다른 서비스와의 조합 사례를 작성해 보겠습니다.


Kinesis는 이전 블로그에서도 언급했듯이, Kafka에서 한번 늘린 파티션(partition)은 다시 줄일 수 없습니다. 반면 Kinesis의 샤드(shard)는 유입되는 데이터의 양에 따라 증설 및 감축이 자유롭기 때문에 운영과 비용 관리가 용이합니다.

💡 데이터 스트림을 처음 접하신다 하면 설치와 구성, 운영이 편한 Kinesis로 시작하는 것을 추천드립니다.

Kinesis Data Stream은 리소스 자체를 생성하는 것은 간단하지만, 데이터 인・아웃풋 과정은 SDK, API 사용을 요구하기 때문에 테스트로 제공되는 툴을 사용한 데모와 몇 가지 사용 사례를 통해 쉽게 설명하겠습니다.


지금부터 몇 가지 사례와 간단한 데모를 통해 쉽게 설명해 보겠습니다.


Kinesis Data Stream 내부 흐름 이론

AWS Kinesis Data Stream 또한 이전의 MSK와 마찬가지로 라이브 데이터 스트리밍 전송이 가능하여, 실시간 데이터를 AWS 클라우드로 스트리밍하거나 실시간 비디오 처리를 담당하는 완전 관리형 서비스입니다.

Kinesis Data Stream 내부 흐름 이론
설명을 위해 이전 블로그에 올린 플로우 차트를 가져왔습니다.

프로듀서가 데이터를 보내면 해시 함수(hash function)를 거쳐 위와 같이 레코드 값에 파티션 키(Partition Key)를 추가하고, 샤드 ID와 시퀀스 번호(Sequence Number)가 반환됩니다.


파티션 키(Partition Key)

파티션 키는 레코드를 특정 샤드에 할당하는 데 사용됩니다. Kinesis는 파티션 키를 해싱하여 해당 레코드가 어느 샤드에 들어갈지를 결정합니다. 같은 파티션 키를 가진 레코드들은 동일한 샤드로 보내집니다. 이를 통해 특정 파티션 키와 연관된 데이터가 같은 샤드에 위치하도록 보장할 수 있습니다.


시퀀스 번호(Sequence Number)

각 레코드가 Kinesis Data Stream에 추가될 때 Kinesis에 의해 자동으로 할당되는 고유한 번호이며 다음과 같은 역할을 합니다.

  1. 순서 보장: 동일한 샤드 내에서 레코드들이 삽입된 순서대로 읽히도록 보장합니다. 소비자는 시퀀스 번호를 사용하여 레코드의 순서를 추적하고, 필요에 따라 특정 시퀀스 번호 이후의 레코드를 읽을 수 있습니다.

  2. 중복 방지: 동일한 레코드가 여러 번 처리되지 않도록 하기 위해 사용될 수 있습니다. 예를 들어, 소비자는 마지막으로 처리한 레코드의 시퀀스 번호를 저장하고, 이후 처리할 때 이 값을 기준으로 새로운 레코드만 읽을 수 있습니다.


소비자가 데이터를 읽을 때 (SDK)

소비자는 특정 샤드에서 순차적으로 데이터를 스트리밍합니다. 이는 소비자의 SDK를 통해 조율할 수 있으며, 상세한 내용은 링크를 참고하시기 바랍니다.

소비자가 데이터를 읽을 때 (SDK)
대충 이런 느낌입니다!

AT_SEQUENCE_NUMBER: 필드에 지정된 시퀀스 번호가 표시된 위치부터 스트리밍을 시작합니다 .

AFTER_SEQUENCE_NUMBER: 필드에 지정된 시퀀스 번호가 표시된 위치 바로 뒤에서 스트리밍을 시작합니다 .

AT_TIMESTAMP: 필드에 지정된 타임스탬프가 표시된 위치부터 스트리밍을 시작합니다 .

TRIM_HORIZON: 샤드에서 트리밍되지 않은 마지막 레코드(샤드에서 가장 오래된 데이터 레코드)에서 스트리밍을 시작합니다.

LATEST: 항상 샤드의 최신 데이터를 읽을 수 있도록 샤드의 가장 최근 기록 바로 다음에 스트리밍을 시작합니다.


Starting Position (AWS SDK for Java - 2.25.57)

※ SDK로 Consumer를 조율하시는 분들은 필수입니다.


Kinesis는 에이전트와 라이브러리, 데이터 파이프라인 구조를 쉽게 만들 수 있는 방법을 제공합니다. 이를 통해 콘솔 상에서도 간편히 사용할 수 있어 Low 레벨의 API를 사용하는 것보다 구성이 더 쉬워졌습니다.

해당 화면은 Kinesis Data Stream을 구성한 후 확인할 수 있습니다.
해당 화면은 Kinesis Data Stream을 구성한 후 확인할 수 있습니다.

Kinesis 사용사례

아실 분들은 아시겠지만, AWS Kinesis는 Data Stream뿐만 아니라 Firehose, Apache Flink 총 세 가지의 작동 방식을 갖고 있습니다.

  1. Kinesis Firehose 데이터 전송에 특효

  2. Kinesis Apache Flink 스트리밍 애플리케이션 빌드 및 실행

Firehose는 간단하지만, Apache Flink는 Apache Zeppelin 대시보드를 사용해 코드 영역까지 다루기 때문에 설명이 길어질뿐더러 이번 글의 주요서비스가 아니기 때문에 설명은 생략하겠습니다.

이를 참고하여 두 가지 사용 사례를 아키텍처와 함께 설명하겠습니다.


Kinesis Firehose를 사용한 경우

Kinesis Firehose를 사용한 경우 - 아키텍쳐

개인적으로 가장 자주 사용하며 쉬운 구성이라고 생각합니다.

Firehose는 자체적으로 소스 및 대상을 지정할 수 있기 때문에 연결이 간단합니다.

자체적으로 소스 및 대상을 지정할 수 있어 연결이 간단한 Firehose

뿐만 아니라 Firehose를 사용하여 소비자가 직접 샤드를 할당하는 것이 아닌 Stream단위로 선택하여 워크플로우를 연결할 수 있어 매우 편리합니다.

위 설명에 있듯 각각의 샤드가 갖고 있는 데이터가 다르기 때문에 SDK, API 등으로 데이터를 가져올 경우 shard_Id를 지정하여 가져오거나 shard 개수만큼 for loop 문을 사용해 가져와야 합니다.

앞뒤에 Kinesis Data Stream이 있는 경우

앞뒤에 Kinesis Data Stream이 있는 경우 - 아키텍쳐

Apache Flink에서 Data Stream에 데이터를 KPL을 통해 다시 저장합니다.

이 방식은 위의 Firehose처럼 간단한 작업은 아니지만 Data Stream에 다시 연결하면서 AWS 타 서비스와의 연결점을 만드는 파이프라인 구축에 용이합니다.

또한 위의 사례처럼 Firehose를 사용해 각기 다른 서비스를 사용할 수 있다는 장점도 있습니다.



Kinesis 찍먹 데모

데모: Kinesis Firehose 사례를 설명하고, Glue Crawler를 사용해 Athena로 데이터를 출력하는 과정

데모에서는 Kinesis Firehose 사례를 설명하고, Glue Crawler를 사용해 Athena로 데이터를 출력하는 과정을 보여드릴까 합니다.

앞에 빨간색 서비스 아이콘이 있어도 걱정하지 마세요. 자동으로 만들어진 친구들이 있기 때문에 쉽게 끝낼 수 있습니다.


1. Kinesis Duo를 먼저 생성해야 합니다.

Kinesis Duo를 먼저 생성합니다. 이때, Data Stream의 용량모드는 온디맨드로 선택합니다.

Data Stream은 온디맨드로 걸어주세요. 진짜 아무것도 작성 없이도 바로 만들어집니다.


Firehose 생성(저는 사전에 깡통 S3를 만들어 두었습니다.)
Firehose 생성(저는 사전에 깡통 S3를 만들어 두었습니다.)

Firehose도 위 아키텍처처럼 연결 구성만 해주시고 하단에 S3를 선택해 주시면 됩니다.


2. Amazon Kinesis Data Generator

처음 보는 Kinesis가 나왔지만 놀라지 않으셔도 됩니다. Kinesis Data Generator는 Kinesis에 데이터를 쉽게 삽입할 수 있도록 도와주는 도구입니다. 이를 사용해 데모를 계속 진행해 보겠습니다.


올린 링크를 들어가셔서 cloudformation 템플릿 설치 및 실행 후 cognito 계정 세팅 후 Output에 출력된 링크에 들어가 로그인하여 계속 진행해 주시면 되겠습니다.

해당 링크에 들어가셔서 CloudFormation 템플릿을 다운받아 진행하시면 됩니다.

※ 해당 링크에 들어가셔서 CloudFormation 템플릿을 다운받아 진행하시면 됩니다.



링크의 내용대로 모두 진행한 후 레코드를 보내면, 웹 개발자 도구를 통해 다음과 같이 확인할 수 있습니다.

링크의 내용대로 모두 진행한 후 레코드를 보내면, 웹 개발자 도구를 통해 다음과 같이 확인할 수 있습니다.

Kinesis와 S3에도 데이터가 잘 도달했는지 체크해주세요.


3. Glue 세팅 및 크롤링 DB

S3를 연결하고 크롤링한 데이터를 적재할 DB를 생성한 뒤 사진 상단에 보이는 “Run Crawler” 버튼을 눌러 S3의 데이터를 크롤링합니다

Glue와 크롤러 설정은 간단합니다. S3를 연결하고 크롤링한 데이터를 적재할 DB를 생성한 뒤 사진 상단에 보이는 “Run Crawler” 버튼을 눌러 S3의 데이터를 크롤링합니다.


Athena 쿼리 조회 결과: 데이터가 Glue 크롤링 DB에 잘 쌓인 모습

Athena 쿼리 조회 결과, 데이터가 Glue 크롤링 DB에 잘 쌓인 모습을 확인할 수 있습니다.



마무리

이전에 작성한 블로그에서 제가 다음과 같은 말을 한 적이 있습니다.

"Kinesis Data Streams에서는 샤드의 개수 조율이 가능합니다."

추가된 샤드에 들어오는 레코드는 새로운 샤드 중 하나에 할당되고, 이는 파티션 키의 해시 값을 기준으로 결정됩니다.


Amazon Kinesis Data Streams 온디맨드가 자동 확장이 가능

제가 처음 AWS 입문했을 때, Kinesis는 수동으로 샤드를 조정 후 Lambda를 통해 Auto Scaling을 하여 조율하도록 세팅했었습니다. 그러나 이제는 Amazon Kinesis Data Streams 온디맨드가 자동 확장이 가능하다는 것을 알게 되었습니다.


MSK와 달리 이런 부분이 비용 절약 및 운영에 많은 도움이 될 것 같습니다.


데모에서도 처음에는 SDK나 Agent를 사용하여 데이터를 삽입하려 했으나, 이것저것 검색해 보니 Amazon Kinesis Data Generator라는 도구 발견하여 쉽게 테스트할 수 있었습니다.


추가적으로 써보는 개인적인 후기

보통 스트림 데이터는 MSK와 Kafka를 많이 사용하기에 저도 Kinesis를 사용해본 것은 AWS 입문 직전에 한두 번 해본 이후로 오랜만이었습니다.


AWS 콘솔은 오랜만에 들어가면 콘솔 창이 수시로 업데이트가 되기 때문에 옛날 기억을 더듬어도 힘들더라구요. 그래서 매번 웹서핑하듯 한 번씩 둘러보면서 무엇이 변경되었는가 확인하는 것도 좋을 듯 합니다.


84 views0 comments

Comments


bottom of page