본문 바로가기
스터디/데이터사이언스

[CS246] Spark: Extends MapReduce

by 궁금한 준이 2023. 9. 9.
728x90
반응형

Recap: MapReduce

크기가 매우 크고 (내용) 업데이트가 거의 없는 파일에 대하여 MapReduce는 효과적이다.

user는 Map과 Reduce 함수만 작성하고, 시스템은 자동으로 Map/Reduce Worker에 할당하여 처리한다.

Map의 결과로 중간 파일(intermediate files)에 저장하고 이는 local file system에 존재한다. 이런 중간파일을 사용하면 main memory를 거의 사용하지 않는다는 장점이 있지만 disk overhead가 존재한다는 단점이 있다.

 

Node Failure도 다음과 같은 경우에 해결할 수 있다.

  • Master fail: 전체 MapReduce를 다시 시작
  • Map worker fail: 해당 worker에 할당된 모든 map task를 다시 시작(redone)
  • Reduce worker fail: in-progress task만 idle로 리셋하고 Reduce task 재시작(restart)

Problems with MapReduce

Sequence of MapReduce (Standord CS246)

MapReduce도 만능이 아니다.

데이터 복사, disk I/O, serialization 등으로 MapReduce는 오버헤드가 발생한다.

특히 disk I/O 때문에 속도가 느리다는 문제가 있다. 

게다가 대부분의 복잡한 연산의 경우 MapReduce로 쉽게 해결되지 않는다. (map, reduce 함수를 작성하기가 매우 어렵다)

 

Data-Flow System

MapReduce는 2단계로 이루어진다. Map이 먼저 수행되고 Reduce가 나중에 수행된다.

Data-Flow System은 이러한 MapReduce를 확장한 것이다.

보다 더 다양한 task/rank를

보다 더 다양한 함수 제공 (Map, Reduce 말고도)

data flow는 한 방향으로만 제공되고 이를 통해 block/recovery 모두 가능하다.

An example of work flow system (MMDS textbook)

반응형

Spark: Most popular Data-Flow Systems

RDD: Resilient Distributed Dataset

RDD는 spark에서 가장 핵심이 되는 data abstraction이다. (왜 resilient인지는 후술할 lineage에서 확인 가능)

  • Partitioned collection of records (MapReduce에서 key-value의 확장된 type)
  • Cluster에 흩어져 있으며 read-only 이다
  • main memory에 캐시되어 빠른 속도와 적은 오버헤드 달성 (disk I/O가 아니다)
  • RDD는 Hadoop이나 다른 RDD의 transforming으로부터 생성된다
  • RDD는 모든 원소들이 같은 연산이 적용될 때 가장 적합한 자료구조이다.

RDD (Stanford CS246)

Spark RDD Operations

Spark에서는 RDD에 2개의 연산을 제공한다. Transformation과 Action이다.

  • Transformation
    • 다른 RDD로부터 연산(deterministic operation)을 통해 새로운 RDD를 생성한다.
    • 이때 map, filter, join, , union, intersection, distinct와 같은 연산을 포함된다.
    • Lazy evaluation: action이 호출될 때까지 어떠한 것도 연산(compute)하지 않는다.
  • Action
    • 값을 얻거다 데이터를 추출(export)할 때 사용된다
    • count, collect, reduce, save, get 등이 포함된다
    • RDD에 적용가능하며 계산과 반환값을 강제한다. 

Example: count words in a document

어떤 문서(document)에서 불용어(stop words)를 제외한 단어들의 개수를 세보자.

문서파일의 크기가 너무 커서 chunk별로 RDD를 생성하자. 이를 R0라 하자.

Flatmap을 이용하여 R0로부터 R1을 생성하자. R1은 (w, 1) 순서쌍을 담고있다.

Filter를 이용하여 R1에 있는 불용어를 걸러내어 R2를 생성한다.

 

Lazy evaluation

그러나 실제 Spark에서 R2에 action이 적용되지 않는한 flatmap이나 Filter는 수행되지 않는다.

R2에 대하여 파일 시스템에 저장하는 action이 적용되면 그때서야 R0로부터 Flatmap, Filter 같은 transformation이 수행되다. 프로그래머가 유지하라고 명시하지 않는 한, R1과 R2는 RDD가 생성될 때에만 compute node에 존재하고 사용 즉시 사라진다(dropped)

 

Resilience of RDDs (lineage)

R1이 생성된 후에 compute node가 fail하면 어떻게 데이터를 복구할까? R1은 사용 즉시 메모리에서 사라지는데 영영 잃어버리는 것일까? lineage는 Spark에서 RDD(또는 RDD split)를 재생성하는 방법을 알려준다.

 

R2가 손실되면, R1으로부터 RDD를 재생성한다. 

만일 R1이 명시적으로 저장되지 않아 compute node에서 drop되었다면, R0로부터 R1, R2를 순차적으로 재생성한다.

만일 R0마저 손실되었다면, 원래 파일시스템으로부터 재생성한다.

 

Spark vs Hadoop MapReduce

Spark는 memory에서, MapReduce는 disk에서 수행한다는 점에서 이 둘의 특징이 나타난다.

 

(속도) 일반적으로 Spark가 빠르지만, 성능 보장을 위해서 메모리를 많이 차지한다. 이때문에 리소스를 요구하는 다른 프로그램들이 같이 실행중이면 spark의 성능은 떨어진다. 이에 비해 MapReduce는 다른 서비스들이 실행중이어도 성능이 크게 떨어지지 않는다.

 

(Data Processing) MapReduce는 Batch processing이지만, Spark는 Batch/real-time/iterative/interavtive/graph 모두 지원한다.

 

(Caching) MapReduce는 캐싱을 사용하지 않는다. Spark는 메모리에 데이터를 캐싱하여 성능을 향상시킬 수 있다.

 

  • Hadoop / MapReduce is better
    • linear processing
    • 중간 결과가 필요하지 않을 때 (한번의 연산만 필요 등)
  • Spark is better
    • fast, interactive processing
    • join
    • graph processing
    • iterative jobs
    • real-time processing
    • machine learning

 

728x90
반응형