해당 글은 글또 커뮤니티를 통해 제공 받은 udemy 강의 <Apache Spark와 Python으로 빅데이터 다루기> 를 기반으로 작성되었습니다.
데이터 엔지니어라면 한번쯤은 들어보고 다뤄 봤을 기술인 Spark 💫
하지만 정작 Spark에 대한 정의를 설명해보라고 하면 익숙한 만큼 표현하기 어렵게 느껴진다.
이번 글에서는 Spark란 무엇인지, 어떤 식으로 구성되어 있는지 기초적인 부분을 다뤄보고자 한다.
Spark란 무엇인가?
Spark의 공식 이름은 Apache Spark로, 아파치 소프트웨어 재단에서 운영하고 있다.
공식 사이트(https://spark.apache.org)에 들어가 보면 아래와 같이 Spark를 정의하고 있다.
Apache Spark™ is a multi-language engine
for executing data engineering, data science, and machine learning
on single-node machines or clusters.
위 정의를 직독직해 해보자면,
"단일 머신 또는 클러스터에서 데이터 엔지니어링, 데이터 사이언스와 머신 러닝을 수행하기 위한 다중 언어 엔진"이라는 의미이다.
이처럼 Apache Spark는 대규모 데이터를 처리하기 위해 설계된 빠르고 범용적인 클러스터 컴퓨팅 시스템으로,
복잡한 데이터 처리 작업을 위해 큰 데이터를 여러 조각으로 나누고, 여러 장치에 데이터를 분배해서 동작시키는 형식으로 구성되어 있다.
실제 사용자는 하나의 컴퓨터에서 코드를 다루지만, 내부적으로는 해당 작업을 여러 클러스터로 나눠서 작업시키게 되는 것이다.
이 스크립트는 단일 데스크톱 프로그램처럼 작동하지만 실제로는 클러스터 전체의 리소스를 활용한다.
Spark는 자체 클러스터 매니저를 포함하고 있는데,
필요에 따라 Hadoop의 YARN이나 Apache Mesos와 같은 다른 클러스터 매니저 위에서도 실행할 수 있다.
이러한 덕분에 다양한 환경과 잘 통합될 수 있고, 대규모 클러스터에서도 뛰어난 확장성과 내결함성을 제공한다.
사실 이렇게 여러 클러스터로 분할해서 하는 작업은 기존의 MapReduce 방식과 유사하다.
(MapReduce에 대한 개념은 https://heehehe-ds.tistory.com/199 글에서도 확인할 수 있다.)
그렇다면 기존에 비슷한 개념의 프레임워크가 있는데도 왜 Spark가 사용되기 시작했을까?
MapReduce 대신 Spark를 사용하는 이유
1. 빠른 처리 속도 (in-memory 방식)
전통적인 Hadoop MapReduce와 비교했을 때 Spark가 더 뛰어난 부분은 바로 "처리 속도"이다.
Spark는 in-memory 방식으로 작업을 처리하기 때문에, disk 기반의 MapReduce보다 훨씬 빠르게 동작이 가능하다.
공식 문서에 따르면 Spark는 일반적으로 10배 이상 더 빠르게 동작된다고 한다.
(사실 udemy의 spark 강의에서는 보통 사용해보면 그정도 까지는 아니고😅 2-3배 정도는 빠르다고 한다)
2. DAG workflow (lazy evaluation)
Spark는 DAG(Directed Acyclic Graph, 비순환 방향 그래프) 방식으로 작업이 진행된다.
DAG는 airflow에서 많이 사용되는 파이프라인 구조로,
쉽게 말하자면 순차적으로 앞 작업이 진행되면 다음 작업이 진행되는, 앞으로 나아가기만 하는 형식이라고 볼 수 있다.
무엇보다 lazy evaluation으로 Spark도 벼락치기(?) 형식으로 작업을 진행한다.
특정 작업에 대한 코드를 실행시키더라도 최종 결과를 보여달라고 말하기 전까지는 해당 작업이 진행되지 않는다.
즉, 이 작업이 필요 없으면 진행되지 않고 쌓아두다가 어떤 결과를 위해서 작업이 필요할 때 부랴부랴 동작되는 것이다.
이를 통해 Spark는 작업의 순서와 의존성이 효율적으로 관리되고 전체적으로 프로세스의 성능이 향상된다.
3. 용이한 코드 작성
마지막으로 Spark는 Python, Java, Scala 등 우리가 흔히 알고 있는 언어로 스크립트를 작성할 수 있다.
3가지 언어 중 하나를 알고 있다면 Spark를 쓰기 위해 새로운 언어를 따로 배우지 않아도 된다는 것이다.
그리고 MapReduce로 짠다면 여러 줄로 작성해야 하는 코드를 한줄로 짧게 작성할 수도 있다.
예를 들어, 유명한 예제 wordcount(단어 개수 세기)를 MapReduce 형식으로는 아래와 같이 Mapper와 Reducer를 짜야한다.
def mapper(input):
lines = input.split('\n')
map_results = []
for line in lines:
words = line.split()
for word in words:
map_results.append((word, 1))
return map_results
def reducer(mapped_data):
reduced_results = {}
for key, value in mapped_data:
if key in reduced_results:
reduced_results[key] += value
else:
reduced_results[key] = value
return reduced_results
input_text = "hello world\nhello again world\nworld hello"
mapped_data = mapper(input_text) # mapper 실행
reduced_data = reducer(mapped_data) # reducer 실행
print(reduced_data) # 결과 출력
하지만 Spark는 이렇게 간단하게 한 줄로 끝낼 수 있다.
result = textFile.flatMap(lambda line: line.split(" "))
.map(lambda word: (word, 1))
.reduceByKey(lambda a, b: a + b)
그렇다면 Spark는 어떻게 구성되어 있기에 이렇게 간단하게 이용할 수 있을까?
Spark 구성요소
Spark의 핵심은 다양한 라이브러리와 함께 제공되는 Spark Core이다.
분산 데이터 처리 엔진으로 Spark의 기본 기능 대부분이 제공되며,
RDD(Resilient Distributed Datasets)라는 복구 가능한 분산 데이터셋을 기반으로 동작된다.
자동으로 데이터가 분할되고, 클러스터 노드 간 분산되고, 필요에 따라 복제 및 자동으로 복구되면서 내결함성을 제공한다.
Spark Core에서 제공되는 대표적인 라이브러리는 다음과 같다.
- Spark Streaming
: 실시간 데이터 스트리밍 처리를 위한 라이브러리로, 실시간 데이터 수집 및 배치 처리가 가능하다. - Spark SQL
: 구조화된 데이터 처리를 위한 라이브러리로, SQL 및 HiveQL 쿼리를 실행할 수 있다. - MLLib
: 머신러닝 알고리즘 구현을 제공하는 라이브러리로, 다양한 ML 작업을 지원한다. - GraphX
: 그래프 기반 데이터 처리를 위한 라이브러리로, 그래프 연산 API 등 그래프 계산을 위한 다양한 API가 제공된다.
이 모든 구성요소와 기능이 통합된 Spark는 데이터 분야에서 효과적으로 대규모 작업을 수행할 수 있는 강력한 플랫폼이다.
Spark는 2014년 버전 1.0을 시작으로 2020년 버전 3.0, 2024년 2월에는 버전 3.5.1까지 출시되면서
계속해서 더욱 빠른 속도 및 GPU 인스턴스 지원 등의 기능을 추가하며 개선되고 있다.
(Release 목록: https://spark.apache.org/news/index.html)
앞으로도 꾸준히 다양한 기능과 뛰어난 성능으로 개선되면서 Spark를 더욱 유용하고 편하게 사용하게 되길 바란다 :)
'DATA SCIENCE > DATA ENGINEERING' 카테고리의 다른 글
[DE] 하둡 없이 맵리듀스를?! Local MapReduce 오픈소스 파헤치기 (0) | 2023.06.17 |
---|---|
[DE] 2023 DEVIEW - SCDF로 하루 N만곡 이상 VIBE 메타 데이터 실시간으로 적재하기 (스트림 처리 레거시 극복일지 엿보기) (0) | 2023.06.04 |
[DE] 개발자들은 어떤 데이터베이스를 많이 사용할까? (2) | 2023.05.07 |
[DE] 쿠버네티스(kubernetes): 컨테이너도 자동화가 필요해! (0) | 2023.04.09 |