[Big Data]Spark

9 minute read

Big Data: Spark 소개

  • Contents
    1. 빅데이터 정의와 예
    2. 하둡의 등장과 소개
    3. Spark 소개
    4. 판다스와 비교
    5. Spark 데이터프레임, 데이터셋, RDD
    6. Spark 개발 환경
    7. Spark 맛보기

빅데이터의 정의와 예: 빅데이터란 무엇이며 어떤 예들이 있는가?

빅데이터의 정의1

  • “서버 한대로 처리할 수 없는 규모의 데이터”
  • 2012년 4월 아마존 클라우드 컨퍼런스에서 아마존의 data scientist인 존 라우저가 내린 정의. 분산 환경이 필요하느냐에 포커스!
  • 판다스로 처리해야할 데이터가 너무 커서 처리가 불가능하다면 어떻게 할 것인가?

빅데이터의 정의2

  • “기존의 소프트웨어로는 처리할 수 없는 규모의 데이터”
  • 대표적인 기존 소프트웨어 오라클이나 MySQL과 같은 관계형 데이터베이스
    • 분산환경을 염두에 두지 않음
    • Scale-up 접근방식(vs. Scale-out)
      • 메모리 추가, CPU 추가, 디스크 추가
      • 여전히 서버 한대에서 돌아가는 데이터만 처리할 수 있음.

빅데이터의 정의3

  • 4V(Volume, Velocity, Variety, Varecity)
    • Volume: 데이터의 크기가 대용량?
    • Velocity: 데이터의 처리 속도가 중요? = 데이터가 빠르게 많이 생성되는가
    • Variety: 구조화/비구조화 데이터 둘다? = 데이터의 특성이 구조화인지, 비구조화인지, 둘 다인지. 빅데이터의 경우 비구조화된 데이터가 더 많다.
    • Veraciy: 데이터의 품질이 좋은지? 이 4가지 관점에서 빅데이터를 정의할 수 있다. Volume, Velocity가 제일 중요하다.

빅데이터의 예제 - 디바이스 데이터

  • 모바일 디바이스: 위치정보
  • 스마트 TV
  • 각종 센서 데이터(IoT 센서)
  • 네트워킹 디바이스

빅데이터의 예 - 웹페이지

  • 수십조개 이상의 웹 페이지 존재
  • 이를 크롤하여 중요한 페이지를 찾아내고 (페이지 랭크) 인덱싱하는 것은 엄청난 크기의 데이터 수집과 계산을 필요로 함
  • 사용자 검색어와 클릭 정보 자체도 대용량
    • 이를 마이닝하여 개인화 혹은 별도 서비스 개발이 가능
      • 검색어 자동 완성, 동의어 찾기, 통계 기반 번역, …
  • 이런 문제를 해결하면서 구글이 빅데이터 기술의 발전에 지대한 공헌을 하게 됨

하둡의 등장과 소개: 기존 기술과는 전혀 다른 방식을 택함으로써 대용량 데이터 처리를 가능하게 해준 하둡에 대해 알아보자

대용량 처리 기술이란?

  • 분산 환경 기반(1대 혹은 그 이상의 서버로 구성)
    • 분산 컴퓨팅과 분산 파일 시스템이 필요
  • Fault Tolerance
    • 소수의 서버가 고장나도 동작해야함
  • 확장이 용이해야함
    • Scale Out 이라고 부름: 시스템의 용량을 높이기 위해서 메모리, 디스크를 더 붙이는 것이 아니라 서버를 더 붙이는 접근방식

하둡(Hadoop)의 등장

  • 빅데이터 시대의 도래를 이끌어낸 최초의 대용량 분산처리 기술
  • 구글에서 만든 두개의 논문에서 시작된 오픈소스
  • Doug Cutting이 구글랩 발표 논문들에 기반해 만든 오픈소스 프로젝트
    • 2003년 The Google File System
    • 2004년 MapReduce: Simplified Data Processing on Large Cluster
  • 처음 시작은 Nutch라는 오픈소스 검색엔진의 하부 프로젝트
    • 하둡은 Doung Cuting의 아들의 코끼리 인형의 이름
    • 2006년에 아파치 제단의 톱레벨 별개 프로젝트로 떨어져나옴
  • 크게 두 개의 서브 시스템으로 구현됨
    • 분산 파일 시스템인 HDFS
    • 분산 컴퓨팅 시스템인 MapReduce
      • 새로운 프로그래밍 방식으로 대용량 데이터 처리의 효율을 극대화하는데 맞춤

MapReduce 프로그래밍의 문제점

  • 작업에 따라서는 MapReduce 프로그래밍이 너무 복잡해짐 -> 생산성이 떨어짐.
  • 결국 Hive(하둡 위에서 돌아가는 SQL언어)처럼 MapReduce로 구현된 SQL 언어들이 다시 각광을 받게 됨
    • SQL on Hadoop
    • 빅데이터가 뜨면서 SQL이 한물 갔다고 평가되었지만 컴백!
  • 또한 MapReduce는 기본적으로 배치 작업에 최적화(not realtime). 큰 데이터를 주기적으로 처리하는 프로그래밍 모델이다. 리얼타임으로 데이터를 처리하기에 적합하지 않다.

하둡(Hadoop)의 발전

  • 하둡 1.0은 HDFS(분산파일시스템) 위에 MapReduce라는 분산컴퓨팅 시스템이 도는 구조
    • 다른 분산컴퓨팅 시스템은 지원하지 못함
  • 하둡 2.0에서 아키텍처가 크게 변경됨
    • 하둡은 기반 분산처리 시스템이 되고 그 위에 애플리케이션 레이어가 올라가는 구조(딱 두개만 존재하는 구조)
    • Spark는 하둡 2.0위에서 애플리케이션 레이어로 실행됨
      • 손쉬운 개발을 위한 로컬 모드도 지원: 이번 강좌에서는 로컬 모드 사용 png

HDFS - 분산 파일 시스템

  • 밑단에서 발생하는 일을 신경쓰지 않고 큰 데이터들을 저장하고 읽을 수 있게 해준다. 빅데이터 시스템에서는 HDFS가 가장 기본이 된다.
  • 데이터를 블록단위로 저장
    • 블록의 크기는 128MB(디폴트)
  • 블록 복제 방식(Replication)
    • 내임노드(CPU, Memeory)
      • 데이터 노드(CPU, Memeory)
      • 데이터 노드(CPU, Memeory)
      • 데이터 노드(CPU, Memeory)
    • 위와 같은 구조
    • 서버에 저장할때 블록 방식으로 저장됨
    • 각 블록은 3군데에 중복 저장됨
    • Fault tolerance를 보장할 수 있는 방식으로 이 블록들은 저장됨

분산 컴퓨팅 시스템

  • 하둡 1.0:
    • 잡 트래커(CPU, Memeory) - master
      • 태스크 트래커(CPU, Memeory) - slave
      • 태스크 트래커(CPU, Memeory) - slave
      • 태스크 트래커(CPU, Memeory) - slave
    • 위와 같은 구조
    • 분산 컴퓨팅 시스템이 곧 맵리듀스. 맵리듀스만 돌림
    • 하나의 잡 트래커와 다수의 태스크 트래커로 구성됨
      • 잡 트래커가 일을 나눠서 다수의 태스크 트래커에게 분배
  • 하둡 2.0:
    • 하둡 자체가 분산 환경 시스템이라기보다는 분산 컴퓨팅 시스템을 만들 수 있는 프레임웤을 제공. 맵리듀스라는 분산 컴퓨팅 시스템을 만들기 보다는 사용자의 아이디어를 이 위에서 원하는 분산 컴퓨팅 시스템을 쉽게 만들 수 있도록 기본 기능들을 제공.
    • 클라이언트, 리소스 매니저, 노드 매니저, 컨테이너로 역할을 세분화
    • Spark 지원이 2.0부터 시작

하둡(Hadoop)을 이용한 데이터 시스템 구성

  • 데이터를 수집하는 레이어에서 데이터를 수집하여 HDFS로 보내고 데이터 저장이 끝나면 맵리듀스하여 프로세싱 한 결과를 다시 HDFS에 저장하기도 하고, 외부에서 바로 엑세스가 가능해야하면 관계형 DB, NoSQL, 검색엔진 등에 처리 결과를 Push한다.
    1. 데이터 수집
    2. 데이터 저장 및 처리(HDFS, MapReduce)
    3. 처리 결과 엑세스 레이어(RDBMS, NoSQL, 검색엔진)
  • 하둡은 흔히 이야기하는 Data Warehouse에 해당
  • 웍플로우(위의 데이터 수집 -> 데이터 저장 및 처리 -> 처리 결과 액세스 레이어) 관리로는 Airflow가 대세

하둡 1.0 vs. 하둡 2.0

  • 하둡 2.0을 YARN이라고 부르기도 함
  • HDFS2 위에 YARN(분산컴퓨팅시스템을 만들기 쉽게 해주는 프레임워크) 위에 MapReduce, others…(자기만의 분산컴퓨팅 시스템을 만들 수 있는 것들)
  • 요 others에 spark가 포함된다.

Spark 소개: 하둡은 1세대 빅데이터 처리기술이라면 Spark은 2세대 빅데이터 기술이라 할 수 있다. 이번 강의 주제인 Spark에 대해 알아보자

Spark의 등장

  • 버클리 대학의 AMPLab에서 아파치 오픈소스 프로젝트로 2013년 시작
    • 나중에 DataBricks라는 스타트업 창업
  • 하둡의 뒤를 잇는 2세대 빅데이터 기술
    • 하둡 2.0을 분산환경으로 사용 가능
      • 자체 분산환경도 지원하긴 함
    • Scala로 작성됨
  • MapReduce의 단점을 대폭적으로 개선
    • Pandas와 굉장히 흡사(서버 한대 버전 vs. 다수 서버 분산환경 버전)
  • 현재 Spark 버전3이며 이번 강좌에서는 이를 사용
    • 현재 Scala, Java, Python 3으로 프로그래밍이 가능
    • 머신 러닝 관련해서 많은 개선이 있었음(GPU 지원 포함)

Spark vs. MapReduce

  • Spark은 기본적으로 메모리 기반
    • 메모리가 부족해지면 디스크 사용
    • MapReduce는 디스크 기반(디스크에서 데이터 읽어옴)
  • MapReduce는 하둡 위에서만 동작
    • Spark은 하둡(YARN)이외에도 다른 분산 컴퓨팅 환경 지원
  • MapReduce는 키와 밸류 기반 프로그래밍
    • Spark은 판다스와 개념적으로 흡사
  • Spark은 다양한 방식의 컴퓨팅을 지원
    • 배치 프로그래밍, 스트리밍 프로그래밍, SQL, 머신러닝, 그래프 분석

Spark의 구조

  • 드라이버 프로그램의 존재
  • Spark은 하둡 2.0(혹은 하둡 3.0)위에 올라가는 애플리케이션
  • 우리가 하는 일은 driver 프로그램을 짜는 것이다. png

Spark 3.0의 구성

  • Spark Core: 판다스와 거의 비슷하다.
  • Spark SQL: 스파크 코어 위에서 데이터처리를 SQL로 할 수 있도록 해준다.
  • SparkStreaming: 배치 프로세싱 뿐만 아니라 리얼타임으로 스트리밍 데이터 처리하게 해줌
  • MLlib (Spark.ML)
  • SparkGraph: 그래프 형태의 데이터를 프로세싱
  • K8S 지원

Spark 프로그래밍 개념

  • 스파크 코어 프로그램은 판다스와 거의 흡사하나, 조금 다른 점은 크게 3가지 종류의 데이터 타입이 있다.(RDD, Dataframe, Dataset) RDD는 가장 로우레벨이다. RDD보다는 데이터프레임, 데이터셋을 주로 쓴다.
  • RDD(Resilient Distributed Dataset)
    • 로우레벨 프로그래밍 API로 세밀한 제어가 가능
    • 하지만 코딩의 복잡도 증가
  • Dataframe & Dataset(판다스의 데이터프레임과 흡사)
    • Dataset은 타입정보가 들어가서 파이썬같은 언어에서는 쓸 수 없다(파이썬은 스크립트 언어이기 때문에 컴파일하지 않기 때문)
    • Dataset은 컴파일하는 언어인 Scala, Java에서 사용
    • Dataframe은 Python처럼 컴파일을 하지 않는 인터프리터형 언어에서 사용
    • 하이레벨 프로그래밍 API로 점점 많이 사용되는 추세
    • SparkSQL을 사용한다면 이를 쓰게 됨
  • 보통 Scala, Java, Python 중의 하나를 사용
    • 이 강좌에서는 Python을 사용할 예정: PySpark 모듈

판다스와 비교: Spark와 비교하면 무엇이 다를까?

판다스

  • 파이썬으로 데이터 분석을 하는데 가장 기본이 되는 모듈 중의 하나
    • 엑셀에서 하는 일을 파이썬에서 가능하게 해주는 모듈이라고 생각하면 됨
    • matplotlib(시각화)나 scikit-learn(머신러닝)과 같은 다른 파이썬 모듈과 같이 사용됨
  • 소규모의 구조화된 데이터(테이블 형태의 데이터)를 다루는데 최적
    • 한 대의 서버에서 다룰 수 있는 데이터로 크기가 제약이 됨
    • 병렬 처리를 지원하지 않음
    • 큰 데이터의 경우 Spark을 사용
      • 작은 데이터를 다루는데 굳이 Spark을 쓸 필요가 없음!

Pandas로 할 수 있는 일의 예

  • 구조화된 데이터를 읽어오고 저장하기
    • CSV, JSON 등등 다양한 포맷 지원
    • 웹과 관계형 데이터베이스에서 읽어오는 것도 가능
  • 다양한 통계 뽑아보기
    • 컬럼 별로 평균, 표준편차, percentile 등 계산하기
    • 컬럼 A와 컬럼 B간의 상관 관계 계산하기(correlation)
  • 데이터 청소 작업 -> 데이터 전처리
    • 컬럼별로 값이 존재하지 않는 경우 디폴트 값 지정하기
    • 컬럼별로 값의 범위를 조정하기(normalization)
  • Visualization
    • Matplotlib와 연동하여 다양한 형태의 시각화 지원(히스토그램, 바, 라인그래프 등)
  • 판다스가 해주는 이런 일들을 더 큰 데이터에 적용하고 싶을 때 Spark를 사용.

Pandas의 데이터 구조

  • 판다스에는 크게 두가지 데이터 타입이 있다.
  • 엑셀의 시트에 해당하는 것이 Dataframe(컬럼, 즉 시리즈들의 집합)
  • 엑셀 시트의 컬럼에 해당하는 것이 Series
  • 입력 dataframe을 원하는 최종 dataframe으로 계속 변환하는 것이 핵심

데이터프레임, 데이터셋, RDD: Spark의 데이터 구조

Spark 세션

  • Spark 프로그램의 시작은 Spark 세션을 만드는 것
  • Spark 세션을 통해 Spark이 제공해주는 다양한 기느응ㄹ 사용
    • Spark 컨텍스트, Hive 컨텍스트, SQL 컨텍스트
    • Spark 2.0 전에는 기능에 따라 다른 컨텍스트를 생성해야 했음 -> 이제는 무엇을 하던간에 Spark 세션을 통해 작업을 할 수 있게 바뀌었다.
  • RDD를 만드는 예제
from pyspark.sql import SparkSession
spark = SparkSession \
    .builder \
    .appName("Python Spark create RDD example") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()
sc = spark.sparkContext
# .builder 뒤에 다양한 함수를 호출해서 내가 지금 만들고 있는 애플리케이션에 적절한 세부 옵션들을 정한다.
# .config로 다양한 형태의 키와 밸류들을 spark cluster에게 넘긴다.
# spark와 sc를 이용해 뒤에서 배울 RDD와 데이터프레임을 조작하게 됨
# sc로는 rdd를 조작하고, spark으로 데이터프레임을 조작한다.


Spark 데이터 구조

  • 크게 3가지의 자료구조가 존재
    • RDD(Resilient Distributed Dataset)
      • 로우레벨 데이터로 클러스터내의 서버에 분산된 데이터를 지칭. spark cluster는 기본적으로 하나 이상의 서버로 구성됨. 처리해야 할 데이터를 spark cluster위에 로딩할 때 쓸 수 있는 구조가 바로 rdd, dataframe, dataset이다. 이 세가지 모두 분산 저장되는 데이터이다. 한 서버에 다 들어가는 것이 아니다!
      • 레코드별로 존재하며 구조화된 데이터나 비구조화된 데이터 모두 지원
    • Dataframe과 Dataset
      • RDD위에 만들어지는 하이레벨 데이터로 RDD와는 달리 필드 정보를 갖고 있음(테이블)
      • Dataset은 Dataframe과는 달리 타입 정보가 존재하며 컴파일 언어에서 사용가능
        • 컴파일 언어: Scala/Java에서 사용가능
      • PySpark에서는 Dataframe을 사용함
        • SparkSQL을 사용하는 것이 더 일반적

Spark 데이터 구조 - RDD

  • 변경이 불가능한 분산 저장된 데이터(가장 로우레벨의 서버에 분산 저장된 데이터)
    • RDD는 다수의 파티션으로 구성되고 Spark 클러스터내 서버들에 나눠 저장됨
    • 로우레벨의 함수형 변환 지원(map, filter, flatMap 등등). 한 RDD를 다른 RDD로 변환하는 것이 쉽다.
  • RDD가 아닌 일반 파이썬 데이터(예: 리스트)는 parallelize 함수로 RDD로 변환(spark의 rdd에 입력데이터가 저장이 되어야 한다.)
py_list = [
    (1,2,3,'a b c'),
    (4,5,6,'d e f'),
    (7,8,9,'g h i'),
]

png

  • parallelize: 파이썬 안의 로컬에 있던 데이터들을 spark cluster 위의 rdd형태로 바꿔주는 것.
  • collect: rdd를 최종적으로 spark driver에서 다시 받고 싶을 때. collect로 돌려받을때는 돌려받는 데이터가 작아야 한다!

  • 하둡의 맵리듀스 프로그래밍은 기본적으로 데이터를 디스크에 저장한다. 매번 입출력이 있을때 디스크에 접근하기 때문에 시간은 오래걸리지만 굉장히 큰 데이터 처리 가능. Spark는 기본적으로 데이터를 디스크가 아닌 메모리에 항상 둔다. 메모리가 부족해지면 디스크를 쓰기 때문에, 기본적으로 메모리가 충분하게 있다면 처리 속도가 맵리듀스보다 훨씬 빠르다.
  • RDD는 데이터가 레코드들로만 구성되는데, 레코드를 구성하는 필드들에 대한 정보는 없다.
    • 장점: 구조화/비구조화된 데이터를 모두 처리할 수 있다.
    • 단점: 구조화된 데이터를 처리할때 좀더 번거롭다 -> 따라서 데이터프레임, 데이터셋이 만들어졌다.

Spark 데이터 구조 - 데이터 프레임

  • RDD 처럼 데이터 프레임도 변경이 불가한 분산 저장된 데이터
  • RDD와는 다르게 관계형 데이터베이스 테이블처럼 컬럼으로 나눠 저장
    • 판다스의 데이터 프레임과 거의 흡사
    • 데이터 프레임은 다양한 데이터소스 지원: 파일, Hive, 외부 데이터베이스, RDD 등등
  • RDD처럼 레코드로 분리될 뿐만 아니라, 레코드 안의 필드들이 뭐가 있는 지 알기 때문에 좀더 구조화된 데이터이다. 엑셀의 스프레드시트와 비슷한 형태이고, 관계형 데이터베이스의 테이블, 판다스의 데이터프레임과 동일한 구조이다. 레코드가 필드로 나눠지긴 하는데, 필드의 타입정보는 미리 정해지지 않는다.
  • 스칼라, 자바, R, 파이썬과 같은 언어에서 지원

Spark 데이터 구조 - 데이터 프레임 생성 방법

  • RDD를 변환해서 생성: RDD의 toDF 함수 사용
  • SQL 쿼리를 기반으로 생성: 아래 예 참조
    • tablename 자리에 SELECT 문도 사용가능
  • 외부 데이터를 로딩하여 생성
    • createDataFrame
  • 외부의 관계형 데이터베이스의 데이터를 데이터프레임으로 읽어오는 방법
df = spark.read.format("jdbc") \
    .option("url", "jdbc:postgresql://hostname:5432/databasename") \
    .option("dbtable", "tablename") \
    .option("user", "username") \
    .option("password", "password") \
    .option("driver", "org.postgresql.Driver") \
    .load()
df.printSchema() # 테이블의 구조가 프린트됨

Spark 데이터 구조 - 데이터 셋

  • Spark 1.6부터 추가된 새로운 데이터 타입
    • RDD와 Spark SQL의 최적화 엔진 두 가지 장점을 취함
  • 데이터 셋은 타입이 있는 컴파일 언어에서만 사용 가능
    • 데이터 셋은 자바와 스칼라에서만 지원되며 파이썬에서는 사용불가
    • 이번 강좌에서는 사용하지 못함(파이썬으로만 프로그래밍 할거라서)
  • 데이터프레임과 똑같은데 컬럼에 타입정보까지 있는 것이다.
  • 데이터프레임과 똑같은데 필드에 타입정보를 처음부터 알고 있다.
  • 컴파일하는 언어에서 쓸 수 있다.

Spark 개발 환경: 구글 Colab 사용

Spark 개발 환경

  • 개인컴퓨터에 설치하고 사용하는 방법
    • 간편하기는 하지만 노트북등을 설치하려면 복잡해짐
    • 아니면 spark-submit를 이용해 실행가능
  • 각종 무료 노트북을 사용하는 방법
    • 구글 Colab 이용
    • 데이터브릭(Databrick)의 커뮤니티 노트북 사용(속도 느림)
    • 제플린의 무료 노트북 사용: https://app.zepl.com/register (주피터노트북과 비슷, 속도 느림)
  • AWS의 EMR 클러스터 사용
    • 이는 사실 프로덕션 환경에 가까움
    • 나중 세션에서 간단히 소개

참고) Spark 로컬환경 설치방법(번거로움)

  • http://spark.apache.org/downloads.html
    • spark-3.0.1-bin-hadoop2.7.tgz을 각자 환경에 맞게 다운로드, 압축해제
    • SPARK_HOME 환경변수를 위의 패키지가 설치된 디렉토리로 지정
    • Spark의 bin 디렉토리 패스를 PATH 환경변수에 지정
    • pyspark 파이썬 모듈을 설치
  • 실행방법
    • 이 위에 주피터 노트북이나 제플린 노트북을 설치하여 실행
    • spark-submit을 이용해서 파이썬 스크립트를 실행

제플린 노트북 사용방법

  • https://app.zepl.com/register에서 무료 회원가입
  • 제플린이란?
    • 주피터와 같은 웹기반 노트북으로 파이썬, 스칼라, SQL 등의 다양한 코드를 작성, 실행, 결과확인(시각화 포함), 수정을 손쉽게 반복하고 다른 사람과 공유할 수 있음
    • 주피터와의 차이점
      • Spark을 기본으로 지원하고 파이썬과 스칼라와 SQL을 지원
      • 인터프리터는 플러그인 구조로 만들어져 있기에 다른 모듈과의 연동 쉬움
      • 그 외에는 비슷하다(시각화 지원, 노트북 공유 용이)

Spark 실습: Spark을 사용해보자

  • 실습 진행
    • 구글 코랩 사용
      • PySpark와 Py4J를 설치하여 Standalone Spark을 사용
    • RDD 소개
      • 파이썬 데이터를 RDD로 변환
    • 데이터 프레임 소개