Spark 3.1까지만해도 Spark에서는 Session Window를 제대로 지원하지 않았다. 그런데 Spark 3.2부터 드디어 event time 기반의 Session Window를 지원하기 시작했다.
Spark 3.1까지의 Session Window 구현 방법
StructuredSessionization.scala
에 있는 것처럼 mapGroupsWithState
나 flatMapGroupsWithState
를 이용해서 개발자가 직접 Session Window를 구현해야했다.
그런데 예제에 나와있는 것은 제대로된 Session Window가 아니다. Stream에서 event time 기반의 Session Window를 구현하려면 lateness, out-of-order를 고려해야하는데 이에 대한 고려가 전혀 안되어있다.
Is proper event-time sessionization possible with Spark Structured Streaming?라는 Stack Overflow의 질문처럼 Spark 3.1 이하 버전에서 Session Window를 구현하기는 꽤나 어려운 작업이다.
Spark 3.2부터 Session Window 지원
2021.10.13.에 Spark 3.2.0이 출시되었다. release note를 보면 “EventTime based sessionization (session window)”라는 내용이 눈에 들어온다.
이슈 번호는 SPARK-10816으로서 2015년에 생성된 오래된 이슈인데 드디어 지원이 시작되었다.
(개발자는 자랑스럽게도 한국의 임정택님이시다.)
사용방법은 Native Support of Session Window in Spark Structured Streaming라는 Databricks 블로그에 올라와있다.
# session window
windowedCountsDF = \
eventsDF \
.withWatermark("eventTime", "10 minutes") \
.groupBy("deviceId", session_window("eventTime", "5 minutes")) \
.count()
이제는 mapGroupsWithState()
를 이용해서 복잡한 로직을 구현하지 않아도 Session Window를 쉽게 사용할 수 있다.
본 카테고리의 추천 글
- Kafka Unit Test with EmbeddedKafka
- Spark Structured Streaming에서의 Unit Test
- spark memoryOverhead 설정에 대한 이해
- Spark 기능 확장하기
- Spark DataFrame vs Dataset (부제: typed API 사용하기)
- Spark UI 확장하기
- Custom Spark Stream Source 개발하기
- Spark에서 Kafka를 batch 방식으로 읽기
- SparkSession의 implicit에 대한 이해
- spark-submit의 –files로 upload한 파일 읽기
- Scala case class를 Spark의 StructType으로 변환하기
- Spark on Kubernetes 사용법 및 secure HDFS에 접근하기
- Spark의 Locality와 getPreferredLocations() Method
- Spark Streaming의 History