Hadoop
많이 들어보았고 이제는 익숙해진 사람도 많을 것 같습니다.
그래도 이 생태계라 불리는 것들 안에 어떤 component가 속해있는지, 각자 어떤 역할을 하는지 정리해보고자 합니다.
이를 위해서는 우선 하둡이 무엇인지 부터 알아야합니다.
Hadoop
Big data시대가 도래하면서 하나의 서버를 scale up 하여 사용하는 것은 불가능하거나 비효율적이게 되었습니다. 이에 scale out, 즉 여러 commodity computer를 cluster하여 사용하는 것이 일반적이게 됩니다.
그러면 이러한 cluster에서 data를 분산해서 저장해주고, 이들을 처리하는 함수가 필요합니다. 이를 가능하게끔 만든 것이 바로 hadoop 입니다. data를 분산해서 저장해주는건 HDFS, 이를 처리하는 건 MapReduce라고 보면 됩니다.
Hadoop 은 오픈소스로 이루어진 프레임워크입니다.
기본적으로
- Hadoop Common
- Hadoop Distributed File System (HDFS)
- Hadoop YARN
- Hadoop Map Reduce
으로 틀이 잡혀있다고 보면 됩니다.
Hadoop Common
공식 홈페이지를 보면 Common 탭이 따로 존재합니다.
이들은 다른 hadoop module들을 서포트하는 common utilities와 libraries로 이루어져있습니다. 결국 이 패키지는 하둡 프레임워크를 제공하기 위한 핵심적이고 기초적인 jar파일과 scripts들이 있습니다.
HDFS
하둡 분산 파일 시스템으로 기존의 file system과 어떤 점이 다른지 궁금할 수 있습니다. 하둡은 기본적으로 3개의 복제본을 저장합니다. 이는 하둡이 Highly fault-tolerant 할 수 있는 방법있게끔 합니다. 또한 역시 분산저장하는 파일 시스템이기에 low-cost hardware로 디자인할 수 있습니다.
데이터를 64/128 MB로 쪼개어 기본 3개의 복제본까지 저장합니다.
Name Node와 Data Nodes로 이루어져 있는데요, 전자는 cluster의 정보를 가지고 있고 후자는 실질적으로 data를 저장하고 있습니다. High Avalibality를 위해 두개의 비활성화된 네임노드를 하나 더 생성하기도 합니다.
YARN
Yet Another Resource Negotiator로 자원 관리 및 스케줄링에 대한 책임을 담당하고 있습니다.
가장 먼저 ResourceManager와 NodeManager로 나뉩니다. 전자는 시스템의 모든 응용 프로그램의 리소스를 중재하는 최종 권한을 가지고 있습니다. NodeManager는 리소스 사용량(cpu, 메모리, 디스크, 네트워크)을 모니터링하고 이를 ResoureceManger에 보고합니다. per-machine 이고 하나의 컨테이너를 담당합니다.
YARN은 하나의 중요 아이디어가 더 포함되는데 per-application으로 존재하는 ApplicationMaster입니다. 사실상 프레임워크별 라이브러리로, ResourceManager에서 리소스를 협상하고 NodeManager와 함께 작업 실행 및 모니터링을 합니다.
ResouceManager(RM)은 스케쥴러와 ApplicationMaster(AM)로 구성됩니다.
스케쥴러는 프로그램에 리소스를 할당하는 역할을 합니다. 모니터링하거나 추적하진 않고 순수하게 스케쥴링만 진행합니다. fail에 대한 처리도 보장되지 않습니다.
AM은 작업을 수락하고 application별로 첫번째 컨테이너를 만들고 협상한 뒤 실패하면 또 다른 컨테이너를 시작합니다. 그래서 적절한 리소스를 협상하여 생성한 컨테이너와 이를 추적하고 모니터링 해야하는 역할이 있습니다.
MapReduce
HDFS는 분산 저장을 하기 위한 것 이었다면 MapReduce는 분산 저장된 데이터를 가지고 computation을 하는 방법입니다.
데이터를 가져와서 연산을 하는 것이 아니라 연산/코드를 데이터가 있는 곳으로 옮겨서 계산한다는 아이디어에서 출발합니다.
즉 code를 node로 보내서 해당 data를 이용해서 처리한 후 결과값만 받는 형태입니다.
wordcount가 mapreduce의 과정을 완벽하게 표현할 수 있는 예시라 자주 쓰이고 있습니다.
우선 전체적으로 key, value 형태로 존재하는걸 확인할 수 있습니다.
map은 input과 output 모두 key-value형태인데요,
단어가 들어오면 단어별로 카운팅해주는 그림을 도식화하였습니다. 이 과정이 바로 map 입니다. 입력에 있는 key는 사실 의미없는 경우가 많다고 합니다.
이 경우에는 입력의 파일명이 key가 되고 단어들이 value가 됩니다.
출력은 이제 단어가 key가 되고 1이 value가 됩니다.
이젠 reduce step인데요, 중복되는 키 뒤에 value들을 grouping해줍니다.
reduce 에서는 이제 해당 value들을 reduce하는 일, 여기에서는 word counting이니 sum을 할 것 입니다.
결과적으로 word key와 count value가 나오는 것을 확인할 수 있습니다!
Map(k, v) -> <k', v'>*
Reduce(k', <v'>*) -> <k', v''>*
수식화하면 위와 같습니다. *은 0 or more인걸 감안하고 보시면 이해가 가실거예요.
이제 맵리듀스의 여러 특징들을 알아보려고 합니다.
- map task 가 전체 node 수에 비해 훨씬 많습니다.
- 하나의 DFS chunk 당 하나의 map이 붙기 때문입니다.
- 보통은 reduce가 map보다 적습니다.
- map의 역할이 끝날 때 까지 reduce가 실행될 수 없기 때문에 bottle neck이 발생할 수 있습니다.
이렇게 하둡에 대한 전반적인 사항을 알아보았습니다. 길이 길어져서 에코시스템은 다음 글에서 정리하려고 합니다.