0. Spark 가 뭘까?
0-1. Spark 는 정확히 무엇일까?
Spark 는 빅데이터 처리를 위해 설계된 오픈소스 분산 컴퓨팅 시스템이다.
빅데이터 처리 즉, 대규모 데이터 세트를 처리하고
오픈소스 소스 코드가 공개되어 누구나 자유롭게 사용하고, 수정하고, 배포할 수 있으며
분산 컴퓨팅 여러 대의 컴퓨터가 동시에 일을 나누어 처리하는 시스템이라고 할 수 있다. (병렬 계산)
0-2. Spark 가 제공하는 기능
구체적으로, Spark 는 복잡한 데이터 처리 작업을 효율적으로 처리하는 기능을 제공한다.
1.
데이터 변환
대량의 데이터를 여러 단계로 변환하고 가공하는 작업을 빠르게 수행할 수 있다. 예를 들어, 원본 데이터를 필터링하고, 집계하며, 특정 형식으로 정리하는 등의 작업을 쉽게 처리할 수 있다. 이러한 데이터 변환 작업은 DataFrame과 RDD API를 통해 간단하게 구현할 수 있어 대규모 데이터 가공에 유용하다.
고객 ID | 구매 날짜 | 제품 ID | 구매 금액 |
C001 | 2024-11-01 | P123 | 50,000 |
C002 | 2024-11-01 | P234 | 30,000 |
C001 | 2024-11-02 | P123 | 50,000 |
C003 | 2024-11-03 | P345 | 20,000 |
C002 | 2024-11-03 | P345 | 20,000 |
예를 들어 위와 같이 고객들의 구매 데이터가 있을 때 고객 ID별로 총 구매 금액을 집계해볼 수 있다.
고객 ID | 총 구매 금액 |
C001 | 100,000 |
C002 | 50,000 |
C003 | 20,000 |
집계하게 되면 위와 같이 고객 ID 별 총 구매 금액을 구할 수 있다.
이러한 데이터 변환 기능들을 제공해주는 것이다.
그렇다면 여기서 Spark 는 분산 컴퓨팅 시스템이여서 병렬 계산을 진행해야 하는데 위 예시에서는 병렬 계산을 어떻게 수행할까?
우리가 중요하게 생각할 것은 “병렬 계산을 왜 하는가” 이다. 이에 대해서 이렇게 생각해볼 수 있다.
•
처리 시간 문제. 대규모 데이터는 단일 컴퓨터로 처리할 경우 시간이 매우 오래 걸리거나, 처리 자체가 불가능하다.
•
데이터 처리 용량 문제. 데이터 양이 기하급수적으로 늘어나는 상황에서는 단일 컴퓨터의 메모리와 처리 능력만으로는 한계가 있다.
•
실시간 처리 필요성. 실시간 데이터 분석이 필요한 경우, 데이터가 생성되자마자 빠르게 처리되어야 의미 있는 인사이트를 도출할 수 있다.
즉, 다음과 같은 이유로 병렬 계산을 진행한다.
예시로 든 고객 구매 데이터는 작긴 하지만, 이를 활용해 병렬 처리 과정을 설명해볼 것입니다.
노드A
고객 ID | 구매 날짜 | 제품 ID | 구매 금액 |
C001 | 2024-11-01 | P123 | 50,000 |
C002 | 2024-11-01 | P234 | 30,000 |
C002 | 2024-11-03 | P345 | 20,000 |
노드B
고객 ID | 구매 날짜 | 제품 ID | 구매 금액 |
C001 | 2024-11-02 | P123 | 50,000 |
C003 | 2024-11-03 | P345 | 20,000 |
코드
일단 컴퓨터(CPU)가 2개 존재한다고 할 때C001과 C002에 대한 데이터를 노드 A에 할당하고, C003과 C001 데이터를 노드 B에 할당하는 것이다. 따라서, 노드 A는 C001과 C002에 대한 구매 금액의 부분 합계를, 노드 B는 C003과 C001에 대한 부분 합계를 계산한다. 이를 최종 한 노드에 합쳐서 총 합계를 구하는 것입니다.
2.
머신러닝
Spark는 MLlib이라는 라이브러리를 통해 머신러닝 알고리즘을 지원한다. 이를 통해 분류, 회귀, 클러스터링, 추천 시스템 등 다양한 머신러닝 모델을 쉽게 적용할 수 있으며, Spark의 병렬 처리 기능 덕분에 대량의 데이터를 기반으로 모델 학습을 빠르게 수행할 수 있다.
3.
그래프 처리
Spark는 GraphX라는 라이브러리를 통해 그래프 데이터를 분석하고 처리하는 기능을 제공한다. 그래프 데이터란 노드(개체)와 엣지(관계)로 구성된 데이터 구조로, 소셜 네트워크 분석, 추천 시스템, 경로 탐색 등에 유용하게 사용된다. GraphX는 그래프 데이터를 병렬로 처리하고 다양한 그래프 알고리즘을 제공해 큰 규모의 그래프 데이터를 빠르게 분석할 수 있게 해준다.
4.
실시간 스트림 처리
Spark Streaming을 이용해 실시간 데이터 스트림을 처리할 수 있다. 예를 들어, 웹 로그, 소셜 미디어 피드, IoT 기기 데이터 등 끊임없이 생성되는 데이터를 실시간으로 처리하여 빠르게 분석 결과를 도출할 수 있다. 구체적으로 설명하자면, 데이터를 짧은 시간 단위로 나누어 처리하므로 실시간 분석이 가능하며, 실시간 대시보드나 경고 시스템에 적용하기에 적합하다.
소셜 미디어에서 특정 키워드의 실시간 트렌드 분석
코드
예를 들어, 트위터와 같은 소셜 미디어 플랫폼에서 특정 키워드(예: "Spark")가 얼마나 많이 언급되는지 실시간으로 분석하고 싶다고 가정해보겠다. Spark Streaming을 사용하면, 트위터 API를 통해 실시간 데이터를 받아 Spark에서 이를 짧은 시간 단위(예: 10초)로 분석할 수 있다.
실시간 트렌드 분석 단계
a.
데이터 수집: 트위터 API에서 실시간으로 데이터 스트림을 받아온다. Spark Streaming에서는 Kafka와 같은 메시지 큐를 사용해 데이터를 수집하고, 이를 Spark의 DStream으로 변환하여 실시간으로 처리한다.
b.
데이터 전처리: 들어온 트윗 데이터를 텍스트만 추출하고, 불필요한 기호나 단어를 제거하여 분석 가능한 형태로 전처리한다.
c.
키워드 빈도 계산: 각 시간 단위(마이크로 배치)마다 "Spark"라는 단어가 얼마나 자주 언급되었는지 계산한다. 예를 들어, 10초 동안 수집된 트윗에서 "Spark"가 몇 번 등장했는지를 집계하여 실시간 트렌드를 추적한다.
d.
실시간 시각화 및 알림: Spark Streaming은 실시간으로 집계한 데이터를 대시보드로 전송하여 트렌드 변화를 시각화하거나, 특정 키워드 언급이 급증하면 알림을 보낼 수도 있다.
이 예시에서 Spark의 스트림 처리 역할
•
트윗 데이터가 실시간으로 들어올 때마다 10초 단위로 데이터를 나누어 처리한다.
•
각 시간 단위마다 "Spark"라는 키워드가 몇 번 언급되었는지를 집계하여 실시간 트렌드를 제공한다.
0-3. Spark 가 해결하는 문제
전통적인 데이터 처리 시스템은 대용량 데이터를 처리하고 빠르게 계산을 수행하는 데 어려움을 겪는 경우가 많았다. Spark는 데이터를 여러 머신 클러스터에 분산하고 병렬로 처리함으로써 이러한 한계를 극복한다. 이 분산 컴퓨팅 모델을 통해 Spark는 전통적인 시스템보다 훨씬 빠르게 데이터를 처리할 수 있으며, 빅데이터 분석과 실시간 처리에 적합한 도구가 된다.
0-4. 다른 대체 도구가 있을 때 Spark 가 필요한 이유
1.
오류 발생 시 자동으로 복구하여 데이터 무결성과 작업 완료를 보장한다.
이 기능을 이해하려면, Spark가 분산 환경에서 작동한다는 점을 먼저 고려해야 한다. Spark는 데이터를 여러 노드(컴퓨터)로 나누어 병렬로 작업을 수행하기 때문에, 중간에 특정 노드에 문제가 생기거나 실패가 발생할 수 있다. 예를 들어, 한 노드에서 전력이 나가거나 네트워크 문제가 발생하면 그 노드에서 처리 중이던 작업이 중단될 수 있다.
이때 Spark는 다음과 같은 방식을 통해 자동으로 복구하여 작업의 신뢰성과 무결성을 유지한다:
a.
DAG(Directed Acyclic Graph)로 작업을 구성
•
Spark는 작업을 수행할 때, 작업 단계를 DAG로 구성한다. 이 DAG는 전체 작업의 순서를 나타내는 일종의 설계도이다. DAG를 통해 각 작업이 어디서부터 시작되고 어떤 데이터가 필요했는지를 추적할 수 있다.
b.
RDD(Resilient Distributed Dataset)의 내결함성
•
Spark의 데이터 구조인 RDD는 자동으로 내결함성(fault-tolerance)을 지원한다. 즉, RDD는 원본 데이터와 변환 과정을 기억하고 있기 때문에 특정 노드가 고장 나더라도, 다른 노드에서 해당 데이터를 복구하여 동일한 연산을 다시 실행할 수 있다.
c.
재시도 및 복구
•
Spark는 문제가 발생한 부분의 작업만 다시 실행하여, 전체 작업을 처음부터 다시 할 필요 없이 필요한 부분만 복구한다. 예를 들어, 100개의 노드 중 한 노드가 실패하면, 그 노드에서 실행 중이던 작업만 다른 노드에서 재실행된다.
이러한 복구 기능 덕분에 Spark는 데이터 무결성(데이터가 손상되지 않음)과 작업 완료(실패해도 전체 작업이 완료됨)를 보장할 수 있다.
2.
Spark 인메모리 처리 (캐싱)
Spark 인메모리 처리 기능은 자주 접근하는 데이터를 캐시하여 디스크 I/O를 줄이고 성능을 크게 향상시킨다.
이는 반복적인 알고리즘이나 상호작용 데이터 분석에 매우 유리하다.
3.
Spark는 Hadoop, Cassandra, SQL 데이터베이스 등 다양한 데이터 소스와 프레임워크와 원활하게 통합될 수 있는 다재다능한 도구이다.
4.
머신러닝, 그래프 처리, 스트리밍 분석을 위한 광범위한 라이브러리를 제공하며,
Python, Java, Scala, R 등 다양한 프로그래밍 언어에 대한 API를 제공해 폭넓은 개발자가 접근할 수 있다.
0-5. 누가 Spark 를 배워야 할까?
Spark는 특히 대규모 데이터 처리를 다루는 데이터 엔지니어, 데이터 과학자, 빅데이터 전문가에게 유용하다. 방대한 데이터 세트를 효율적으로 처리하고, 분석하며, 인사이트를 도출할 수 있도록 도와준다.
0-6. PySpark를 배우기 위해 필요한 전제조건
이것들이 필수는 아니다.
•
분산 컴퓨팅 시스템이나 빅데이터 개념
•
프로그래밍 기초와 Python에 대한 기본적인 지식
1. 환경 설정
!pip install pyspark
Python
복사
영상에서는 로컬 JupterLab 에서 진행하기 때문에 여러 설치와 환경 설정 단계를 거치지만, 코랩의 경우에는 다음 명령어만 입력하면 Pyspark 를 쓰기 위한 세팅이 완료된다.
2. 배운 모든 코드
# Import PySpark
from pyspark.sql import SparkSession
# Create a SparkSession
spark = SparkSession.builder \
.appName("PySpark-Get-Started") \
.getOrCreate()
# Test the setup
data = [("Alice", 25), ("Bob", 30), ("Charlie", 35)]
df = spark.createDataFrame(data, ["Name", "Age"])
df.show()
Python
복사
위 코드를 실행하여 setup 제대로 됐는지 테스트