3. Spark Intro
• In-memory 기반 범용 클러스터 컴퓨팅 엔진
- 하둡 맵리듀스보다 100배 빠름(공홈에서 주장)
• Unified Engine
- batch/stream, SQL 및 Machine learning, Graph processing 제공
• 다양한 언어 지원
- Java, Scala, Python, R
• 여러 클러스터 매니저를 지원하여 다양한 환경에서 구동 가능
- Standalone, YARN, mesos 등
12. Why Spark Streaming?
데이터를 실시간으로 바로 처리 하고 싶어요
“웹사이트를 모니터링할 수 없을까요?”
“이거 추가되거나 삭제되면 바로 반영해주세요”
“실시간 데이터로 머신러닝 모델을 학습시키고 싶어요”
“문제를 바로 알고 싶어요”
Website monitoring Fraud detection ML from streaming data
13. Why Spark Streaming?
• Integration with Batch Processing
같은 프레임워크에서 배치와 스트리밍을 같이 처리하고 싶어요
“배치는 MapReduce, 스트리밍은 Storm…”
“유지 보수가 너무 어려워요 ㅠㅠ”
“배치를 쉽게 스트리밍으로 바꿀수 없을까요?”
14. Why Spark Streaming?
• Integration with Batch Processing
같은 프레임워크에서 배치와 스트리밍을 같이 처리하고 싶어요
“배치는 MapReduce, 스트리밍은 Storm…”
“유지 보수가 너무 어려워요 ㅠㅠ”
“배치를 쉽게 스트리밍으로 바꿀수 없을까요?”
16. What is Spark Streaming?
• 배치를 작게해서 스트리밍처럼 돌리자
- 스트림 데이터를 시간 간격으로 분할
- 분할된 데이터를 대상으로 배치 수행
- 각 배치는 기존의 Spark job과 동일하게 처리
Spark
Streaming
live data stream
batches of input data
Spark
Engine
processed result
RDD
17. Streaming Context
• Spark streaming을 사용하기 위해서 제일 먼저 생성하는 인스
턴스
- SparkContext, SparkSession과 비슷
• 어떤 주기로 배치 처리를 수행할지에 대한 정보를 함께 제공
• SparkConf나 SparkContext를 이용해 생성
18. Programming Model - DStream
• Discretized Stream(Dstream)
- 끊임없이 생성되는 연속된 데이터를 나타내기 위한 데이터 모델
- 일정 시간마다 데이터를 모아서 RDD를 만들어줌
- RDD로 구성된 시퀀스
Reference : zero-to-streaming-spark-and-cassandra
19. 그림과 함께 보는 예제
Spark
Streaming
live data stream
batches of input data
Spark
Engine
processed result
20. 그림과 함께 보는 예제
Spark
Streaming
live data stream
batches of input data
Spark
Engine
processed result
22. Example – Twitter 데이터와 놀아보기
• 살펴볼 예제
- 초당 생성되는 트윗 수 세어보기
- 최근 10초동안 생성되는 트윗 중 가장 많이 사용되는 단어수를 매 초마
다 확인하기
- 지금부터 유저별 트위터 작성 수 집계하기
예제 저장소 : https://github.com/eoriented/spark-streaming-tutorial
34. Data source
• 지원하는 데이터 소스
- Default data source
• Socket
• 파일 (HDFS 호환 파일 가능)
• RDD Queue
- Advanced data source (외부 연동 라이브러리)
• Kafka
• Flume
• Kinesis
• Twitter
- Receiver를 직접 구현
35. Data source
• Custom Receiver
- 만일 내가 원하는 Data source가 존재하지 않는다면?
• Custom Receiver로 구현
- http://spark.apache.org/docs/latest/streaming-custom-receivers.html
- onStart 메소드와 onStop 메소드를 구현
37. Fault tolerance
• Check Point
- Metadata checkpoint
• 드라이버의 장애 대응
- Data checkpoint
• 최종 상태의 데이터를 빠르게 복구하기 위한 용도
- 파일 시스템
• HDFS, S3, local FS(test용) 등이 사용 가능
38. 성능 고려사항
• 배치 / 윈도우 사이즈
- 500ms 가 적당
- 큰 배치로 시작하여 작은 사이즈로 낮춰가면서 배치 사이즈 결정 추천
• 병렬화
- 리시버 개수 늘리기
• 하나의 리시버가 받는게 아닌 여러 리시버가 받아서 처리하는게 효율적
- Repartitioning
• 입력 스트림의 파티션을 재설정하여 처리
• 메모리 튜닝
- GC 옵션 튜닝
- Spark.cleaner.ttl 옵션을 이용하여 RDD 제거 시간 조정
언어 선택은 자유지만 만약 어떤 언어도 상관하지 않는 경우에는 scala를 추천
- 자바보다 API가 간결하고, 파이썬 보다 더 좋은 성능을 낸다.(Spark는 scala로 만들어져 있고, 새로운 기능은 스칼라부터 적용)
왜 만듦?
왜 만들었냐?
무엇을 만들었을까?
무엇을 만들었나?
용어 익히기
빠르게 보는 Spark Streaming
어떻게 사용하는가
두번째 예제를 살펴 보기 전에
윈도우 사이즈와 슬라이드 인터벌의 경우 배치 크기의 배수로 지정
스트럭처 스트리밍은 간단하게 소개만 해드리겠음
기존 맵리듀스 패턴을 이용하여 스트리밍을 처리하는 방식의 예
- 사용자가 앱을 열때 open 이벤트를 보내고, 닫을 때 close 이벤트를 보내는 예제
사용자가 앱을 열때 open 이벤트를 보내고, 닫을 때 close 이벤트를 보내는 예제
Consistency
open을 처리하는 reducer와 close를 담당하는 리듀서가 있을 때 open을 처리하는 리듀서가 close를 담당하는 리듀서보다 느린 경우 mysql에서는 open 보다 close가 더 많아질 수도 있어서 데이터의 일관성이 깨질 수 있음
Fault tolerance
Mapper나 리듀서가 죽는 경우는?
Out-of-order data
여러 출처의 데이터가 순서가 다른 경우 문제가 될 수 있음
입력 데이터의 스트림을 입력테이블로 간주해서 처리.
스트림에 도착하는 모든 데이터는 입력 테이블에 추가되는 새로운 row와 같이 처리
결과를 Result Table에 업데이트 한다. 결과 테이블이 업데이트 될때마다 변경된 결과와 행을 외부 싱크에 기록해야 함
아웃풋은 외부 스토리지에 쓰여지는 것으로 정의됨
Result 테이블에 전부 업데이트를 하고 쓰여짐
결과를 Result Table에 업데이트 한다. 결과 테이블이 업데이트 될때마다 변경된 결과와 행을 외부 싱크에 기록해야 함
늦게 들어오는 데이터를 어떻게 처리할 것인가?
한참 후에(하루, 일주일) 들어오는 데이터를 처리하기 위해서 기존 데이터를 계속 유지할 수 없음
한참 지난 후에 도달하는 데이터를 적절히 처리하기 위한 방법으로 워터마크 도입
이벤트의 유효기간을 설정하여 처리하는 방식입니다.
해당 트리거가 발생하기 전에 인입된 모든 이벤트중에
가장 마지막에 발생된 이벤트 발생시각에서
미리 지정해둔 유효기간을 뺀 것으로 결정