Spark

실시간 처리 프레임워크 비교

Sencia 2021. 3. 25. 12:16
반응형

 

 이 글은 popit에 게시된 아래 블로그를 정리한 글이다. 

www.popit.kr/%EC%95%84%ED%8C%8C%EC%B9%98-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EC%B2%98%EB%A6%AC-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EB%B9%84%EA%B5%90%EB%B6%84%EC%84%9D-1/

 

실시간 처리 프레임워크는 streaming model에 따라 크게 두가지 방식으로 구분된다. 

 

Streaming Model 

1) Native stream processing systems  

- 유입되는 모든 records, event를 스트리밍에 도착하는 시점에 하나씩 처리하는 native stream 방식

 

출처: http://www.cakesolutions.net/teamblogs/

 

2) Micro-batching 

- 유입되는 records를 짧은 주기의 batch로 처리 가능산 단위로 묶어 스트리밍으로 보내는 방식 

출처: http://www.cakesolutions.net/teamblogs/

 

구분  장점  단점
native stream processing system  모든 로직 가능 
데이터가 유입되는 즉시 처리하여 mricro-batching보다 latency(지연)가 적음 
상태 관리에 대한 구현이 쉬움 
throughput 낮음 
장애처리시 어려움 
특정 키를 갖고 파티셔닝 처리를 할 경우 특정 키에 데이터가 집중되면 job의 병목요소가 됨 
micro-batching  로직에 제약 
상태관리, join, split 등 특정 오퍼레이션 구현이 어려움 
batch의 주기는 인프라의 상태, 비즈니스 로직과 관계
장애복구 빠름 
로드밸런싱 용이 

 

 

실시간 처리 프레임워크를 위 방식에 따라 구분해보면 아래와 같다. 

(출처: http://www.cakesolutions.net/teamblogs/

 

구분 Apache storm Trident  Spark  Samza Flink
Streaming model  native  micro-batching micro-batching native micro-batching
API  Compositional Compositional Declarative  Compositional Declarative
Guarantee At-least-once  Exactly-once  Exactly-once  At-least-once  Exactly-once 
Fault Tolerance Record ACKs Record ACKs RDD based Checkpointing  Log-based
(kafka 활용) 
Checkpointing 
Satate Management 
(상태관리) 
Not build-in Dedicated Operators  Dedicated Dstream Stateful Operators Stateful Operators
Latency  Very low  Medium  Medium Low Low
Throughput  Low  Medium  High Medium  Low
Maturity  High High High Medium  Low 

 


Fault Tolerance  &  State Management 

 

Native 방식의 경우 fault tolerance 측면에서 mricro-batching 방식보다 까다롭다. 

Fault tolerance 측면에서 각 스트리밍 프레임워크를 비교해보자면 

 

Record ACKS with Apache storm and Trident 

하나의 oprerator는 모든 record에 대해 처리가 된 시점에 해당 record를 보내온 이전 operator에 ACK 신호를 전송한다. 

ACK 신호를 받으면 해당 record의 백업본을 폐기할 수 있다. 

만약 ACK를 받지 못할 경우 재처리가 가능하다.

 

데이터 유실이 적으나 중복이 발생할 수 있는 방식이다. 

이런 방식을 "At-least-once"라고 부르며 중복제거에 대한 로직이 별도로 필요하다. 

다만 데이터의 흐름에 ACK 체크가 들어가다 보니 thoroghput이 낮은 것이 단점이다. 

Storm's Reliable Processing

 

 

RDD based-checkpointing with Spark 

micro-batching 방식으로 데이터 처리를 하므로 각 batch job에 대해 성공/실패에 대한 상태 관리를 한다. 

실패한 micro-batch job은 새로운 worker node가 재실행하며 데이터 중복이 발생하지 않는 방식이다. 

앞서 설명한 Record ACKS 방식에 비해 장애 처리가 수월하며 이로 인해 throughput이 높다. 

Spark Streaming's Reliable Processing

 

상태관리 또한 micro-batching으로 관리하여 각 Job별로 수행 결과와 상태를 관리한다. 

 

 

 

Log-based with Samza

Samza는 offset 기반의 메시징 시스템을 활용하며 보통 kafka를 사용한다. 

Kafka는 iunput stream의 partition별로 offset을 저장하는데, Samza는 이 offset을 모니터링하다가 실패하면 이 offset을 참조하여 데이터 재처리를 진행한다. 

하지만 offset을 기준으로 처리하여도 데이터 중복이 발생할 수 있으며 데이터 누락의 위험은 낮다. 

 

 

Samza's Reliable Processing

 

CheckPointing with Flink 

Flink는 checkpoint barrier를 전송하고 각 operator들은 해당 checkpoint에 해당하는 stream 데이터를 처리한다.

Storm과 Spark의 방식의 중간점에 있는 방식이며 모든 데이터를 ACK처리하지 않으면서도 native streaming 모델을 고수한다. 

Flink의 전달 방식은 Exactly once이다. 

Flink's Reliable Processing

 

상태관리는 각 단계별 operator를 제공하는데 두 가지 유형이 존재한다. 

 

1) 로컬 시스템의 하나의 operator에서 실행되는 여러 개의 Task들 중 하나의 Task에 대한 상태를 말하며 서로 다른 Task간 통신하지 않는다. 

2) 코드단에서 정해진 key에 따라 파티셔닝되고 key를 바탕으로 전체 파티션의 상태를 관리한다. 

 


 

반응형

'Spark' 카테고리의 다른 글

Spark 3.0 무엇이 바뀌었을까?  (0) 2021.07.18