Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
 Spark Logo

Apache Spark는 빅데이터 처리에 사용되는 오픈 소스 분산 처리 시스템이다. 메모리 기반으로 바르게 작동하며, 배치처리, 스트리밍 분석, 머신러닝등 다양한 영역에서 사용한다.

Spark는 RDD(Resilient distributed dataset)이라고 부르는 자료구조로 여러 노드에 분산 할 수 있는 분산 collection이다. 대량의 데이터를 처리하기 위해서 분산을 해야 할 건데, 메모리 상에서 어떻게 효율적으로 그리고 안전하게(fault tolerance) 데이터를 분산할 수 있을까를 생각하다가 튀어나온 데이터 모델이라고 보면 되겠다.

RDD를 만드는 방법은 두가지다.
  • S3, HBase, HDFS, Cassandra 등 외부 저장소에서 읽어서 만들 수 있다.
  • 프로그램내에서 만든 collection을 parallelize() 메서드를 이용해서 RDD 데이터로 만든다.

Contents

읽기전용

빅데이터를 처리하는 또 다른 방법으로 Hadoop MR(MapReduce)가 있다. 하지만 MR은 중간 파일을 HDFS에 저장하기 때문에, 파일 I/O가 빈번하게 발생하고 수행시간도 느려질 수 밖에 없다. 이 작업을 RAM에서 하면 빠르지 않을까 ?

문제는 시스템의 실패다. 램에 올린 데이터가 실패하면 어떻게 해야 할까. 이 문제를 해결 하기 위해서 RDD를 읽기 전용으로 사용하고 있다. RDD의 특징은 immutable, partitioned collections of records으로 수정 불가능한 데이터 레코드를 만든다. 그리고 레코드가 생성되는 과정을 따로 기록을 하는데(mysql의 binlog와 같은 느낌이 되겠다.) 만약 RDD가 실패하면, 이 과정을 기록해 놓은 lineage를 이용해서 RDD를 다시 만들 수 있다.

Operation

RDD는 TransformationAction 단 두개의 Operation만을 가진다. 읽기 전용이기 때문에 Update와 같은 Operation이 존재하지 않는다.

Transformation 는 하나의 RDD로 부터 새로운 RDD를 만드는 과정이다. 원본 RDD를 수정하지 않고 RDD -> New RDD의 과정을 거치는데, 예컨데 데이터를 변환하는 일련의 operation이라고 보면 된다. map, filter, flatMap, sample, reduceByKey, join, union... 등의 연산을 제공한다.

Action은 count, collect, lookup, save 등의 연산을 지원한다. 값을 변경하는 작업은 Transformation, 값을 가져오는 혹은 내보내는 작업은 Action으로 분류 할 수 있다.

Lazy-execution

직역하자면 게으른 실행 정도가 되겠다. RDD는 데이터가 여러 개의 레코드가 모인 데이터 collection으로, 데이터 처리도 collection 단위로 한다. 즉 데이터가 입력될 때 마다 처리하는게 아니고, 어느 정도 쌓이면 이걸 한번에 처리한다. 데이터가 입력되면 spark는 lineage를 만들고 action 연산을 수행 하면 비로서 쌓여있었던 transformation 연산을 한번에 실행한다. 이 처럼 action이 지연되기 때문에 Lazy-execution 이라고 한다.

Spark Streaming

Spare의 스케쥴링 기능을 활용하여 스트리밍 분석을 수행한다. 미니배치로 데이터를 수집하고, 수집된 데이터에 대해서 RDD Transformation을 실행한다. 배치분석 뿐만 아니라, 람다 아키텍처를 쉽게 구현 할 수 있다. 다만 배치작업 만큰 지연시간이 있으므로 실시간 분석에는 적당하지 않을 수 있다. 미니배치가 아닌 이벤트 기반으로 처리하고 싶다면, Storm과 Flink 스트리밍 컴포넌트 등을 이용해야 한다. Spartk Streaming는 Kafka, Flume, Twitter, ZeroMQ, Kinesis 및 TCP/IP 소켓을 지원 할 수 있다.