Distributed File System/Hadoop

Hadoop) Map-Reduce 개념과 예시 & YARN에 기반한 처리엔진 Spark

DevPing9_ 2021. 1. 17. 18:22

# Map-Reduce

 YARN이 클러스터 전체에 계산을 분산하고 보관된 데이터를 확장가능하게 처리하는 방법을 제공해줬다면, Map-Reduce는  YARN 이 제공한 환경에서 하둡이 맨 처음에 지원한 데이터를 처리하는 모델이다.  (그러나 Map-Reduce는 구글꺼다...)

 

 Map-Reduce의 병렬처리모델은 3단계로 나누어지며, 그 3 단계는 map, shuffle, reduce 이다.

 

# Map, Shuffle, Reduce

 1. Map

  - 입력데이터가 클러스터에서 병렬로 처리되며, 이를 수행하는 mapper 함수는 원시데이터를 {key, value} 쌍으로 변환한다.

 

 2. Shuffle

  - mapper를 거쳐 변환된 데이터는 키를 기준으로 정렬되어 버킷(bucket)으로 셔플링된다.

    (키가 같은값들은 모두 동일한 reducer로 전달된다)

 

 3. Reduce 

  - Reducer는 모든 키의 값을 처리하며 결과를 HDFS나 다른 영구저장소에 저장한다.

 

 Map, Shuffle, Reduce 세 단계는 각각 무상태(stateless)이거나 극히 제한적인 상태만 유지한다.

 

 예를 들면, 매퍼나 리듀서는 현재 입력받은 데이터를 이전 데이터들과 무관하게 처리하는데, 이는 각 단계의 매퍼 또는 리듀서가 어느 노드에서 실행될지 알 수 없기 때문이다.

 

 단, 리듀스 단계에서는 키 값이 같은 모든 데이터를 참조한다. 이와 같은 연산방식은 엉성해보일수도있지만, 문제가 없다고 한다.

 


# Map-Reduce의 대표적 예시

(Corpus에 포함된 단어의 빈도를 세는 word-count)

 

1. HDFS에 Text 데이터 저장

2. 하둡은 자동으로 데이터를 블록단위(64MB)로 쪼갠뒤, HDFS 서버로 분산해 중복저장

3. 여러개로 분산된 mapper가 각 블록을 병렬로 읽어들여 Text의 단어들을 {Key, Value} 쌍으로 분리

   ex_)  This day is nice day.       =>     {This, 1}, {day, 1}, {is, 1}, {nice, 1}, {day, 1}

4. 동일 키를 모아 shuffling후 Reducer에 전달 

   (Reducer의 입력 데이터는 {This, 1}, {day, 1}, {is, 1}, {nice, 1}, {day, 1} 가 key값 끼리 정렬된 형태)

5. Reducer가 할일은 word-count 이므로, 같은 key를 가진 모든 값을 단순히 덧셈연산

   ex_) Output : {This, 1}, {day, 2}, {is, 1}, {nice, 1}

 

 * 여러 Reducer가 사용될 경우, mapper의 출력데이터들은 키 값으로 묶여 특정 Reducer로 전달된다.

 - word-count 예제에서 reducer가 4개 사용되었다 가정하면, this, day, is, nice 총 4개의 키를 가지고,

   reducer1은 this 1개를 , reducer2는 day 2개를, reducer3은 is 1개를 reducer4는 nice 2개를 전달받아 각자 총 몇개인지 카운팅한다.

 

 * 더 편리한 방법은 전달하기 전에 각 단어의 갯수를 미리세서 전달하는 것인데, 이를 combiner라 한다.

  (combiner 또한 하둡이 지원하는 데이터처리 모델이다)

 

 * 모든 문제가 Map-Reduce로 변환되지 않는다. Map-Reduce로 변환할 수 있다해도, 변환이 복잡하거나 효율성이 떨어질 수 있다.

  - 특히 반복이 많은작업에 적합하지 않다. 따라서 반복적인 수렴과정(converge)이 필요한 과학실험이나 머신러닝 알고리즘, 그래프연산에는 적합하지 않다.

 

 * 선형대수의 power method(멱방법) 이나 머신러닝에서 활용되는 gradient decent(경사하강법)은 대표적인 반복적인 알고리즘이다.

 


# YARN에 기반한 다양한 처리엔진

 

1. 아파치 테즈(Tez)

 - 하나의 맵리듀스 단계를 넘어 여러 리듀스 단계로 확장될때, 리듀스작업간에 교환되는 데이터를 정렬할 필요가없는 경우에 특화

 - Tez의 목표는 기본 하둡 SQL 엔진인 HIVE의 데이터 조인쿼리를 더 효율적으로 실행 & 데이터 흐름을 효율적으로 구현

 - 한 작업의 리듀서가 중간 데이터를 HDFS에 저장하지 않고 직접 다른 리듀서로 전송 할 수 있음

 

2. 아파치 스파크(Spark)

 - 데이터 과학에서 자주 등장하는 반복연산에 더 적합한 개념과 기능을 제공하는 in-memory 데이터 처리 엔진

 - 기본적인 분산처리 기능뿐만 아니라, 여러 컴포넌트가 추가되며 가장 인기 있는 아파치 프로젝트로 성장

 

 * Spark가 빠른 이유 

  - 데이터를 분산 메모리로 캐싱하여 빠른 연산과 저지연 응답속도를 달성

  - 또한 메모리에 올려 둔 데이터셋을 반복적으로 사용할 수 있어 머신러닝에서도 빠른 응답속도 달성

 

 

 

 

728x90