[스파크] 아파치 스파크(Apache Spark)란?

아파치 스파크(Apache Spark)란?

image

  • 빅데이터 처리를 위한 오픈 소스 고속 분산 처리 엔진이다.
  • 우리가 아는 회사라면 대부분이 다 사용하고 있다.
    • 아마존, 마이크로소프트, 넷플릭스, 에어비엔비, 어도비, 나사 등
  • 그렇다면, 위 회사들이 느끼는 공통적인 문제가 있다는 뜻이다.
    • 그 문제는 바로 빅데이터 문제이다.
      • 규모: 데이터의 크기가 증가한다.
      • 속도: 데이터가 생성되는 속도가 증가한다.
      • 다양성: 데이터의 종류가 증가한다.

image

  • 빅데이터 문제를 가장 먼저 겪은 구글에서 ‘The Google File System’이라는 논문을 발표한다.
  • 이 논문에 영감을 받은 야후는 하둡(Hadoop)이라는 프로젝트를 발표하게 되었다.

하둡(Hadoop)이란?

  • 하나의 에코 시스템을 이루고, 크게 세가지의 파트를 가졌다.
    • HDFS: 파일 시스템
    • Map Reduce: 연산 엔진
    • Yarn: 리소스 관리 클러스터 매니저
  • 아파치 스파크는 연산 엔진을 대체하는 프로젝트이다.

스파크의 특별한 점

  • 빠르다.

메모리 계층 구조

  • 메모리에서 CPU까지의 계층 구조를 아래와 같이 나타낼 수 있다.

image

  • 컴퓨터가 연산을 시작하면 하드디스크에서 CPU까지 위로 이동을 하게 된다.
  • 연산에 자주 쓰이는 데이터는 CPU가 데이터를 더 빨리 접근하기 위해서 위로 향하게 되고, 연산에 자주 쓰이지 않는 데이터는 아래로 향하게 된다.

image

  • 위 이미지는 계층 간 속도 차이를 알 수 있는 테이블이다.
  • 똑같은 일을 하는데 한 칸 씩 내려갈 때마다 속도의 차이가 굉장히 크게 난다고 볼 수 있다.
  • 일반적인 컴퓨터 램의 용량은 8GB ~ 16GB 정도이다.
  • 이 때 100 메가 바이트의 데이터 처리는 문제가 없겠지만, 만약 100 페타 바이트 데이터 디스크를 사용하여 처리를 하게 되면 굉장히 느릴 것이다.
  • 그리하여 나온 아이디어가 데이터를 쪼개어 처리하자는 것이다.

image

  • 쪼갠 데이터를 여러 노드의 메모리에서 동시에 처리하자는 것이다.
  • 그렇기 때문에 여러 컴퓨터를 사용하면서 인메모리(In-Memory) 연산이 가능하게 된다.

인메모리(In-Memory) 연산

  • 스파크가 빠르다는 것은 빅데이터의 인메모리 연산이 가능하다는 것을 뜻한다.

스파크 클러스터

image

  • 스파크는 하나의 클러스터를 이루게 되는데 스파크 컨텍스트가 있는 드라이버 프로그램, 클러스터 매니저, 워커 노드 세 가지로 나눌 수있다.
    • 드라이버 프로그램는 사용하게 될 컴퓨터이다.
      • 파이썬, 자바, 스칼라 등으로 테스크를 만들고 정의한다.
    • 정의 된 테스크는 클러스터 매니저로 넘어가서 일거리가 분배된다.
      • 이 때 여러가지 클러스터 매니저를 사용할 수 있다.
      • 하둡이라면 Yarn, AWS라면 Elastic MapReduce를 쓸 수 있다.
    • 마지막으로 연산을 하는 노드는 1 CPU 코어 당 1 노드(Node)가 배치되어, 인메모리 연산을 담당하고 있다.
  • 하지만 컴퓨터로 스파크 프로그램을 돌리면 판다스 보다 느리다는 것을 느끼게 되는데, 그 이유는 스파크가 확장성을 고려하여 설계되었기 때문이다.

image

  • 위 이미지는 1개의 노드에서 판다스와 스파크의 성능을 비교한 테이블이다.
  • 배열에서 최고값을 찾는 단순 연산을 시켜보면, 판다스는 속도를 유지하며 쭉 올라가다가 일정 파일 크기에서 Out of memory가 발생한 걸 알 수 있다.
  • 하지만 스파크는 아무리 파일 크기가 커지더라도 속도를 유지하며 계속 연산을 할 수 있는 것을 확인할 수 있다.
  • 이는 스파크가 수평적 확장이 가능함을 나타내며 노드는 필요에 따라 계속 늘릴 수 있다.

판다스 vs 스파크

image

그래도 스파크는 빠르다.

  • 하둡 MapReduce보다 메모리상에서 100배, 디스크 상에서 10배정도 빠르다.
  • 게으른 연산(Lazy Evaluation): 테스크를 정의할 때는 연산을 하지 않다가 결과가 필요할 때 연산하기 때문에 기다리면서 연산 과정을 최적화 할 수 있다.

RDD(Resilient Distributed Dataset)

  • RDD는 스파크의 핵심 데이터 모델이다.(RDD만 알아도 스파크의 90%를 이해하는 것일 만큼 코어 컨셉이다.)
  • 여러 분산 노드에 걸쳐서 저장되고, 변경이 불가능하며 여러개의 파티션으로 분리된다는 장점이 있다.

스파크의 진화

  • 1에서 3까지의 버전 동안 어떤 기능이 추가 되었고, 트렌드가 어떻게 변하고 있는지 알아볼 것이다.

Spark 1.0

  • 2014년에 정식 발표되어 RDD를 이용한 인메모리 처리 방식을 고안했다.
  • 데이터프레임이라는 자료구조가 버전 1.3에 추가 되었고, Project Tungsten 덕분에 엔진 업그레이드로 메모리와 CPU 효율을 최적화 할 수 있게 되었다.

Spark 2.0

  • 2016년에 발표되어 단순화되고 성능이 개선되었다.
  • SparkSQL 위에 올린 Structured Streaming 이라는 프로젝트로 인해 스트리밍 프로세싱이 어느정도 가능하게 되었다.
  • 데이터셋이라는 데이터프레임의 확장형 자료구조가 등장하였다.
  • Catalyst Optimizer 프로젝트로 인해서 언어에 상관없이 동일한 성능을 보장할 수 있게 되어 파이썬을 비롯해 스칼라, 자바, R이 사용 가능하게 되었다.

Spark 3.0

  • 2020년에 발표되어 MLlib과 SparkSQL의 기능이 추가되었다.
  • 스파크 2.4보다 약 두 배 가량 빨라졌다.
    • 이는 Adaptive execution과 Dynamic partition pruning과 같은 최적화 프로젝트 덕분이었다.
  • 파이스파크의 사용성 개선도 눈에 띄었다.
  • 딥러닝 지원이 강화되었는데, GPU 노드가 지원 되어 머신러닝 프레임 워크와 연계가 가능해졌다.
  • 분산 그래프 연산을 가능하게 해주는 GraphX라는 프로젝트도 추가되었다.
    • 추천이나 피드를 띄우는 프로젝트를 하는 데에 유용하다.
  • 파이썬 2의 지원이 끊기고, 쿠버네티스의 지원이 강화되었다.

스파크 구성

  • 현재 5가지(Spark Core, Spark SQL, Spark Streaming, MLlib, GraphX)로 이루어져 있는데, 새 기능이 추가되고 성능이 좋아지고 있을 뿐 근본은 바뀌지 않는다.

참조

0%