Redis 스트림 및 Apache Spark 구조적 스트리밍을 사용한 실시간 데이터 처리

in #kr-dev3 years ago

주요 내용

  • Apache Spark의 구조적 스트리밍은 데이터 스트림에 SQL 쿼리 기능을 제공하여 확장 가능한 실시간 데이터 처리를 수행할 수 있도록 합니다.
  • Redis 5.0에 도입된 새로운 데이터 구조인 Redis Streams를 사용하면 밀리초 미만의 대기 시간으로 고속으로 데이터를 수집, 유지 및 배포할 수 있습니다.
  • Redis Streams와 Structured Streaming을 통합하면 지속적인 애플리케이션 확장이 간소화됩니다.
  • 오픈 소스 Spark-Redis 라이브러리는 Apache Spark와 Redis를 연결합니다. 라이브러리는 Redis 데이터 구조를 위한 RDD 및 Dataframe API를 제공하며 Redis Streams를 구조적 스트리밍을 위한 데이터 소스로 사용할 수 있도록 합니다.

Apache Spark 2.0에 도입된 새로운 기능인 구조적 스트리밍은 업계와 데이터 엔지니어링 커뮤니티에서 많은 관심을 받았습니다. Spark SQL 엔진을 기반으로 구축된 Structured Streaming API는 스트리밍 데이터를 위한 SQL과 유사한 인터페이스를 제공합니다.

초기에 Apache Spark는 약 100밀리초의 지연 시간으로 구조적 스트리밍 쿼리를 마이크로 배치로 처리했습니다.

작년에 버전 2.3은 짧은 대기 시간(1밀리초) "연속 처리"를 도입하여 구조적 스트리밍의 채택을 더욱 가속화하고 있습니다.

park의 연속 처리 속도로 작업하려면 Redis와 같은 고속 스트리밍 데이터베이스로 이를 보강해야 합니다.

이 오픈 소스 인메모리 데이터베이스는 빠른 속도와 밀리초 미만의 대기 시간으로 유명합니다. Redis 5.0은 최근 Redis Streams라는 새로운 데이터 구조를 도입했으며, 이를 통해 Redis는 여러 생산자와 소비자 간에 스트리밍 데이터를 소비, 보유 및 배포할 수 있습니다.

이제 문제는 Redis Streams를 Apache Spark 데이터 처리 엔진과 함께 스트리밍 데이터베이스로 배포하는 가장 좋은 방법이 무엇입니까?

Scala로 작성된 Spark-Redis 라이브러리 는 Apache Spark와 Redis를 통합하므로 다음을 수행할 수 있습니다.

  • Redis에서 데이터를 RDD로 읽고 쓰기
  • Redis에서 DataFrame으로 데이터 읽기 및 쓰기(즉, Spark SQL 테이블을 Redis 데이터 구조에 매핑할 수 있음)
  • Redis Streams를 구조적 스트리밍의 소스로 사용
  • 구조적 스트리밍 후 싱크로 Redis 구현

이 기사에서는 실제 시나리오를 제시하고 Redis 및 Apache Spark를 사용하여 스트리밍 데이터를 실시간으로 처리하는 방법을 안내합니다.

가상 시나리오: 실시간 클릭 계산

우리가 인기 있는 웹사이트에 디스플레이 광고를 게재하는 광고 회사라고 가정해 보겠습니다. 소셜 미디어에서 인기 있는 이미지를 기반으로 역동적인 밈을 만들어 광고로 게재합니다. 수익을 극대화하려면 입소문을 타거나 더 많은 클릭을 유도하는 자산을 식별하여 더 자주 표시할 수 있어야 합니다.

우리 자산의 대부분은 유통 기한이 짧고 실시간으로 클릭을 처리하면 비즈니스에 중요한 트렌드 이미지를 신속하게 활용할 수 있습니다. 우리의 이상적인 스트리밍 데이터 솔루션은 모든 광고 클릭을 기록하고 실시간으로 처리하고 각 자산에 대한 실시간 클릭 수를 계산해야 합니다. 설계 방법은 다음과 같습니다.

그림 1. 실시간으로 클릭 수를 계산하기 위한 빌딩 블록

입력

모든 클릭에 대해 당사의 데이터 수집 솔루션(그림 1의 블록 1)은 자산 ID와 광고 비용을 Redis Stream에 다음과 같이 배치합니다.

XADD clicks * asset [asset id] cost [actual cost]

예를 들어:

XADD clicks * asset aksh1hf98qw7tt9q7 cost 29

산출

그림 1의 블록 2에서 데이터를 처리한 후 결과는 데이터 저장소에 저장됩니다. 데이터 쿼리 솔루션(그림 1의 블록 3)은 데이터에 대한 SQL 인터페이스를 제공하므로 지난 몇 분 동안의 상위 클릭을 쿼리할 수 있습니다.

select asset, count from clicks order by count desc

asset            count
-----------------     -----
aksh1hf98qw7tt9q7    2392
i2dfb8fg023714ins    2010
jsg82t8jasvdh2389    1938

솔루션 설계

이제 비즈니스 요구 사항을 정의했으므로 Redis 5.0 및 Apache Spark 2.4를 사용하여 이 솔루션을 구축하는 방법을 살펴보겠습니다. 이 기사의 목적을 위해 Scala 프로그래밍 언어로 개발 중이지만 Java 또는 Python과 함께 Spark-Redis 라이브러리를 사용할 수도 있습니다.

[이미지를 클릭하시면 확대됩니다]

그림 2. 솔루션 아키텍처

이 흐름 다이어그램은 매우 간단해 보입니다. 먼저 시스템이 데이터를 Redis 스트림으로 수집한 다음 데이터를 Spark 프로세스로 소비하고 결과를 다시 Redis로 집계하고 마지막으로 Spark-SQL 인터페이스를 사용하여 Redis에서 결과를 쿼리합니다.

  1. 데이터 수집 : 초당 백만 개 이상의 읽기 및 쓰기 작업을 처리할 수 있는 Redis의 내장 데이터 구조이기 때문에 데이터 수집을 위해 Redis Streams를 선택했습니다. 또한 시간에 따라 자동으로 데이터를 정렬하고 데이터를 읽는 방법을 간소화하는 소비자 그룹을 지원합니다. Spark-Redis 라이브러리는 Redis Streams를 데이터 소스로 지원하므로 스트리밍 데이터베이스가 Apache Spark Engine과 함께 작동해야 하는 우리의 요구에 완벽하게 맞습니다.
  2. 데이터 처리 : Apache Spark의 Structured Streaming API는 데이터 처리에 탁월한 선택이며 Spark-Redis 라이브러리를 사용하면 Redis Streams에 도착하는 데이터를 DataFrames로 변환할 수 있습니다. 구조적 스트리밍을 사용하면 마이크로 배치 또는 Spark의 연속 처리 모드에서 쿼리를 실행할 수 있습니다. 우리는 또한 우리가 선호하는 목적지에 데이터를 쓸 수 있게 해주는 맞춤형 '작성기'를 개발할 수 있습니다. 그림 2와 같이 해시 데이터 구조를 사용하여 Redis에 출력을 작성합니다.
  3. 데이터 쿼리 : Spark-Redis 라이브러리를 사용하면 네이티브 Redis 데이터 구조를 DataFrame으로 매핑할 수 있습니다. 열을 해시 데이터 구조의 특정 키에 매핑하는 '임시 테이블'을 선언할 수 있으며 Redis는 밀리초 미만의 대기 시간으로 엄청나게 빠르기 때문에 Spark-SQL에서 실시간 쿼리 기능을 사용할 수 있습니다.

이제 솔루션의 각 구성 요소를 개발하고 실행하는 방법을 안내해 드리겠습니다. 하지만 먼저 적절한 도구를 사용하여 개발 환경을 초기화해 보겠습니다.

출처 : https://www.infoq.com/articles/data-processing-redis-spark-streaming/

Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Google is paying $27485 to $29658 consistently for taking a shot at the web from home. I joined this action 2 months back and I have earned $31547 in my first month from this action. I can say my life has improved completely! Take a gander at what I do...http://salary1.cf/