[Big Data]Spark
Big Data: Spark 소개
- Contents
- 빅데이터 정의와 예
- 하둡의 등장과 소개
- Spark 소개
- 판다스와 비교
- Spark 데이터프레임, 데이터셋, RDD
- Spark 개발 환경
- 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 이라고 부름: 시스템의 용량을 높이기 위해서 메모리, 디스크를 더 붙이는 것이 아니라 서버를 더 붙이는 접근방식
- 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위에서 애플리케이션 레이어로 실행됨
- 손쉬운 개발을 위한 로컬 모드도 지원: 이번 강좌에서는 로컬 모드 사용
- 손쉬운 개발을 위한 로컬 모드도 지원: 이번 강좌에서는 로컬 모드 사용
HDFS - 분산 파일 시스템
- 밑단에서 발생하는 일을 신경쓰지 않고 큰 데이터들을 저장하고 읽을 수 있게 해준다. 빅데이터 시스템에서는 HDFS가 가장 기본이 된다.
- 데이터를 블록단위로 저장
- 블록의 크기는 128MB(디폴트)
- 블록 복제 방식(Replication)
- 내임노드(CPU, Memeory)
- 데이터 노드(CPU, Memeory)
- 데이터 노드(CPU, Memeory)
- 데이터 노드(CPU, Memeory)
- 위와 같은 구조
- 서버에 저장할때 블록 방식으로 저장됨
- 각 블록은 3군데에 중복 저장됨
- Fault tolerance를 보장할 수 있는 방식으로 이 블록들은 저장됨
- 내임노드(CPU, Memeory)
분산 컴퓨팅 시스템
- 하둡 1.0:
- 잡 트래커(CPU, Memeory) - master
- 태스크 트래커(CPU, Memeory) - slave
- 태스크 트래커(CPU, Memeory) - slave
- 태스크 트래커(CPU, Memeory) - slave
- 위와 같은 구조
- 분산 컴퓨팅 시스템이 곧 맵리듀스. 맵리듀스만 돌림
- 하나의 잡 트래커와 다수의 태스크 트래커로 구성됨
- 잡 트래커가 일을 나눠서 다수의 태스크 트래커에게 분배
- 잡 트래커(CPU, Memeory) - master
- 하둡 2.0:
- 하둡 자체가 분산 환경 시스템이라기보다는 분산 컴퓨팅 시스템을 만들 수 있는 프레임웤을 제공. 맵리듀스라는 분산 컴퓨팅 시스템을 만들기 보다는 사용자의 아이디어를 이 위에서 원하는 분산 컴퓨팅 시스템을 쉽게 만들 수 있도록 기본 기능들을 제공.
- 클라이언트, 리소스 매니저, 노드 매니저, 컨테이너로 역할을 세분화
- Spark 지원이 2.0부터 시작
하둡(Hadoop)을 이용한 데이터 시스템 구성
- 데이터를 수집하는 레이어에서 데이터를 수집하여 HDFS로 보내고 데이터 저장이 끝나면 맵리듀스하여 프로세싱 한 결과를 다시 HDFS에 저장하기도 하고, 외부에서 바로 엑세스가 가능해야하면 관계형 DB, NoSQL, 검색엔진 등에 처리 결과를 Push한다.
- 데이터 수집
- 데이터 저장 및 처리(HDFS, MapReduce)
- 처리 결과 엑세스 레이어(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로 작성됨
- 하둡 2.0을 분산환경으로 사용 가능
- MapReduce의 단점을 대폭적으로 개선
- Pandas와 굉장히 흡사(서버 한대 버전 vs. 다수 서버 분산환경 버전)
- 현재 Spark 버전3이며 이번 강좌에서는 이를 사용
- 현재 Scala, Java, Python 3으로 프로그래밍이 가능
- 머신 러닝 관련해서 많은 개선이 있었음(GPU 지원 포함)
Spark vs. MapReduce
- Spark은 기본적으로 메모리 기반
- 메모리가 부족해지면 디스크 사용
- MapReduce는 디스크 기반(디스크에서 데이터 읽어옴)
- MapReduce는 하둡 위에서만 동작
- Spark은 하둡(YARN)이외에도 다른 분산 컴퓨팅 환경 지원
- MapReduce는 키와 밸류 기반 프로그래밍
- Spark은 판다스와 개념적으로 흡사
- Spark은 다양한 방식의 컴퓨팅을 지원
- 배치 프로그래밍, 스트리밍 프로그래밍, SQL, 머신러닝, 그래프 분석
- 배치 프로그래밍, 스트리밍 프로그래밍, SQL, 머신러닝, 그래프 분석
Spark의 구조
- 드라이버 프로그램의 존재
- Spark은 하둡 2.0(혹은 하둡 3.0)위에 올라가는 애플리케이션
- 우리가 하는 일은 driver 프로그램을 짜는 것이다.
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 모듈
- 이 강좌에서는 Python을 사용할 예정: PySpark 모듈
판다스와 비교: Spark와 비교하면 무엇이 다를까?
판다스
- 파이썬으로 데이터 분석을 하는데 가장 기본이 되는 모듈 중의 하나
- 엑셀에서 하는 일을 파이썬에서 가능하게 해주는 모듈이라고 생각하면 됨
- matplotlib(시각화)나 scikit-learn(머신러닝)과 같은 다른 파이썬 모듈과 같이 사용됨
- 소규모의 구조화된 데이터(테이블 형태의 데이터)를 다루는데 최적
- 한 대의 서버에서 다룰 수 있는 데이터로 크기가 제약이 됨
- 병렬 처리를 지원하지 않음
- 큰 데이터의 경우 Spark을 사용
- 작은 데이터를 다루는데 굳이 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을 사용하는 것이 더 일반적
- SparkSQL을 사용하는 것이 더 일반적
- RDD(Resilient Distributed Dataset)
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'),
]
- 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로 변환
- 데이터 프레임 소개
- 구글 코랩 사용