FUNDAMENTAL 26. 빅데이터 생태계
1. 빅데이터 연대기
- 2002년 : 더그 커팅(Doug Cutting)과 마이크 카파렐라(Mike Cafarellr)가 웹 크롤러 너치(Nutch) 개발
- 2003년 : 구글에서 분산 처리용 파일 시스템인 GFS(Google File System) 논문 발표
- 2004년 : 구글에서 분산 처리용 프로그래밍 모델인 맵리듀스(MapReduce) 논문 발표
- 2005년 : 더그 커팅, 마이크 카파렐라의 주도 하에 NDFS(Nutch Distributed File System) 프로젝트 시작
- 2006년 : 더그 커팅 야후에 합류, 야후에서 최소의 하둡 기반 클러스터 구축, 구글에서 빅테이블(BigTable) 논문 공개 이는 향후 아파치 하둡의 HBase의 근간이 됨
- 2007년 : 아파치 하둡 1.0 발표
- 2008년 : 하둡의 하위 프로젝트 SQL관련 컴퓨넌트인 하이브(Hive) 개발, 클라우데라(Cloudera) 창업
- 2009년 : UC 버클리대학의 마태 자하리아(Matei Zaharia)가 스파크(Spark) 연구 시작
- 2012년 : 하둡의 컴포넌트인 얀(YARN) 개발, 최초의 하둡용 네이티브 MPP 분석용 컴포넌트 임팔라(Impala) 개발
- 2014년 : 아파치 스파크 1.0 출시, 마태 자하리아 / 알리 고디시등이 데이터브릭스(databrics) 창업
2. Hadoop Ecosystem
- 2003년부터 빅데이터 처리를 위한 새로운 시스템이 생겨났고 가장 기본이 되는 기술은 하둡과 스파크이다.
- 이 중 먼저 하둡에 대해 살펴보겠다. 하둡 에코시스템의 주요 컴포넌트들의 역할은 아래와 같다.
1) 데이터 수집(Data Ingestion)
(1) 스쿱(Sqoop) : RDBMS(오라클, MySQL등)와 하둡 사이의 데이터를 이동시켜준다.
(2) 플럼(Flume) : 분산환경에서 대량의 로그데이터를 효과적으로 수집하여 합친 후 다른 곳으로 전송한다.
2) 데이터 처리(Data Processing)
(1) 하둡 분산파일시스템(HDFS) : 하둡의 분산 처리 파일 시스템
(2) 맵리듀스(MapReduce) : Java기반의 맵리듀스 프로그래밍 모델이다.
(3) 얀(Yarn) : 하둡 클러스터의 자원(Resource)을 관리한다.
(4) 스파크(Spark) : In-memory 기반의 클러스터 컴퓨팅 데이터 처리이다. 스파크 안에도 스파크 코어, 스파크SQ, Milib, GraphX와 같은 컴포넌트가 있다.
3) 데이터 분석(Data Analysis)
(1) 피그(Pig) : 맵리듀스로 실행하기 어려운 데이터 관련 작업, filter, join, query와 같은 작업을 실행한다.
(2) 임팔라(Impala) : 고성능의 SQL 엔진이다.
(3) 하이브(Hive) : 임팔라와 유사한 SQL 관련 기능을 제공한다.
4) 데이터 검색(Data Exploration)
(1) 클라우데라 서치(Cloudera Search) : real-time으로 데이터에 검색이 가능하다.
(2) 휴(Hue) : 웹 인터페이스 제공
5) 기타
(1) 우지(Oozie) : 워크플로우 관리, Job 스케쥴러
(2) HBase : NoSQL기반으로 HDFS에 의해 처리된 데이터를 저장한다.
(3) 제플린(Zeppelin) : 데이터 시각화
(4) SparkMLlib, 머하웃(mahout) : 머신러닝 관련 라이브러리
3. Spark Ecosystem
- 이번에는 스파크에 대해 알아본다.
- 하둡 에코시스템에서 스파크는 In-memory기반의 클러스터 컴퓨팅 데이터 처리 프로그램이라 했다.
- 그렇다면 스파크와 하둡 에코시스템과 독립적인 생태계를 이루는 것이 아니라, 하둡 기반의 빅데이터 생태계를 이루는 주요한 컴포넌트로 어울려 존재하고 있다는 것을 알 수 있다.
- 그러나 스파크 안에는 여러 라이브러리가 있다고 했는데, 스파크 관점에서 생태계를 봐보자.
1) 프로그래밍 언어
(1) Scala, Java, Python, R, SQL이 있다.
2) 스파크 라이브러리
(1) Spark SQL : SQL 관련 작업
(2) Streaming : Streaming 데이터 처리
(3) MLlib : Machine Learning 관련 라이브러리
(4) GraphX : Graph Processing
- 자원관리(주로 클러스터 관리)는 하둡의 Yarn 또는 Mesos를 사용하거나, 스파크 자체 관리기능을 그대로 사용한다.
4. Spark 데이터 처리 : RDD
- 오늘 실습할 것은 PySpark이다. 이를 사용하기 전에 Spark 동작 원리에 대해 간단히 살펴볼 것이다. 그래서 RDD와 Spark에 대한 논문을 일부 봤다.
- 스파크는 RDD(Resilient Distributed Dataset)를 구현하기 위한 프로그램이다.
- RDD를 스파크라는 프로그램을 통해 실행시킴으로써 메모리기반의 대량의 데이터 연산이 가능하게 되었고, 이는 하둡보다 100배 빠른 연산을 가능하게 했다.
- RDD 등장 배경
1) 하둡은 파일을 디스크에 저장한 뒤 그걸 불러와 연산(주로 맵리듀스 연산)하고 다시 디스크에 저장하면서 파일 처리 작업을 수행한다. 때문에 I/O 바운드가 하둡의 주요 병목현상이였다.
2) 이것을 해결하기 위해 스파크는 하드디스크에 파일을 읽어온 뒤 연산 단계에는 데이터를 메모리에 저장하는 방식인데 속도가 매우 빨라졌다.
3) 하지만 메모리는 비휘발성이라 뭔가 메모리에 적재하기 좋은 새로운 형태의 추상화 작업이 필요했다. 그래서 고안된 것이 RDD(탄력적 분산 데이터셋)이다.
4) 정리하자면, RDD는 스파크에서 사용하는 기본 추상개념으로 클러스터의 머신(노드)의 여러 메모리에 분산하여 저장할 수 있는 데이터 집합니다.
- RDD의 특징
1) In-Memory
2) Fault Tolerance
3) Immutable(Only Read)
4) Patition
5. RDD의 생성과 동작
- RDD를 만드는 방법에는 두 가지가 있다.
1) 내부에서 만들어진 데이터 집합을 병렬화하는 방법 : parallelize 함수 사용
2) 외부의 파일을 로드하는 방법 : .textFile 함수 사용
- RDD 동작(Operation)은 크게 두 가지 있다.
1) Transformations
2) Actions
- RDD는 불변하다고 했다. 따라서 연산 수행에 있어 기존의 방식과는 다르게 수행된다.
1) Transformations은 RDD에게 변형 방법(연산 로직, 계보, Lineage)을 알려주고 새로운 RDD를 만든다. Actions을 통해 행해진다.
2) Transformations를 통해 새로운 RDD를 actions은 결과값을 보여주고 저장하는 역할을 한다
- RDD를 생성하는 작업은 실제로 RDD의 lineage(계보)를 만드는데 지나지 않는다. 실제 객체는 생성되지 않는다.
- 결과값이 필요할 때까지 계산을 늦추다가 정말 필요한 시기에 계산을 수행하는 방법을 느긋한 계산법(Lazy evaluation)이라 한다.
6. PySpark 설치하기
- 여기서는 터미널을 이용해 PySpark를 설치하는 과정을 진행했다.
7. SparkContext를 통한 스파크 초기화
- 분산환경에서 운영되는 스파크는 driver 프로그램을 구동시킬 때 SparkContext라는 특수 객체를 만든다.
- 이 객체를 통해 스파크의 모든 기능에 접근한다. 또한 스파크 프로그램당 한 번만 실행할 수 있고, 사용 후에는 종료해야 한다.
- 따라서 SparkContext를 다른 말로 스파크의 엔트리 포인트(entry point)라고도 하고, SparkContext를 생성하는 것을 스파크를 초기화한다 라고 한다.
- PySpark에서는 SparkContext() 로 생성한다.
8. RDD Creation : 아래의 내용을 코드로 실습했다.
- parallelize함수를 이용해서 내부의 데이터 집합을 RDD로 만들기
- take() 사용하기
- .textFile 함수를 이용해서 외부 파일을 로드하여 RDD 만들기
9. Transformations
- 이어서 RDD 동작에 대해 연습했다.
- map(), filter(), flatmap()을 사용해봤다.
1) map : x의 모든 원소에 대해 map함수를 적용한 결과는 y값이 된다. 따라서 x와 y의 원소 개수는 같다.
2) filter : 어떤 조건을 만족하는 값만을 반환한다. 따라서 조건문이 들어가야 하며, x와 y의 원소의 개수는 같지 않을 수 있다.
3) flatmap : RDD의 원소에 map연산을 수행하고 원소의 개수를 증사기키기도 한다. 원소의 개수는 꼭 동일하게 증가시키지 않아도 된다.
10. Actions
- collect(), take(), count(), reduce(), saveAsTextFile()를 사용해봤다.
1) collect : RDD 내의 모든 값을 리턴한다. 데이터가 많다면 함부로 호출하지 않는게 좋다
2) take : RDD에서 앞쪽 n개의 데이터의 list를 리턴한다. collect보다 안전하게 데이터를 확인할 수 있다.
3) count : RDD에 포함된 데이터 개수를 리턴한다.
4) reduce : MapReduce의 그 reduce이다
5) saveAsTextFile : RDD 데이터를 파일로 저장한다.
11. 실습 : MapReduce
- 타이타닉 데이터를 이용하여 실습을 코드로 해보았다.