[Spark강의2] Spark의 실시간/배치
아래의 글은 T아카데미 아파치 스파크 입문 강의를 듣고 정리한 내용입니다
1강. Spark의 실시간/배치
1. BigData Processing
배치 프로세싱 : 데이터는 엄청 크지만 latency가 생겨도 되는 경우 (일,월을 기준으로 한번에 처리)
실시간 프로세싱 : 데이터가 온 즉시 바로 처리, 대신 데이터가 바로바로 처리되야해서 데이터가 간단해야함,
Micro 배치프로세싱 : 작은 배치사이즈(bath+streaming), 실시간 집계가 필요한 경우 ex : Spark Streaming
2. 스트림 프로세싱
Native Streaming 방식 (Storm, Flik)
Source Operator : 데이터 소스가 들어오는 부분, 예를 들면 카프카
Processing Operator : 데이터가 들어오는대로 처리하는 부분
Sink Operator : 처리된 걸 어떻게 하겠다 예를 들면 elastic Search로 내보내겠다 같은 동작
Micro Batch Streaming (Spark Streaming)
들어오는 들어오는 리시버가 존재 (ex : 카프카 리시버)
데이터가 들어오는대로 처리하는게 아니라 그 레코드를 작은 배치로 만듦.
그래서 그 작은배치를 가지고 와서 Processing을 하고, Sink 를 하는 방식
앞단에 작은 배치(micro-batches) 를 가지고 있느냐 아니냐에 따라서 구분
3.Spark Streaming
Spark Streaming 에서 제공하는 Source Operator : Kafka ,Flume, HDFS/s3, Kinesis, Twitter
Source Operator에 의해 데이터를 가지고 오고,
Spark Streaming 내부적으로 배치size만큼 데이터를 쪼개서 처리한 뒤 원하는 곳으로 보냄
Spark Streaming 구조
실시간 처리가 아니라 small batch를 실행하고, 내부적으로 spark의 프로세싱을 통해서 데이터처리.
타입 interval이 1이라고 했을때, 각각의 Dstream을 생성하고, dstream별로 spark연산을 수행한다.
Dstream이 쪼개지면, 배치단위로 프로세싱 처리
-Checkpointing
각각 RDD가 변환되서 생성되는걸 중간마다 저장하는 포인트
문제가 생겼을때 다시 retry를 할 수 있는 부분
하지만 이런 STATE를 많아지면, (interval이 빈번할때) 나중에 복구하고 재연산하는데 오래걸릴수도 있음
Performance Tunning
- 배치사이즈는 어떻게?
배치사이즈를 점점 줄여간다. 점점 데이터가 많아지면서 메모리문제 때문에 드라이버가 많이 죽음
- 병렬성을 어떻게 높이느냐?
리시버를 늘린다. 대시보드를 띄워두고 실시간으로 지연이 되는지 확인,
리파티션. 테스크를 동시에 돌아갈수 있게 터널을 많이 뚫어주는 것. 대신 데이터가 셔플링댐
- GC 나 메모리 사용량 확인
스파크는 GC관리, JVM모니터링 필요 실제로 병목이 어디에서 발생했는지 모니터링 필요
4. Kafka Streaming
분산 메세징 서버
topic : 메세지 카테고리를 관리, n개의 파티션으로 구성, 데이터가 복제가댐
producer : 메세지를 보내는 부분
consumer : 메세지를 받는 부분, consumer 그룹을 지정할 수 있음.
하나의 데이터에 대해서 데이터에 대한 재가공이 댐.
각 파티션별로 어디까지 읽었고, 다음번에 시작했을때 어디서부터 시작하겠다. 옵션을 고려할 수 있음
5.Spark 2.0 : Structured Streaming
데이터프레임 기반의 스트리밍을 지원
SparkSQL 엔진에서 제공하는 high-level의 스트리밍API
예를 들어 실시간으로 들어온 데이터를 분별로 몇명 들어왔는지 집계해서 mysql에 저장하고자 한다면..!!
싱크어떻게, 데이터를 어떻게 저장을 해야할지 직접 지정을 해야했는데
Structured Streaming으로는 다 api로 제공해줘서 쉽게 사용가능, 데이터프레임처럼 쿼리를 바로바로 넣을수있음
기존 Pure Streaming에서는 input들어오고, 연산하고, sink하는 구조였다면,
Structured Streaming은 Continuous Application형태.
기존에 있는 데이터프레임(static data)와 결합해서 그 결과를 받을 수 있고, 그때그때 쿼리를 날릴 수 있다.
예를 들어, kafka topic으로 받은 데이터랑 jdbc로 가지고 온 static데이터 =둘다 데이터프레임이라서 join도 가능하다.