728x90

병렬 분산 알고리즘 구현이 가능한 맵리듀스 프레임워크에 대해서 이야기하기 전에
왜❓ 병렬 분산 알고리즘을 사용해야 하는지 먼저 이야기 하겠습니다.


💡 병렬 분산 알고리즘을 사용하는 이유

  • Scale-out: 많은 수의 값싼 서버 이용
  • Scale-up: 적은 수의 값비싼 서버 이용

데이터 중심(data-intensive) 어플리케이션 분야에서는 Scale-out을 선호합니다.
왜냐하면 가격과 성능의 관계가 선형적으로 증가하지 않기 때문입니다.
예를 들면, 두배 성능의 프로세서 하나를 가진 컴퓨터의 가격이 일반적인 컴퓨터 가격의 두배보다 훨씬 비쌉니다.
그래서 수 십에서 수 천대의 컴퓨터를 묶어서 처리하기 위해 병렬 분산 알고리즘이 필요합니다.
그럼 병렬 분산 알고리즘 구현이 가능한 맵리듀스 프레임워크에 대해 이야기 하겠습니다.


🤔 Why MapReduce...?

데이터 중심 프로세싱(Data-intensive processing)에서는 한대의 컴퓨터로 처리하는데는 한계가 있습니다.
여러 컴퓨터를 묶어서 처리를 해야하는데 그 역할을 하는 것이 바로 맵리듀스(MapReduce)입니다

맵리듀스는 빅데이터를 활용하여 효율적인 계산이 가능한 첫 번째 프로그래밍 모델입니다.
Scalable(사용자 수, 데이터가 급증해도 프로그램 성능이 크게 떨어지는 일이 없는) 병렬 소프트웨어의 구현을 쉽게 할 수있도록 도와주는 프로그래밍 모델입니다.


✔️ MapReduce Programming Model

구글에서 맵리듀스 프레임워크를 만들었고 외부에서 사용할 때는 오픈소스인 하둡(Hadoop)을 이용하여 맵리듀스 프레임워크를 구현하여 사용합니다.

함수형 프로그래밍(Functional programming) 언어의 형태로 사용자는 3가지 함수(main, map, reduce) 를 구현해서 제공해야 합니다.

  • main 함수: 드라이브에 해당
  • map 함수: (key1, val1) -> [(key2, val2)]
    • org.apache.hadoop.mapreduce 패키지에 있는 Mapper 클래스를 상속받아 수행합니다.
  • reduce 함수: (key2, [val2] -> [(key3, val3)]
    • org.apache.hadoop.mapreduce 패키지에 있는 Reducer 클래스를 상속받아 수행합니다.

드라이브에 해당하는 main 함수는 map 함수와 reduce 함수를 차례대로 호출합니다.
map 함수와 reduce 함수 key와 value가 쌍으로 구성된 형태로 입력을 받고 출력을 합니다.
[]로 표시된 것은 list로 여러개 받을 수 있다는 것을 의미합니다.
Reduce 함수의 [val2]은 list 형태이고, map 함수와 reduce 함수의 출력은 하나도 없을 수도 있고 1개일 수도 있고 여러개 일 수도 있습니다.

이 세가지 함수에 추가로 combine 함수가 있습니다.

  • Combine 함수: reduce 함수와 유사
    • 각 머신에서 map phase에서 map 함수의 출력 크기를 줄여서 shuffling phase와 reduce phase의 비용을 줄여주는데 사용됩니다.

한번의 맵리듀스 페이즈는 map 함수를 먼저 호출하고 그 다음 reduce 함수가 호출됩니다.
필요하면 맵 함수가 끝난 후, combine 함수를 중간에 수행 할 수도 있습니다.

그럼 이 맵리듀스 프레임워크가 어떻게 동작하는지 더 자세하게 한번 알아보도록 하겠습니다.


🔍 MapReduce Framework

맵리듀스 프레임워크는 앞서 설명한데로 각각의 레코드(또는 튜플)이 (key, value)쌍으로 표현됩니다.
main 함수는 한개의 마스터 머신(master machine)에서 수행됩니다.
마스터 머신map 함수 수행 전 전처리를 하거나 reduce함수 결과를 후처리 하는데 사용될 수 있습니다.

맵리듀스는 3 단계로 아래 그림과 같이
map phase => shuffling phase => reduce phase 순서로 호출되어 수행됩니다.

Map Phase 3단계

MapReduce Phase

  • Map phase
    • 제일 먼저 수행되며 여러 파티션에 병렬 분산으로 호출되어 수행됩니다.
    • 그러면 각 머신에서 수행되는 mapper를 통해 입력 데이터 한 줄씩 map 함수가 호출됩니다.
    • map 함수는 (key, value)쌍 형태로 여러 머신에 나누어 보내지고 같은 key를 갖으면 같은 머신으로 보내집니다.
  • Shuffling phase
    • 모든 머신에서 map phase가 다 끝나면 시작됩니다.
    • map phase에서 각각의 머신으로 보내진 (key, value)쌍이 key를 기준으로 정렬됩니다.
    • 같은 key를 가진 (key, value)쌍을 모아서 value-list를 만듭니다. 그후 (key, value-list)쌍을 key에 따라 여러 머신에 분산해서 보냅니다.
  • Reduce phase
    • 모든 머신에서 shuffling phase가 다 끝나면 시작됩니다.
    • 각각의 머신에서는 shuffling phase에서 보낸 (key, value-list)쌍 마다 reduce 함수가 호출됩니다.
    • 하나의 reduce 함수가 끝나면 다음 (key, value-list)쌍에 호출됩니다.
    • (key, value)쌍 형태로 출력할 수 있습니다.

🐘 Hadoop

하둡은 Apache 프로젝트에서 만든 MapReduce 프레임워크 오픈 소스입니다.
여기에는 하둡 분산 파일 시스템(Hadoop Distributed File System - HDFS) 이라는 게 있습니다.

빅데이터 파일을 여러대의 컴퓨터에 나누어 저장을 합니다. 이 각 파일은 여러 개의 순차적인 블록으로 저장이 됩니다.
그리고 그 하나의 파일의 각각의 블록폴트 톨러런스(fault tolerance)를 위해서 여러개로 복사되어 여러 머신에 저장됩니다.

폴트 톨러런스는 시스템을 구성하는 부품의 일부에서 결함 또는 고장이 발생하여도 정상적으로 혹은 부분적으로 기능을 수행할 수 있게 하는 것을 말합니다. 그래서 하나의 파일 조각에 문제가 생겨도 다른 머신에 저장된 조각을 가져다 사용 할 수 있습니다.

🛠 구성 요소로 소프트웨어의 수행을 분산하기 위한 MapReduce 와 데이터 분산을 위한 HDFS 이 있습니다.
🛠 한 개의 Namenode(master)와 여러대의 Datanode(slaves)로 이루어져 있습니다.


🧐 이 글은 공부한 내용을 정리하고 공유하기 위해 작성한 글입니다!
🛠 수정해야 하는 내용이 있다면 알려주세요! 감사합니다 🙇‍♀️
728x90

'Hadoop > 이론' 카테고리의 다른 글

Matrix Addition  (0) 2021.09.16
Inverted Index  (0) 2021.09.15
Partitioner Class  (0) 2021.09.15

+ Recent posts