빅데이터

[두번째 이야기] 데이터 분산처리 시스템, Hadoop

CyberI 2017. 5. 19. 10:21

이전 작성한 글에 이어서 빅데이터 처리 시스템 중 저장 시스템과 처리방식으로 널리 사용하고 있는 Hadoop에 대해 좀더 알아보려고 합니다.

 

은 대용량 데이터를 분산 처리할 수 있는 자바 기반의 오픈소스 프레임워크로 저렴한 컴퓨터를 묶어 하나인 것처럼 사용할 수 있는 컴퓨팅 기술로 분산저장(HDFS) 기술분산처리 기술(MapReduce)이 주목을 받았습니다.

 

HDFS (Hadoop Distributed Filesystem) 

 Hadoop 네트워크에 연결된 아무 기기에나 데이터를 밀어 넣는 분산형 파일시스템으로, HDFS(Hadoop Distributed Filesystem)를 이용해 데이터를 다수의 기기들과 드라이브들에 저장하며 다수의 노드로 이뤄진 Hadoop 시스템에 자동적으로 중복되게 만듭니다. 따라서 만약 하나의 노드에서 고장이 발생하거나 느려지더라도 다른 노드를 통해 해당 데이터에 접근할 수 있습니다.

 

 

 

HDFS Architecture는 크게 파일들의 이름이나 위치, 기타 metadata를 관리하는 Namenode와 실제 데이터에 대한 처리(읽기, 쓰기)를 담당하는 Datanode로 구성됩니다.

<!--[if !supportLists]-->1)     <!--[endif]-->Namenode의 역할

<!--[if !supportLists]-->-       <!--[endif]-->파일, 디렉토리에 대한 metadata 보유

<!--[if !supportLists]-->-       <!--[endif]-->metadata의 지속상태 보완해주는 파일 백업

<!--[if !supportLists]-->-       <!--[endif]-->Datanode 모니터링(Heart bit 검사)을 통한 장애 판단

<!--[if !supportLists]-->-       <!--[endif]-->Datanode의 장애 발생 시 데이터 블록을 새로운 Datanode 또는 여유 있는 Datanode에 저장하는 블록 관리

<!--[if !supportLists]-->-       <!--[endif]-->editslog와 메모리의 fsimage를 이용한 체크포인트 작업

 

<!--[if !supportLists]-->2)     <!--[endif]-->Datanode의 역할

<!--[if !supportLists]-->-       <!--[endif]-->실 데이터인 파일의 Block 저장

<!--[if !supportLists]-->-       <!--[endif]-->파일의 Block 크기는 64/128MB (2.0부터 증가)로 고정

<!--[if !supportLists]-->-       <!--[endif]-->Namenode 3초 마다 Heart bit 신호 전송

 

<!--[if !supportLists]-->3)     <!--[endif]-->HDFS에서 파일을 읽는 과정

<!--[if !supportLists]-->-       <!--[endif]-->Client가 먼저 namenode에게 파일을 요청하면

<!--[if !supportLists]-->-       <!--[endif]-->Namenode는 파일이 있는 Datanode 위치를 Client에게 알려주고

<!--[if !supportLists]-->-       <!--[endif]-->Client Datanode와 직접 통신하면서 데이터를 전송하거나 읽을 수 있다.

 

<!--[if !supportLists]-->4)     <!--[endif]-->HDFS 특징

<!--[if !supportLists]-->-       <!--[endif]-->데이터 장애가 발생한다는 것을 가정하여 설계되어 있다. è 장애가 발생하더라도 복제본을 유지한다.

<!--[if !supportLists]-->-       <!--[endif]-->파일의 생성, 삭제, append 연산만 가능하다.

<!--[if !supportLists]-->-       <!--[endif]-->대용량의 파일을 블록단위로 분산하여 저장하기 때문에 물리적 한계가 없다.

<!--[if !supportLists]-->-       <!--[endif]-->metadata는 메모리에서 관리되므로 전체 파일 개수 등의 metadata 자원은 Namenode의 메모리의 크기에 제한을 받는다

 

 

MapReduce 

 정보 요청이 들어오면 MapReduce는 두 요소들을 이용한다. Hadoop Namenode에 있는 잡트래커(JobTracker)Hadoop 네트워크 내의 각 노드에 위치한 테스크트래커(TaskTracker)들이다. 프로세스는 상당히 선형적이며 MapReduce는 데이터 요청을 별개의 작업 셋으로 나누고, JobTracker 를 이용해 MapReduce의 일을 TaskTracker들에게 전달한다. 네트워크 지연시간을 줄이기 위해 작업은 해당 데이터가 위치한 노드와 동일한 노드에 할당되거나 최소한 같은 랙(rack)에 들어 있는 노드에 할당된다.

 

Map-Reduce 특징

<!--[if !supportLists]-->·     <!--[endif]-->고비용 고성능의 서버가 아닌 어려 대의 저렴한 컴퓨터로 연산을 수행하며, 각 컴퓨터는 서로 매우 약한 상관 관계를 가지고 있기 때문에, 수백~수천 대까지 확장할 수 있다.

<!--[if !supportLists]-->·     <!--[endif]-->많은 수의 컴퓨터가 처리에 참가하므로, 하드웨어 장애 등의 시스템 장애가 예외적인 상황이라기 보다는 일반적인 상황이라고 가정한다.

<!--[if !supportLists]-->·     <!--[endif]-->Map Reduce라는 간단하고 추상화된 기본 연산으로 복잡한 여러 문제를 해결할 수 있도록 한다. 병렬 프로그램에 익숙하지 않은 프로그래머라도 쉽게 데이터에 대한 병렬 처리를 할 수 있도록 하고 있다.

<!--[if !supportLists]-->·     <!--[endif]-->많은 수의 컴퓨터에 의한 고처리량(throughput)을 지원한다. HDFS와 같은 저장소에 저장된 데이터는 가용한 worker에 나누어져 key, value 형태로 표현되며(Map), 중간 결과는 로컬 디스크에 저장된다. 이 데이터가 Reduce를 하는 worker에 의해서 취합되어서 결과 파일이 만들어 진다.

 

 

Hadoop HA

 

 

 NamenodeHDFS의 디렉토리 구조와 파일 위치가 모두 저장되어 있기 때문에 Namenode가 정상적으로 동작하지 않을 경우 모든 클라이언트가 HDFS에 접근할 수 없다. edit log에 문제가 발생하여도 이와 비슷한 상황이 발생한다. 따라서 네임노드의 이중화 필요성 대두, 체크포인트 주기 조절, edit log 수시 백업 등등의 시도가 있어왔다.

<!--[if !supportLists]-->-      <!--[endif]-->Namenode HA 네임 노드의 이중화(Active / Standby) shared edits : edit log 를 여러 서버(journalnode)에 복제 저장. journalnode는 최소 3개 이상, 홀수 개로, 전체 journalnode 중 반드시 절반 이상이 실행되어 있어야 한다. (최대 장애 허용 범위= 절반 –1)

<!--[if !supportLists]-->-      <!--[endif]-->Zookeeper : 어떤 노드가 active인지 standby인지 그 상태정보를 zookeeper에 저장 한다.

<!--[if !supportLists]-->-      <!--[endif]-->ZKFC(zookeeper failover controller):  Namenode 상태 모니터링. active Namenode에 장애 발생시 standby Namenode active Namenode로 전환

<!--[if !supportLists]-->-      <!--[endif]-->HDFS federation : 기존의 HDFS가 단일 Namenode에 기능이 집중되는 것을 막기 위해 제안된 시스템. HDFS는 다수의 Namenode로 구성되며 각 Namenode는 독립된 name space를 관리한다. 추가적으로 HDFS는 통합된 name space를 제공하지 않으므로 전체 Namenode 의 디렉토리가 설정돼 있는 mount table을 생성하여 통합된 name space를 참조할 수 있다.

<!--[if !supportLists]-->-      <!--[endif]-->HDFS snapshot:스냅샷을 이용해 언제든지 복원 가능한 시점으로 HDFS를 복원할 수 있다.

 

Hadoop HA 패키지 선정

HA 기능은 Hadoop 2.0부터 추가되었으나, 다음과 같이 버전에 따라 적용된 내용이 다르다.

<!--[if !supportLists]-->       <!--[endif]-->Hadoop 2.0.0 : Manual Failover 지원, NFS를 통한 edit log 공유

<!--[if !supportLists]-->       <!--[endif]-->Hadoop 2.0.2 : Automatic Failover 지원, NFS를 통한 edit log 공유

<!--[if !supportLists]-->       <!--[endif]-->Cloudera CDH 4.1.x : Automatic Failover 지원, Quorum Journal Manager(이하 QJM)를 통해 edit log 공유

<!--[if !supportLists]-->       <!--[endif]-->Hadoop 2.0.3 : Automatic Failover 지원, QJM 지원

 

 

 YARN  

하나의 Hadoop 클러스터는 다수의 서버로 구성되어 많은 컴퓨팅 리소스를 가지고 있는데 이것을 하나의 컴퓨팅 플랫폼에만 할당하는 것은 비효율적이다.

MapReduce이외에 Spark, Storm 등과 같은 다른 컴퓨팅 플랫폼이 출현하였고 이들을 사용하고자 하는 요구사항도 늘어나게 되었다.

<!--[if !supportLists]-->-      <!--[endif]-->여러 개의 컴퓨팅 플랫폼을 동시에 실행할 경우 각 서버의 리소스가 부족하여 정상적으로 수행되던 작업들이 다른 작업에 의해 문제가 발생

<!--[if !supportLists]-->-      <!--[endif]-->MapReduce 이외에 다른 클러스터를 구성할 경우 클러스터 전체의 사용 효율이 떨어지는 경우가 많음

 

Yarn은 이러한 이유로 기존 MapReduce 중에서 클러스터의 리소스를 관리하는 부분만 가져와서 다른 서비스에서도 사용 가능하도록 구성한 시스템이다.

 

Yarn 구성요소

<!--[if !supportLists]-->1)     <!--[endif]-->Resource Manager

-  <!--[endif]-->클러스터 전반의 자원관리와 Task들의 스케쥴링을 담당한다.

-  <!--[endif]-->Client로 부터 애플리케이션 실행을 요청 받으면 그 애플리케이션의 실행을 책임질 Application Master를 실행한다.

-  <!--[endif]-->또한 클러스터 내에 설치된 모든 NodeManager와 통신을 통해서 서버마다 할당된 자원과 사용중인 자원의 상태를 알 수있으며, Application Master와 통신을 통해 필요한 자원이 무엇인지 알아내어 관리하게 된다.

-  <!--[endif]-->Resource Manager 내부에는 Scheduler, Application Manager, Resource Tracker 세 개의 메인 컴포넌트가 있다.

 

<!--[if !supportLists]-->-      <!--[endif]-->Scheduler

<!--[if !supportLists]-->       <!--[endif]-->Node Manager들의 자원상태를 관리하며 부족한 리소스들을 배정한다.

<!--[if !supportLists]-->       <!--[endif]-->Scheduler는 프로세스의 상태를 검사하거나 모니터링 하지 않으며, 자원상태에 따라서 Task들의 실행여부를 호가해주는 역할만 담당한다.

<!--[if !supportLists]-->       <!--[endif]-->프로세스가 요구하는 리소스(CPU, Disk, 네트워크 등)에 관련된 기능만 처리한다.

 

<!--[if !supportLists]-->-      <!--[endif]-->Application Manager

<!--[if !supportLists]-->       <!--[endif]-->Node Manager에서 특정작업을 위해 Application Master를 실행하고 상태를 관리한다.

<!--[if !supportLists]-->       <!--[endif]-->Application Master YARN에서 실행되는 하나의 Task를 관리하는 마스터 서버이다.

 

<!--[if !supportLists]-->-      <!--[endif]-->Resource Tracker

<!--[if !supportLists]-->       <!--[endif]-->Container가 살아있는지 확인하기 위해서 Application Master 접속 재시도 최대횟수, Node Manager가 죽은 것으로 간주될 때까지 대기시간 등 설정정보를 갖고 있다.

  

<!--[if !supportLists]-->2)     <!--[endif]-->Node Manager

-  <!--[endif]-->YARN 클러스터의 Worker 서버로 ResouceManager를 제외한 모든 서버에 실행

-  <!--[endif]-->사용자가 요청한 프로그램을 실행하는 Container fork시키고 Container를 모니터링

-  <!--[endif]-->Container 장애 상황 또는 Container가 요청한 리소스보다 많이 사용하고 있는지 감시

 

<!--[if !supportLists]-->-      <!--[endif]-->Application Master

<!--[if !supportLists]-->       <!--[endif]-->하나의 프로그램에 대한 마스터 역할 수행

<!--[if !supportLists]-->       <!--[endif]-->Scheduler로 부터 적절한 Container를 할당 받고, 프로그램 실행상태를 모니터링 및 관리 한다

 

<!--[if !supportLists]-->-      <!--[endif]-->Container

<!--[if !supportLists]-->       <!--[endif]-->CPU, Disk, Memory 등과 같은 속성으로 정의 되고 응용 프로그램을 지원한다.

<!--[if !supportLists]-->       <!--[endif]-->Job은 여러 개의 Task로 세분화 되며, Task는 하나의 Container 안에서 실행 된다.

<!--[if !supportLists]-->       <!--[endif]-->필요한 자원 요청은 Application Master가 담당하며, 승인 여부는 Resource Manager가 담당한다.

<!--[if !supportLists]-->       <!--[endif]-->Container에서 실행 가능한 대상은 Java 프로그램 뿐만 아니라 커맨드 라인에서 실행할 수 있는 프로그램이다.

 

Yarn의 장점

<!--[if !supportLists]-->1)     <!--[endif]-->효율적인 자원관리

  - 각 서버마다 node manager들이 작업을 실행하고 그에 필요한 자원들을 관리한다.

  - 하기 때문에 맵 슬롯과 리듀스 슬롯을 따로 관리한다.

  - 클러스터 전체의 사용률이 낮은 기존의 하둡1에 비해 자원 배분이 효율적 이다

 

<!--[if !supportLists]-->2)     <!--[endif]-->다양한 분산처리 환경 지원

  - 맵리듀스 이외의 다른 분산처리 환경을 지원하며 YARN API를 이용하여 새로운 분산처리 환경의 개발이 가능

  - 기존의 다른 맵리듀스 프로그램 코드를 수정하지 않고도 YARN에서 실행할 수 있는 호환성

 

3)     높은 확장성

  - 수용 가능한 단일 클러스터의 규모를 10000 노드까지 확대

  - 이로 인한 처리 가능한 데이터 처리 작업의 개수도 증가

 

 

지금까지 Hadoop에 대한 개념적인 내용을 확인했고 다음에는 CentOS 7, Hadoop 2.7을 대상으로 설치방법에 대해 작성하겠습니다.

 

시리즈 내용은 아래 링크를 통해 확인해주세요.

 

[첫번째 이야기] 빅데이터란?

[세번째 이야기] Hadoop Cluster 설치하기

[네번째 이야기] Hadoop 장애 Test