Project Lightspeed의 오프셋 관리 개선
작성자: Jerry Peng, 프라나브 아난드, 사우라브 굴라티, 카르틱 라마사미, Michael Armbrust , Matei Zaharia
Apache Spark Structured Streaming 은 선도적인 오픈 소스 스트림 처리 플랫폼입니다. 또한 Databricks Lakehouse Platform에서의 스트리밍 을 구동 하는 핵심 기술이며 배치 및 스트림 처리를 위한 통합 API를 제공합니다. 스트리밍 채택이 빠르게 증가함에 따라 다양한 애플리케이션에서 실시간 의사 결정을 위해 이를 활용하고자 합니다. 이러한 애플리케이션 중 일부, 특히 운영 환경에 있는 애플리케이션은 더 낮은 지연 시간을 요구합니다. Spark의 설계는 더 낮은 비용으로 높은 처리량과 사용 편의성을 지원하지만, 초 미만의 지연 시간에는 최적화되지 않았습니다.
이 블로그에서는 Structured Streaming의 고유한 처리 지연 시간을 줄이기 위해 오프셋 관리 부문에서 이룬 개선 사항을 집중적으로 살펴보겠습니다. 이러한 개선 사항은 단순하고 상태 비저장(stateless)인 실시간 모니터링 및 알림과 같은 운영 사용 사례를 주로 대상으로 합니다.
이러한 개선 사항에 대한 광범위한 평가 결과, 처리량이 초당 10만, 50만, 1백만 이벤트일 때 지연 시간이 700-900ms에서 150-250ms 로 68~75%, 즉 최대 3배까지 개선된 것으로 나타났습니다. 이제 Structured Streaming은 250ms 미만의 지연 시간을 달성할 수 있어 대부분의 운영 워크로드에 대한 SLA 요구 사항을 충족합니다.
이 아티클은 독자가 Spark Structured Streaming에 대한 기본적인 이해가 있다고 가정합니다. 자세한 내용은 다음 문서를 참조하세요.
https://www.databricks.com/spark/getting-started-with-apache-spark/streaming
https://docs.databricks.com/structured-streaming/index.html
https://www.databricks.com/glossary/what-is-structured-streaming
https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html
Apache Spark Structured Streaming은 Apache Spark SQL 엔진을 기반으로 구축된 분산 스트림 처리 엔진입니다. 개발자가 배치 쿼리와 동일한 방식으로 스트리밍 쿼리를 작성하여 데이터 스트림을 처리할 수 있게 해주는 API를 제공하므로 스트리밍 애플리케이션에 대해 추론하고 테스트하기가 더 쉽습니다. Maven download에 따르면 Structured Streaming은 오늘날 가장 널리 사용되는 오픈 소스 분산 스트리밍 엔진입니다. 이러한 인기의 주된 이유 중 하나는 성능, 즉 몇 초 미만의 종단 간 지연 시간으로 더 낮은 비용에 높은 처리량을 제공한다는 점입니다. Structured Streaming은 사용자에게 throughput, 비용, 지연 시간 간의 절충점을 조절할 수 있는 유연성을 제공합니다.
엔터프라이즈에서 스트리밍 채택이 빠르게 증가함에 따라 다양한 애플리케이션에서 스트리밍 데이터 아키텍처를 사용하고자 하는 요구가 커지고 있습니다. 많은 고객과의 대화에서 일관된 초 미만 지연 시간이 필요한 사용 사례를 접했습니다. 이러한 낮은 지연 시간 사용 사례는 운영 알림 및 실시간 모니터링과 같은 애플리케이션에서 발생하며, 이를 '운영 워크로드'라고도 합니다. 이러한 워크로드를 Structured Streaming에 적용하기 위해 2022년에 Project Lightspeed라는 이름으로 성능 개선 이니셔티브를 시작했습니다. 이 이니 셔티브는 처리 지연 시간을 개선하는 데 사용할 수 있는 잠재적인 영역과 기술을 식별했습니다. 이 블로그에서는 진행률 추적을 위한 오프셋 관리라는 개선 영역 중 하나와, 이를 통해 운영 워크로드에서 어떻게 초 미만 지연 시간을 달성하는지 자세히 설명합니다.
스트리밍 워크로드는 크게 분석 워크로드와 운영 워크로드로 분류할 수 있습니다. 그림 1은 분석 워크로드와 운영 워크로드를 모두 보여줍니다. 분석 워크로드는 일반적으로 데이터를 실시간으로 수집, 변환, 처리, 분석하고 그 결과를 AWS S3, Azure Data Lake Gen2, Google Cloud Storage와 같은 객체 스토리지에서 지원하는 Delta Lake에 씁니다. 이러한 결과는 다운스트림 데이터 웨어하우징 엔진 및 시각화 도구에서 사용됩니다.


그림 1. 분석 워크로드와 운영 워크로드
분석 워크로드의 몇 가지 예는 다음과 같습니다.
반면에 운영 워크로드는 실시간으로 데이터를 수집 및 처리하고 비즈니스 프로세스를 자동으로 trigger합니다. 이러한 워크로드의 몇 가지 예시는 다음과 같습니다.
운영 스트리밍 파이프라인은 다음과 같은 특징을 공유합니다.
이러한 사용 사례에 대해 Structured Streaming을 프로파일링한 결과, 마이크로 배치 진행 상황을 추적하기 위한 오프셋 관리에 상당한 시간이 소요된다는 것을 확인했습니다. 다음 섹션에서는 기존의 오프셋 관리를 검토하고 이후 섹션에서 어떻게 개선했는지 간략히 설명하겠습니다.
데이터가 어느 지점까지 처리되었는지 진행 상황을 추적하기 위해 Spark Structured Streaming은 진행률 표시기로 사용되는 오프셋을 유지하고 관리하는 데 의존합니다. 일반적으로 오프셋은 소스 커넥터에 의해 구체적으로 정의되는데, 이는 시스템마다 데이터의 진행률이나 위치를 나타내는 방식이 다르기 때문입니다. 예를 들어, 오프셋의 구체적인 구현은 파일의 데이터가 얼마나 처리되었는지를 나타내는 파일의 줄 번호가 될 수 있습니다. 이러한 오프셋을 저장하고 마이크로 배치의 완료를 표시하는 데 영구 logs(그림 2 참조)가 사용됩니다.

구조적 스트리밍(Structured Streaming)에서는 데이터가 마이크로 배치 단위로 처리됩니다. 각 마이크로 배치에 대해 두 가지 오프셋 관리 운영이 수행됩니다. 모든 마이크로 배치(batch)의 시작과 끝에 한 번씩입니다.
아래 그림 3은 현재 발생하는 오프셋 관리 운영을 보여줍니다.
