기록 블로그

프로그래머스 데브코스-데이터 엔지니어/TIL(Today I Learned)

07/14 70일차 Spark Streaming

usiohc 2023. 7. 14. 17:55

Spark Streaming


주요 메모 사항


Spark Streaming 소개

Spark 3.0의 구성

- Spark Core

- Spark SQL

- Spark ML - Spark MLlib

- Spark Streaming

- Spark GraphX

 

 

 

Spark Streaming이란?

- 실시간 데이터 스트림 처리를 위한 Spark API

- Kafka, Kinesis, Flume, TCP 소켓 등의 다양한 소스에서 발생하는 데이터 처리 가능

- Join, Map, Reduce, Window와 같은 고급 함수 사용 가능

 

 

Spark Streaming 동작방식

1. 데이터를 마이크로 배치로 처리

2. 계속해서 위의 과정을 반복 (루프)

3. 이렇게 읽은 데이터를 앞서 읽은 데이터에 머지 (새로 데이터를 만들어서 replace 하는 느낌)

4. 배치마다 데이터 위치 관리 (시작과 끝)

5. Fault Tolerance와 데이터 재처리 관리 (실패시)

 

 

Spark Streaming의 내부 동작

1. Spark Streaming은 실시간 입력 데이터 스트림을 배치로 나눈 다음

2. Spark Engine에서 처리하여 최종 결과 스트림을 일괄적으로 생성

ㄴ DStream과 Structured Streaming 두 종류가 존재

ㄴ Dstream은 RDD 기반 이제 사용안하는 기술

ㄴ Structured Streaming은 DataFrame 기반으로 동작하고 계속해서 사용하는 기술

 

 

Spark Structured Streaming이란?

- Spark Streaming은 실시간 입력 데이터 스트림을 배치로 나눈 다음

- Spark Engine에서 처리하여 최종 결과 스트림을 일괄적으로 생성

DStream Structured Streaming
RDD 기반 스트리밍 처리 DataFrame 기반 스트리밍 처리
Spark SQL 엔진의 최적화 기능 사용불가 Catalyst 기반 최적화 혜택을 가져감
이벤트 발생 시간 기반 처리 불가 이벤트 발생 시간 기반을 처리 가능
개발이 중단된 상태 (RDD 기반 모두에 적용됨) 계속해서 기능이 추가되고 있음

 

 

Source & Sink

소스와 싱크는 외부 시스템(소스) 에서 스트리밍 데이터를 수집하고 처리된 데이터를 외부 시스템 (싱크)으로 출력하는 것을 용이하게 하는 구성 요소

 

 

Source

Source는 Kafka, Amazon Kinesis, Apache Flume, TCP/IP 소켓, HDFS, File 등을 Spark Structured Streaming에서 처리할 수 있도록 해줌

ㄴ 결국 Spark DataFrame으로 변환해줌

ㄴ 예) Kafka에서 Spark Structured Streaming으로 데이터를 수집하려는 경우, Kafka Source를 사용하여 Kafka 클러스터에서 하나 이상의 토픽에서 데이터를 가져와 DataFrame으로 변환 가능

 

Spark DataFrame과 비교하면 readStream을 사용하는 점이 다름

ㄴ 기존에는 spark.read를 사용했음

Sink

Sink는 Spark Structured Streaming에서 처리된 데이터를 외부 시스템이나 스토리지로 출력 가능하게 해줌

 

Sink는 변환되거나 집계된 데이터가 어떻게 쓰이거나 소비되는지를 정의

ㄴ Source와 마찬가지로, Sink는 Kafka, HDFS, Amazon S3, Apache Cassandra, JDBC 데이터베이스 등과 같은 다양한 대상에 대해 사용 가능

ㄴ 예) Kafka Sink를 사용하여 Spark Structured Streaming에서 처리된 데이터를 Kafka Topic으로 쓰는 것이 가능

 

OutputMode: 현재 Micro Batch의 결과가 Sink에 어떻게 쓰일지 결정

ㄴ Append

ㄴ Update: UPSERT 같은 느낌

ㄴ Complete: FULL REFRESH 같은 느낌

 

- 기존에는 df.write로 사용했음

 

 

전체 구조

 

Micro Batch Trigger Option 

- Unspecified: 디폴트 모드. 현재 Micro Batch가 끝나면 다음 Batch가 바로 시작

- Time Interval: 고정된 시간마다 Micro Batch를 시작. 현재 Batch가 지정된 시간을 넘어서 끝나면 끝나자마자 다음 Batch가 시작됨. 읽을 데이터가 없는 경우 시작되지 않음

- One Time => Available-Now: 지금 있는 데이터를 모두 처리하고 중단

- Continuous: 새로운 저지연 연속 처리 모드에서 실행. 아직 베타/실험 버전

 

 


Spark 환경 설정

Local Standalone Spark - Spark 다운로드

- Spark Cluster Manager로 local[n] 지정

- 하나의 JVM에서 모든 프로세스를 실행

ㄴ 하나의 Driver와 하나의 Executor가 실행됨

 

- Executor안에 생성되는 쓰레드 수

ㄴ local:하나의 쓰레드만 생성

ㄴ local[*]: 컴퓨터 CPU 수만큼 쓰레드를 생성

 

참고 포스트

 

 

 

 

WordCount 예제

TCP 소켓에서 수신 대기 중인 데이터 서버로부터 수신한 텍스트 데이터의 단어 수를 세고 싶다고 가정

 

- 이를 위해 Netcat을 데이터 Producer로 사용

https://nmap.org/download.html

ㄴ Netcat을 사용해서 텍스트 스트림을 생성 (우리가 타입하는 텍스트 바탕)

 

$ ncat -lk 9999

 

 

Data Consumer

코드 : wordcount_streaming.py

 

 

 

 

Spark Structured Streaming Sink의 outputMode 값

 

Hadoop 시스템을 윈도우에서 돌리기 어려움이 너무 많았음

 

WordCount 예제 - 기용님 화면

Windows에서 ncat을 사용하기에 어려움이 많았음.

ㄴ nc 를 사용하는 것은 방화벽 문제로 사용이 불가했고

ㄴ ncat를 사용했는데, 이상하게 메세지 수신이 되지 않았음

 

 

 

 


요약

 

스트리밍 데이터 처리

 

- 배치 처리 vs. 실시간 (스트리밍) 처리

 

Kafka:

ㄴ 대량의 실시간 데이터를 저장/처리하는 분산 스트리밍 플랫폼

ㄴ Topic => Partition => Segment

 

Spark Streaming

ㄴ Micro-batch 형태로 데이터를 실시간 처리해주는 Spark 확장 모듈

ㄴ Kafka의 토픽에서 데이터를 읽어들여서 데이터 변환, 집계, 필터링 등의 작업 수행 가능

ㄴ 이제는 DStream이 아닌 Structured Streaming을 사용하는 것이 일반적

 

 

 

 

 

 


공부하며 어려웠던 내용

이해가 안되는 부분이 많다. -> hadoop와 spark의 기본개념과 동작원리를 다시 봐야겠다...