안녕하세요 오늘은 BESPIN GLOBAL Innovate AI실 김철환님이 작성해주신 [BigData] Spark 개요 정리에 대해 소개해드리도록 하겠습니다.
목차
- 정리 목적
- Spark 소개
- Spark 장점
- 기업에서의 활용
- Python Script와 Spark 성능 비교
- Python Pandas와 Spark 데이터 활용
1. 정리목적
- Spark가 무엇인지 파악합니다.
- Spark의 개요와 장점, 기업에서의 사용하는 방식에 대해 확인해봅니다.
- Python 스크립트와 Spark 성능 비교를 해봅니다.
- Python Pandas와 Spark 비교 및 DataFrame 데이터 활용을 알아봅니다.
2. Spark 소개
여러가지 명칭이 존재하지만 통합 컴퓨팅 엔진이라 정리할 수 있습니다.
- 클러스터 환경에서 데이터를 병렬 처리하는 라이브러리 집합
- 오픈 소스 분산 클러스터 컴퓨팅 프레임워크
- 대용량 데이터를 처리하는 인메모리 고속 처리 엔진
좀 더 자세히 설명하자면, SQL, 스트리밍, 머신러닝 및 그래프 처리를 위한 기본 제공 모듈이 있는 대규모 데이터 처리용 통합 분석 엔진입니다.
Hadoop, Mesos, Kubernetes에서 자체적으로 실행될 수 있으며 다양한 데이터 소스에 대해 실행될 수 있습니다.
오늘날 시장에서 분산 시스템 중 Spark와 Hadoop이 대표적이며 함께 사용하는 경우가 많습니다.
2.1 통합

빅데이터 애플리케이션 개발에 필요한 플랫폼 제공이 핵심 목표이며 데이터 읽기, SQL 처리, 스트림 처리, 머신러닝까지 다양한 작업을 같은 연산 엔진과 일관성 있는 API로 수행할 수 있도록 설계되어있습니다.
2.2 컴퓨팅 엔진

Spark는 영구 저장소 역할은 수행하지 않고 데이터를 연산하는 역할만 수행합니다.
대신 클라우드 스토리지 및 파일시스템(HDFS), Key-Value Store(카산드라), 메시징 서비스(Kafka) 등 다양한 스토리지를 지원합니다.
2.3 구성요소
Spark 생태계에는 5가지 주요 구성요소가 포함되어 있습니다.
2.3.1 Spark Core
Spark Core는 범용 분산 데이터 처리 엔진이며 그 위에 SQL, 스트림 처리, 머신러닝, 그래프 계산을 위한 라이브러리가 있습니다.
이 모든 라이브러리를 애플리케이션에서 함께 사용할 수 있습니다.
전체 프로젝트의 기반으로 분산된 작업 디스패치, 예약, 기본 I/O 기능을 제공합니다.
2.3.2 Spark SQL
구조화된 데이터를 사용하는 작업을 위한 Spark 모듈이며 다양한 데이터 소스에 액세스하는 일번적인 방법을 지원합니다.
Spark SQL에서는 SQL이나 친숙한 DataFrame API를 사용하여 Spark 프로그램 내의 구조화된 데이터를 쿼리할 수 있습니다.
HiveQL 구문을 지원하며 Hive 웨어하우스에 대한 액세스를 허용합니다.
Java 데이터베이스 연결 또는 개방형 데이터베이스 연결을 통해 표준 연결을 제공합니다.
2.3.3 Spark Streaming
확장 가능하고 내결함성 있는 스트리밍 솔루션을 쉽게 빌드할 수 있게 합니다.
스트림 처리에 Spark 언어 통합 API를 활용하므로 일괄 작업과 동일한 방식으로 스트리밍 작업을 작성할 수 있습니다.
Java, Scala, Python 언어를 지원합니다.
2.3.4 MLib
실용적인 머신러닝을 확장 가능하고 쉽게 만드는 도구를 갖춘 Spark 확장형 머신러닝 라이브러리입니다.
MLib에는 분류, 회귀분석, 추천 및 클러스터링 등 일반적인 학습 알고리즘이 많이 포함되어 있습니다.
기능 변환, 머신러닝 파이프라인 구성, 모델 평가, 분산 선형 대수, 통계를 포함한 워크플로우와 기타 유틸리티도 포함되어 있습니다.
2.3.5 GraphX
그래프와 그래프 병렬 계산을 위한 Spark API로서 유연성이 뛰어나며 그래프와 컬렉션 모두에서 원할하게 작동됩니다.
추출, 변환, 로드와 탐색 분석, 반복적 그래프 계산이 한 시스템 내에 통합되어 있습니다.
성능 면에서도 가장 빠른 그래프 시스템과 필적하는 동시에 Spark의 유연성, 내결함성, 사용 편의성을 유지합니다.

위 그림은 Spark 아키텍처를 논리적으로 도식화 한 그림입니다.
간단하게 설명 하자면 아래와 같습니다.
- Storage : Spark가 연산을 실행해야 할 데이터 저장소 연결
- Management : 클러스터 실행 환경 관리
- Engine : RDD, DataFrame, DataSet에 연산을 명령하여 데이터를 처리하는 작업을 수행
- Library : Spark 자체 라이브러리
- Programing : 지원하는 언어
3. Spark 장점
3.1 속도
- Hadoop 맵리듀스보다 100배 빠른 속도로 워크로드를 실행할 수 있습니다.
- Spark는 DAG(Directed Acyclic Graph) 스케줄러, 쿼리 최적화 도구, 물리적 실행 엔진을 사용하여 일괄 처리 데이터와 스트리밍 데이터 모두에 대해 고성능을 달성합니다.
3.2 사용 편의성
- Spark는 병렬 앱을 쉽게 빌드할 수 있게 해주는 상위 수준의 연산자를 제공합니다.
- Scala, Python, R, SQL 셀에서 대화형으로 Spark를 사용하여 애플리케이션을 바르게 작성할 수 있습니다.
3.3 보편성
- Spark는 SQL, DataFrame, 머신러닝용 MLib, GraphX, Spark Streaming을 비롯한 다양한 라이브러리를 지원합니다.
- 이러한 라이브러리를 동일한 애플리케이션에서 원활하게 결합할 수 있습니다.
3.4 오픈 소스 프레임워크
- 사용하는 개발자들이 많아 커뮤니티가 활성화 되어 있어 문제 발생시 해결도 지원하므로 빠르게 해결이 가능합니다.
4. 기업에서의 활용
넷플릭스, 야후, 이베이와 같은 회사에서 8,000개 이상의 노드 클러스터에서 여러 빅데이터들을 종합적으로 처리하면서 대규모로 Spark를 사용합니다.
또한 많은 기업들이 Spark를 사용하여 구조화 또는 구조화되지 않은 대량의 실시간, 아카이브 데이터를 처리 및 분석하는 작업을 합니다.
5. Python Script와 Spark 성능 비교
용량이 큰 데이터 처리 성능 비교를 본격적으로 진행하면 다음과 같습니다.
(직접 진행하지 못하였으나 비교를 진행한 블로그를 찾아 공유 합니다.)
5.1 개요
1.5 GB 크기로 이루어진 txt 파일을 input으로 받아 일요일이 몇 개 존재하는지 알아내는 코드를 진행하였고 똑같은 local PC에서 standalone(독립형)으로 진행하였습니다.
Python 스크립트 즉, Pandas로 진행 하였을 때 걸린 시간과 Spark로 진행하였을 때 걸린 시간을 비교하였으며 Spark로 단순하게 사용하였을 때와 아닌 경우의 차이를 비교한 것입니다.
5.2 스크립트 생성
단순하게 스크립트 생성을 하였고 한 줄씩 값을 읽어와서 data object로 변환 후 일요일이면 count를 1 올립니다.
- Python Script
from datetime import datetime import calendar start_time = datetime.now() print(f'start time: {start_time}') with open('/Users/yaboong/test_big_data.txt', 'r') as f: lines = f.readlines() sunday_cnt = 0 for line in lines: line_value = line.strip() date = datetime.strptime(line_value, '%Y%m%d') weekday = date.weekday() sunday_cnt = sunday_cnt + 1 if calendar.day_name[weekday] == 'Sunday' else sunday_cnt end_time = datetime.now() print(f'end time: {end_time}') print(f'SUNDAY COUNT: {sunday_cnt}') print(f'elapsed time: {end_time - start_time}')
Python 스크립트 실행 결과는 다음과 같습니다.
start time: 2018-01-01 22:40:04.362794 end time: 2018-01-01 23:34:53.773569 elapsed time: 0:54:49.410775 SUNDAY COUNT: 25040000 Process finished with exit code 0
- Spark
같은 데이터를 가지고 Spark를 이용하여 실행하였을 때 걸린 시간은 다음과 같습니다.
18/01/17 22:22:46 INFO DAGScheduler: Job 0 finished: count at SundayCount.scala:33, took 98.203385 s
6. Python Pandas와 Spark 데이터 활용
Python 패키지인 pandas와 Spark를 비교하는 이유는 현재 프로젝트에서 데이터를 DataFrame으로 read하여 작업하는 부분이 있기 때문에 비교를 해 보았습니다. (여기서 데이터는 10 GB 이상 되는 데이터를 말합니다.)
6.1 Pandas란?
우선 Pandas는 쉽고 직과적인 관계형 또는 분류된 데이터로 작업할 수 있도록 설계된 데이터 구조를 제공하는 Python 패키지입니다.
예를 들어 CSV 파일이나 Parquet 파일 등 데이터를 구조화(행, 열) 해서 read해 주는 역할을 해줍니다.
6.2 Pandas와 Spark의 공통점과 차이점
- Pandas와 Spark는 DataFrame이라는 SQL 테이블 또는 Excel 스프레드 시트에서와 같이 이질적으로 유형이 지정된 열이있는 테이블 형식 데이터를 다루게 될 때 적합합니다.
- 대부분의 데이터처리에는 Pandas 라이브러리를 통해 해결하지만 Spark를 사용하는 이유는 데이터의 크기 때문입니다.
- Pandas는 통상적으로 Spark보다 작은 데이터 처리에 대해서는 속도가 빠르지만 10 GB 이상의 파일 처럼 크기가 커지게 되면 Pandas 경우 메모리 부족으로 성능이 저하되거나 Error가 발생합니다.

하기에 2.43 GB 크기의 데이터를 read만 할 때 어떻게 성능이 다른지 비교해 보았습니다.
비교 위에서 했던 방법처럼 간단합니다.
- 2.43 GB 데이터를 read하여 걸린 시간을 확인합니다.
- 특정 컬럼 값을 카운트 하는 로직에 대해 얼마나 걸리는지 확인하비다.
Python Pandas와 Spark(Pyspark) 비교하였으며 단지 데이터를 read하는 부분에서도 성능차이를 보이는 것을 알 수 있습니다.

6.2.1 Pandas
Pandas에서 2.43 GB 데이터를 read한 시간은 다음과 같습니다.
start time: 2023-10-23 09:35:55.509350 end time: 2023-10-23 09:36:38.948910 elapsed time: 0:00:43.439560
특정 컬럼 값에 대한 카운트 결과는 다음과 같습니다.
elapsed time: 0:00:01.000059 특정 값 Count: 494
정리하자면, Pandas에서 데이터를 read한 시간은 43초, 특정 컬럼 값을 카운트한 시간은 1초 정도 걸린 것으로 나타났습니다.
6.2.2 Spark (Pyspark)
Spark(Pyspark)에서 2.43 GB 데이터를 read한 시간은 다음과 같습니다.
start time: 2023-10-23 09:35:09.611832 end time: 2023-10-23 09:35:13.727833 elapsed time: 0:00:04.116001
특정 컬럼 값에 대한 카운트 결과는 다음과 같습니다.
elapsed time: 0:00:00.010025 특정 값 Count: 494
마찬가지로 정리하자면, Spark에서 데이터를 read한 시간은 4초, 특정 컬럼 값을 카운트한 시간은 0.01초 정도 걸린 것으로 나타났습니다.
6.2.3 Pandas와 Spark 정리
위에서 진행했던 테스트를 표로 정리하자면 아래와 같습니다.

이처럼 큰 양의 데이터를 처리할 때 Pandas 보다는 Spark를 활용하여 진행하는 것이 더 멘탈(?)에 도움을 줄 수 있으며 빠르게 처리가 가능한 것을 알 수 있습니다.
테스트한 데이터가 큰 양은 아니지만 이 정도 데이터 사이즈에서도 차이가 난 부분을 확인하여 유추할 수 있습니다.
여기까지 ‘Spark 개요 정리’에 대해 소개해드렸습니다. 유익한 정보가 되셨길 바랍니다. 감사합니다.
Written by 김 철환 / innovate AI실
BESPIN GLOBAL