Kafka 및 Spark로 데이터 처리 시작

데이터 처리의 복잡성과 주요 도구

빅 데이터 처리는 현대 조직이 직면하는 가장 복잡한 과제 중 하나입니다. 특히 실시간으로 생성되는 대량의 데이터는 처리 과정을 더욱 복잡하게 만듭니다.

이 글에서는 빅 데이터 처리의 개념과 방식에 대해 알아보고, 데이터 처리 분야에서 가장 널리 사용되는 도구인 Apache Kafka와 Spark를 집중적으로 살펴보겠습니다.

데이터 처리란 무엇이며, 어떻게 이루어지는가?

데이터 처리란 자동화된 과정을 거치든 그렇지 않든, 데이터를 수집, 정렬, 구성하여 의미 있는 정보로 변환하는 일련의 활동을 의미합니다. 이러한 과정은 논리적이고 적절한 해석을 통해 이루어집니다.

예를 들어, 사용자가 데이터베이스에 특정 쿼리를 실행하여 원하는 검색 결과를 얻는 과정이 바로 데이터 처리입니다. 검색 결과로 추출된 정보는 데이터 처리의 산물이며, 정보 기술의 핵심적인 부분입니다.

과거에는 단순한 소프트웨어로 데이터 처리가 가능했지만, 빅 데이터의 등장으로 상황이 변했습니다. 빅 데이터는 수백 테라바이트에서 페타바이트에 이르는 방대한 양의 정보를 의미하며, 컨택 센터, 소셜 미디어, 증권 거래소 등에서 실시간으로 생성됩니다. 이러한 데이터는 종종 ‘데이터 스트림’이라고 불리며, 시작과 끝이 명확하지 않은 지속적인 흐름을 가지고 있습니다.

데이터는 목적지에 도착하는 즉시 처리될 수 있으며, 이를 실시간 또는 온라인 처리라고 합니다. 또 다른 방식은 데이터 블록을 일정 시간 간격(몇 시간 또는 며칠)으로 처리하는 일괄 처리 또는 오프라인 처리입니다. 일괄 처리는 주로 야간에 실행되어 그날의 데이터를 통합하며, 때로는 주간 또는 월간 보고서를 생성하는 데 사용되기도 합니다.

스트리밍 데이터 처리를 위한 주요 플랫폼은 오픈 소스 기반이며, Kafka 및 Spark와 같은 도구들이 서로 보완적인 역할을 합니다. 오픈 소스 특성상 빠르게 발전하고 있으며, 더 많은 도구들을 지원합니다. 이러한 시스템을 통해 데이터 스트림은 다양한 위치에서 중단 없이 가변적인 속도로 수신될 수 있습니다.

이제 데이터 처리 분야에서 가장 널리 알려진 두 가지 도구, 즉 Apache Kafka와 Spark를 자세히 살펴보고 비교 분석해 보겠습니다.

아파치 카프카

Apache Kafka는 지속적인 데이터 흐름을 기반으로 스트리밍 애플리케이션을 구축하는 데 사용되는 메시징 시스템입니다. 원래 LinkedIn에서 개발된 Kafka는 로그 기반 시스템으로, 새로운 정보가 파일의 끝에 추가되는 방식으로 데이터를 저장합니다.

Kafka는 높은 처리량을 제공하여 빅 데이터 처리에 적합하며, 실시간 및 일괄 처리 데이터를 변환하는 데 활용될 수 있습니다.

Apache Kafka는 발행-구독 메시징 시스템으로, 애플리케이션이 메시지를 발행하고 다른 애플리케이션이 이를 구독하여 수신합니다. 메시지 게시와 수신 사이의 지연 시간이 매우 짧아 실시간 처리에 적합합니다.

카프카의 작동 원리

Apache Kafka의 아키텍처는 생산자, 소비자, 그리고 클러스터 자체로 구성됩니다. 생산자는 클러스터에 메시지를 게시하는 모든 애플리케이션을 의미하며, 소비자는 클러스터에서 메시지를 받는 모든 애플리케이션을 의미합니다. Kafka 클러스터는 메시징 서비스를 제공하는 노드들의 집합입니다.

카프카 작업

Kafka 클러스터는 여러 개의 브로커로 구성됩니다. 브로커는 생산자로부터 메시지를 받아 디스크에 저장하는 Kafka 서버를 의미합니다. 각 브로커는 여러 파티션으로 나뉘어진 주제 목록을 관리합니다.

브로커는 메시지를 수신한 후, 각 주제에 등록된 소비자에게 메시지를 전달합니다.

Apache Kafka 설정은 Apache Zookeeper에 의해 관리됩니다. Zookeeper는 파티션 위치, 이름 목록, 주제 목록, 사용 가능한 노드와 같은 클러스터 메타데이터를 저장하여 클러스터의 여러 구성 요소 간의 동기화를 유지합니다.

Zookeeper는 Kafka가 분산 시스템이기 때문에 중요합니다. 여러 클라이언트에서 동시에 읽기 및 쓰기 작업이 발생할 수 있으며, 장애 발생 시 Zookeeper는 교체 노드를 선택하고 작업을 복구하는 역할을 합니다.

카프카의 활용 사례

Kafka는 메시징 도구로 널리 사용되지만, 다양한 시나리오에서 활용될 수 있습니다. 다음은 몇 가지 예시입니다.

메시징

통신하는 당사자를 분리하는 비동기식 통신 방식입니다. 한 당사자는 데이터를 메시지 형태로 Kafka에 전송하고, 다른 애플리케이션은 나중에 해당 데이터를 사용합니다.

활동 추적

웹사이트 사용자의 페이지 보기, 클릭, 데이터 입력 등과 같은 상호 작용 데이터를 저장하고 처리할 수 있습니다. 이러한 활동은 일반적으로 많은 양의 데이터를 생성합니다.

지표 측정

여러 소스에서 수집된 데이터와 통계를 집계하여 중앙 집중식 보고서를 생성하는 데 사용됩니다.

로그 집계

여러 시스템에서 생성된 로그 파일을 중앙에서 집계하고 저장하는 데 활용됩니다.

스트림 처리

데이터 파이프라인 처리는 여러 단계로 구성되며, 원시 데이터는 주제에서 소비되고 집계, 보강 또는 다른 주제로 변환됩니다.

이러한 기능을 지원하기 위해 플랫폼은 기본적으로 세 가지 API를 제공합니다.

  • Streams API: 한 주제의 데이터를 소비하고 변환하여 다른 주제에 쓰는 스트림 프로세서 역할을 합니다.
  • 커넥터 API: 관계형 데이터베이스와 같은 기존 시스템에 주제를 연결할 수 있습니다.
  • 생산자 및 소비자 API: 애플리케이션에서 Kafka 데이터를 게시하고 사용할 수 있습니다.

카프카의 장점

복제, 분할 및 순서 지정

Kafka 메시지는 보안과 전달 속도를 보장하기 위해 클러스터 노드의 파티션 전체에 복제되며, 메시지가 도착하는 순서대로 처리됩니다.

데이터 변환

Apache Kafka를 사용하여 실시간 및 일괄 처리 데이터를 ETL 스트림 API를 통해 변환할 수 있습니다.

순차적 디스크 액세스

Apache Kafka는 메시지 처리 속도를 높이기 위해 데이터를 메모리가 아닌 디스크에 저장합니다. 순차적 디스크 액세스는 임의 메모리 액세스보다 효율적인 경우가 많습니다.

아파치 스파크

Apache Spark는 클러스터 환경에서 병렬 데이터 처리를 위한 빅 데이터 컴퓨팅 엔진 및 라이브러리 세트입니다. Spark는 Hadoop 및 MapReduce 프로그래밍 패러다임의 발전된 형태로, 데이터를 디스크에 저장하지 않고 메모리 내에서 처리하여 속도가 매우 빠릅니다.

Spark는 세 가지 수준으로 구성됩니다.

  • 저수준 API: 다른 구성 요소에 필요한 작업 및 기능 실행을 위한 기본 기능을 제공합니다. 보안, 네트워크, 스케줄링, HDFS, GlusterFS, Amazon S3와 같은 파일 시스템에 대한 논리적 접근 관리를 담당합니다.
  • 구조적 API: Hive, Parquet, JSON 등과 같은 형식으로 읽을 수 있는 DataSet 또는 DataFrame을 통해 데이터 조작을 처리합니다. SparkSQL (SQL 쿼리를 작성할 수 있는 API)을 사용하여 데이터를 원하는 방식으로 조작할 수 있습니다.
  • 고수준 API: Spark Streaming, Spark MLlib, Spark GraphX와 같은 다양한 라이브러리가 있는 Spark 생태계를 포함합니다. 스트리밍 데이터 수집, 장애 복구, 기계 학습 모델 생성 및 검증, 그래프 및 알고리즘 처리 등을 관리합니다.

스파크의 작동 방식

Spark 애플리케이션의 아키텍처는 크게 세 가지 부분으로 구성됩니다.

드라이버 프로그램: 데이터 처리 실행을 조정하는 역할을 합니다.

클러스터 관리자: 클러스터의 여러 시스템을 관리하는 구성 요소로, Spark가 분산 환경에서 실행될 때 필요합니다.

작업자 노드: 프로그램의 작업을 실제로 수행하는 기계입니다. Spark가 로컬 컴퓨터에서 실행될 경우, 드라이버 프로그램과 작업자 노드 역할을 모두 수행합니다. 이러한 실행 방식을 독립 실행형이라고 합니다.

클러스터 개요

Spark 코드는 다양한 프로그래밍 언어로 작성할 수 있습니다. Spark Shell은 데이터 학습 및 탐색을 위한 대화형 콘솔을 제공합니다.

Spark 애플리케이션은 하나 이상의 작업으로 구성되어 대규모 데이터 처리를 지원합니다.

Spark 실행 모드에는 다음과 같은 두 가지 유형이 있습니다.

  • 클라이언트: 드라이버 프로그램이 리소스 관리자를 거치지 않고 클라이언트에서 직접 실행됩니다.
  • 클러스터: 드라이버 프로그램이 리소스 관리자를 통해 애플리케이션 마스터에서 실행됩니다. 클러스터 모드에서는 클라이언트 연결이 끊어져도 애플리케이션이 계속 실행됩니다.

Spark를 효율적으로 사용하려면 리소스 관리자와 같은 관련 서비스를 활용하여 각 실행에 필요한 자원을 파악해야 합니다. 개발자는 Spark 작업을 실행하고 호출을 구성하는 최적의 방법을 파악해야 하며, 이를 위해 Spark 실행 환경을 구성하고 조정할 수 있어야 합니다.

Spark 작업은 주로 메모리를 사용하므로 작업 노드 실행기의 Spark 구성 값을 조정하는 것이 일반적입니다. Spark 워크로드에 따라 특정 비표준 Spark 구성이 더 나은 실행 성능을 제공할 수 있습니다. 이를 위해 다양한 구성 옵션과 기본 Spark 구성 간의 비교 테스트를 수행할 수 있습니다.

스파크의 활용 사례

Apache Spark는 실시간 데이터와 아카이브 데이터, 정형 데이터와 비정형 데이터 등 대량의 다양한 데이터를 처리하는 데 유용합니다. 다음은 몇 가지 대표적인 사용 사례입니다.

데이터 보강

기업은 과거 고객 데이터와 실시간 행동 데이터를 결합하여 사용하는 경우가 많습니다. Spark는 비정형 이벤트 데이터를 정형 데이터로 변환하는 지속적인 ETL 파이프라인을 구축하는 데 유용합니다.

트리거 이벤트 감지

Spark Streaming을 사용하면 잠재적인 문제나 사기를 나타낼 수 있는 특이하거나 의심스러운 행동을 신속하게 감지하고 대응할 수 있습니다.

복잡한 세션 데이터 분석

Spark Streaming을 사용하면 사용자 세션과 관련된 이벤트를 분석할 수 있습니다. 예를 들어, 애플리케이션에 로그인한 후의 활동 등을 그룹화하고 분석하여 기계 학습 모델 업데이트에 활용할 수 있습니다.

스파크의 장점

반복 처리

데이터를 반복적으로 처리해야 하는 경우, Spark의 RDD(Resilient Distributed Datasets)를 사용하면 중간 결과를 디스크에 저장하지 않고 메모리 내에서 여러 맵 작업을 수행할 수 있습니다.

그래프 처리

GraphX API를 사용하는 Spark의 계산 모델은 그래프 처리의 반복적인 계산에 탁월합니다.

기계 학습

Spark에는 메모리 내에서 실행되는 기성 알고리즘이 포함된 MLlib라는 내장 기계 학습 라이브러리가 있습니다.

카프카 대 스파크

Kafka와 Spark는 모두 빅 데이터 처리 분야에서 많은 관심을 받고 있지만, 중요한 차이점이 있습니다.

#1. 데이터 처리

Kafka는 애플리케이션 간의 데이터 전송을 담당하는 실시간 데이터 스트리밍 및 저장 도구이며, 단독으로는 완전한 솔루션을 구축하기 어렵습니다. Spark와 같은 다른 도구가 필요합니다. 반면 Spark는 Kafka 주제에서 데이터를 가져와 결합된 스키마로 변환하는 일괄 처리 중심의 데이터 처리 플랫폼입니다.

#2. 메모리 관리

Spark는 RDD(Robust Distributed Datasets)를 사용하여 메모리를 관리하며, 대규모 데이터 세트를 클러스터의 여러 노드에 분산합니다. 반면 Kafka는 HDFS와 유사한 순차 액세스를 사용하며 데이터를 버퍼 메모리에 저장합니다.

#3. ETL 변환

Spark와 Kafka 모두 일반적으로 트랜잭션 기반 시스템(OLTP)에서 분석 기반 시스템(OLAP)으로 데이터를 복사하는 ETL 변환 프로세스를 지원합니다. Spark는 ETL 프로세스를 위한 내장 기능을 제공하지만, Kafka는 Streams API를 사용하여 이를 지원합니다.

#4. 데이터 지속성

Spark에서 RDD를 사용하면 나중에 사용하기 위해 데이터를 여러 위치에 저장할 수 있지만, Kafka에서는 데이터를 보존하기 위해 구성에서 데이터 세트 객체를 정의해야 합니다.

#5. 사용의 어려움

Spark는 다양한 고급 프로그래밍 언어를 지원하며, 배우기 쉽고 다양한 기능을 제공합니다. 반면 Kafka는 다양한 API 및 타사 모듈에 의존하므로 사용하기 더 어려울 수 있습니다.

#6. 복구

Spark와 Kafka는 모두 데이터 복구 옵션을 제공합니다. Spark는 RDD를 사용하여 데이터를 지속적으로 저장하고 클러스터 장애 발생 시 데이터를 복구할 수 있습니다.

Kafka는 클러스터 내부에서 데이터를 지속적으로 복제하고 브로커 간에 복제를 수행하여 장애 발생 시 데이터를 다른 브로커로 이동시킬 수 있습니다.

스파크와 카프카의 공통점

Apache Spark Apache Kafka
Open Source Open Source
데이터 스트리밍 애플리케이션 구축 지원 데이터 스트리밍 애플리케이션 구축 지원
상태 저장 처리 지원 상태 저장 처리 지원
SQL 지원 SQL 지원

마지막으로

Kafka와 Spark는 모두 Scala와 Java로 작성된 오픈 소스 도구로, 실시간 데이터 스트리밍 애플리케이션을 구축하는 데 사용됩니다. 상태 저장 처리, SQL 지원, ETL과 같은 몇 가지 공통점이 있으며, 응용 프로그램 간 데이터 전송의 복잡성을 해결하는 데 도움이 되는 상호 보완적인 도구로 사용할 수 있습니다.