Apache Spark
Apache Spark 개요
Apache Spark는 빅 데이터 및 머신 러닝과 같은 대규모 데이터를 처리하는 클러스터 컴퓨팅을 위한 분산 처리 프레임워크이다. Spark는 2009년에 칼포르니아 버클리 대학교의 AMPLab로, Hadoop의 커미터(소스코드 입력 권한 보유한 원천개발자)이기도 한 마테이 자하리아(Mate Zaharia)에 의해 개발이 개시되어 현재는 Apache 소프트웨어 재단의 톱 프로젝트의 하나로서 관리, 개발이 계속되고 있다.
Spark가 개발된 목적으로는 기존 MapReduce의 처리 속도가 느린 것에 대한 개선과 Map과 Reduce의 반복을 반복하는 스타일에 얽매이지 않는 유연한 처리 스타일에 대한 대응을 들 수 있다.
Spark는 분산 처리 프레임워크로서 단독으로도 동작하기 때문에 포스트 Hadoop로서 주목받고 있는 한편, MapReduce, HDFS, YARN 등으로 이루어지는 Hadoop 코어 시스템중의 MapReduce의 대체로서 이용하는 것도 가능하게 되어 있다.
Apache Spark의 주요 특징
Spark의 큰 특징으로서 Spark가 제공하는 간소한 API를 사용하여 유연한 처리 모델을 쉽게 프로그래밍 할 수 있는 것, 대규모 데이터에 대해 기존의 MapReduce에 비해 훨씬 짧은 시간에 처리를 할 수 있는 것 등이 언급할 수 있다.
기존의 MapReduce에서는 처리 모델로서 Map과 Reduce를 1세트로 수행할 필요가 있었기 때문에, Hadoop상에서 움직이는 어플리케이션을 개발하기 위해서는 이 스타일에 따라서 개발할 필요가 있었다. 그 때문에 유연한 처리 모델을 개발하는 것이 어렵다고 하는 문제가 존재했었다.
또한 MapReduce에서는 한 번의 Map 및 Reduce 처리마다 처리 결과를 Disk에 쓰는 것이 발생하여 처리 속도를 향상시키는 것이 어렵다는 문제가 존재했다. 이에 대해 Spark에서는 메모리에 읽어들인 데이터 세트(RDD)에 대해서 복수회의 Map 처리를 연속하여 실행하여 한층 더 Reduce한 결과를 Disk에 기입하지 않고 인메모리 상태로 한층 더 다음의 Map 처리를 그 데이터 세트에 대해서 행하는 방법을 취하고 있기 때문에, MapReduce에 비해 최대로 100배 이상의 처리 속도의 향상을 볼 수 있는 경우도 있다고 한다(기존의 MapReduce와 같이 처리 결과를 디스크에 쓸 수도 있다).
스파크의 특징은 다음과 같습니다.
- Speed
- 인메모리(In-Memory) 기반의 빠른 처리
- Ease of Use
- 다양한 언어 지원(Java, Scala, Python, R, SQL)을 통한 사용의 편이성
- Generality
- SQL, Streaming, 머신러닝, 그래프 연산 등 다양한 컴포넌트 제공
- Run Everywhere
- YARN, Mesos, Kubernetes 등 다양한 클러스터에서 동작 가능
- HDFS, Casandra, HBase 등 다양한 파일 포맷 지원
Apache Spark의 컴포넌트 구성
Spark는 분산 처리 프레임워크로 다음 컴포넌트 요소로 구성된다.
- Spark Core (Scala, Java, Python, RAPI 포함)
- Spark SQL + DataFrames
- Spark Streaming
- MLlib
- GraphX
Spark Core
Spark는 처리할 데이터를 RDD(Resilient Distributed Dataset) 형식으로 유지한다.
RDD는 변하지 않고 병렬로 실행 가능한 컬렉션으로, 분산된 각 컴퓨터에 배치된다.
Spark를 사용한 프로그래밍 모델에서는 이 RDD에 대해서 Spark Core에서 제공되고 있는 각종 메소드를 적응하면서 처리를 실시해 간다. Spark Core에서 제공하는 API를 통해 RDD를 조작할 때 개발자는 분산된 데이터를 의식하지 않고 분산 처리를 실행할 수 있다.
이는 Spark의 특징의 하나의 유연한 처리를 용이하게 프로그래밍 할 수 있다고 하는 점이다.
Spark Core에서 제공되는 API이지만, Spark의 개발 언어인 Scala 이외에도 Java, Python, R이라고 말한 언어로부터 호출 가능한 API가 표준으로 제공되고 있다. 또, 3rd-Party 라이브러리 중에는 Scala와 같이 JavaVM상에서 움직이는 함수형 언어의 Clojure로부터 Spark API를 호출하기 위한 라이브러리도 존재하고 있어, 또 다른 언어의 Spark API도 계속 늘어 날거라 예상된다.
Spark SQL + DataFrames
Spark에서는 Spark에서 제공하는 API를 통해 RDD를 조작하는 방법 외에도 Spark SQL이라는 SQL과 같은 언어를 사용하여 DataFrames라는 데이터베이스 테이블과 같은 이름 열을 가진 추상화 된 데이터 세트를 조작 할 수 있다.
이것은 Scala, Java, Python, R과 같은 언어를 습득하지 않은 사용자라도 SQL에 대한 지식이 있으면 Spark SQL을 통해 Spark를 사용하여 데이터를 처리 할 수있는 인터페이스이다.
Spark Streaming
Spark에서 끊임없이 전송되는 Streaming 데이터에 실시간 분산 처리를 가능하게 하는 기능을 제공하는 엔진이다.
마찬가지로 스트리밍 데이터를 처리하는 프레임 워크로 Apache Storm이 있다. Apache Storm이 스트리밍 데이터 처리에 특화된 프레임워크인 반면 Spark Streaming은 Spark에서 실시간 데이터를 처리하는 엔진으로서의 기능이다.
그 외에도 Apache Flink라는 스트리밍 처리 프레임워크도 있다. 이쪽은 배치 처리도 가능한 데다, 기계 학습 라이브러리나 그래프 처리 라이브러리등도 존재하기 때문에, Spark에 꽤 닮은 구성으로 되어 있어, Spark의 대항마로 불리고 있다.
Apache Storm
http://storm.apache.org/
Apache Flink
http://flink.apache.org/introduction.html
MLlib
Spark의 기계 학습 라이브러리이다. Spark의 유연한 처리 스타일로 기계 학습을 수행하는 프로그램을 작성할 수 있다.
기계 학습 라이브러리로는 먼저 Hadoop과 연계하여 기계 학습을 수행하는 Mahout이라는 소프트웨어가 존재했지만, Hadoop + Mahout에서는 MapReduce의 프로그래밍 모델을 사용하여 기계 학습 프로그램을 만들어야 만 하 때문에 처리 속도의 저하라는 문제가 있었다.
그에 비해 Spark는 Hadoop보다 고속으로 처리를 할 수 있어 Spark와 Spark가 제공하는 MLlib를 사용한 기계 학습이 효율이 좋다는 점에서 주목이 높아지고 있다.
Apache Mahout
http://mahout.apache.org/
GraphX
GraphX는 Spark를 통해 그래프 데이터를 병렬 처리하는 API를 제공한다.
Spark의 특징인 고속 처리 속도로 그래프 데이터의 병렬 처리가 가능하다.
위에서 설명한 Spark를 형성하는 일부 컴포넌트에는 스토리지로 분류되는 것이 없다. Spark에서는 읽기 쓰기로 기존의 각종 스토리지를 이용할 수 있다. 아래는 Spark와 연동 가능한 스토리지의 일부이다. (3rd-party 라이브러리 이용 포함)
HDFS, Cassandra, HBase, S3, MongoDB, Couchbase, Riak, Neo4j, OrientDB
또, 읽을 수 있는 데이터 소스로서는 CSV나 XML등의 파일로부터, Solr, Elasticsearch 등의 검색 엔진등 다양하다.
Spark와 각종 데이터 소스와의 연계 패키지 목록
https://spark-packages.org/?q=tags%3A%22Data%20Sources%22
위에서 제시한 다양한 데이터 소스와의 연동을 가능하게 하는 패키지 이외에도 기존의 Spark ECO 시스템을 확장하기 위한 각종 패키지가 제공되고 있다.
이 패키지는 SparkPackage로 다음 사이트에 게시된다.
https://spark-packages.org/
Apache Spark의 운영 환경
Spark가 동작 보증하고 있는 것은, 아래와 같은 OS가 된다. 또한 실행하려면 Java가 설치되어 있어야 한다.
- 주요 리눅스 배포판
- Windows
- 리눅스
- MacOSX
Spark에서 제공하는 API가 지원하는 버전은 다음과 같다.
- Java 8, 11, 17 (Java 8u201 미만은 Spark3.2.0에서는 더 이상 사용되지 않음)
- Scala 2.12, 2.13 (Spark3.3.0은 호환되는 Scala2.12.x를 사용해야 함)
- Python 3.7 이상 (Python3.9의 경우 Apache Arrow와 pandas UDF가 작동하지 않을 수 있음)
- R 3.5 이상
Apache Spark 라이센스 형식
Spark는 Apache의 최상위 프로젝트 중 하나이다.
라이센스는 Apache License 2.0이며, 사용자는 소프트웨어의 사용, 배포, 수정 및 파생판 배포에 제한을 받지 않는다.
Apache Spark 참고 정보
Spark 개발자들이 시작한 databricks라는 회사에 의해 제공되고 있다.