빅데이터 처리와 저장의 핵심 기술, Hadoop

Hadoop (High-Availability Distributed Object-Oriented Platform)
; 대량의 자료를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 자바 소프트웨어 프레임워크.


하둡이란?

1. 배경

2006년 야후의 더그 커팅이 ‘넛치’라는 검색엔진을 개발하는 과정에서 대용량의 비정형 데이터를 기존의 RDB 기술로는 처리가 어려워 새로운 기술을 찾는 중 구글에서 발표한 GFS(Google File System) 와 MapReduce 관련 논문을 참고하여 개발하고, 이후 아파치 재단에서 오픈 소스로 공개된 기술이다.

2. 개요

하둡은 하나의 좋은 컴퓨터를 이용하여 데이터를 처리하는 대신, 적당한 성능의 범용 컴퓨터 여러대를 클러스터화 하여 데이터를 처리하는 것을 목표로 한다. 즉, 하둡은 큰 크기의 데이터를 여러대의 컴퓨터에서 병렬로 동시에 처리하여 처리 속도를 높이는 것을 목적으로 하는 분산처리 오픈소스 프레임워크라고 할 수 있다.

하둡은 분산저장(HDFS} 기술과 분산 처리 기술(MapReduce)이 탁월하며, 한 번에 여러 디스크로부터 데이터를 읽을 수 있다. 예를 들어 100개의 드라이브가 있고, 각 드라이브는 데이터의 100분의 1을 저장했다고 가정하자. 병렬로 동작한다면 2분 내에 데이터를 읽을 수 있다.

다시 말해, 하둡은 HDFS 라는 데이터 저장소 MapReduce 라는 분산 처리 시스템을 통해 분산 프로그래밍을 수행하는 프레임워크이다.

3. 하둡을 구성하는 핵심 요소

  • HDFS 파일 시스템: 빅데이터를 노드 클러스터에 저장하기 위한 파일 시스템
  • MapReduce 프레임워크: 데이터를 Key-Valule 타입으로 분석하기 위한 언어
  • YARN: 요청된 작업에 사용 가능한 자원을 할당 및 조절하는 역할

위 3가지는 하둡의 핵심 기능을 담당하는 요소이다. 이 중 데이터 저장 및 분석에 대한 핵심적인 역할을 담당하는 HDFS와 MapReduce, 그리고 YARN 에 대해 구체적인 내용을 정리해보자.


하둡 분산 파일 시스템(Hadoop Distributed File System, HDFS)

하둡 프레임워크를 위해 자바 언어로 작성된 분산 확장 파일 시스템이다. 기존의 파일 시스템(ext3, ext4, xfs..) 의 상위에서 동작한다.

HDFS 는 여러 기계에 대용량 파일들을 나눠서 저장한다. 데이터들을 여러 서버에 중복해서 저장함으로써 데이터 안정성을 얻는다.

1. 4가지 특징

  • block 단위로 저장 – 큰 데이터를 나누어 저장하므로 단일 디스크보다 큰 파일도 저장이 가능하다. 블록단위가 256MB라면 1G파일은 4개의 블록으로 나누어 저장된다. 만약 블록단위보다 작은 크기의 파일이라면 파일을 나누지 않고 그대로 저장된다.
  • replica로 중복 저장 – 서버에 문제가 생겨 데이터가 솔실되는 경우를 막기 위해 block 을 복제하여 중복 저장한다. 어느 한 서버에 문제가 생기더라도 복제 데이터를 다른 서버로부터 문제 없이 사용할 수 있다.
  • 데이터의 무결성을 위해, 읽기만 가능 – 한 번 저장한 데이터는 수정이 불가능
  • 데이터의 지역성 – 맵리듀스는 HDFS의 데이터 지역성을 이용하여 처리 속도를 증가시킨다. 데이터를 처리할 때 데이터를 알고리즘이 있는 곳으로 이동시켜 처리하지 않고, 데이터의 위치에서 알고리즘을 처리하여 데이터를 이동시키는 시간과 비용을 줄인다.

2. HDFS 구성

기본적으로 HDFS 는 Master/Slave 구조이다.

마스터/슬레이브(Master/Slave)는 장치나 프로세스(마스터)가 하나 이상의 다른 장치나 프로세스(슬레이브)를 통제하고 통신 허브 역할을 하는 비대칭 통신 및 제어 모델을 의미한다.

아래 그림과 같이 분산 처리 시스템이기 때문에 MapReduce와 HDFS는 기본적으로 Master와 Slave의 관점으로 구분된다. 즉, 분산되어져 있는 것을 관리할 Master가 필요하다.

HDFS 는 마스터/슬레이브 구조로 하나의 네임노드와 여러 개의 데이터노드로 구성된다. 네임노드는 메타데이터를 가지고 있고, 데이터는 블록 단위로 나누어 데이터노드에 저장된다. 사용자는 데이터를 읽고 쓰기 위해 메타데이터를 가지고 있는 네임노드를 이용하면 된다.

3. 네임노드

분산 처리 시스템에서 Master 를 담당하며, 메타데이터 관리와 데이터노드를 관리한다.

  • 네임노드는 각 데이터노드에서 전달하는 메타데이터를 받아, 전체 노드의 메타데이터 정보와 파일 정보를 묶어서 관리한다.
  • 파일 시스템을 유지하기 위해 메타데이터를 관리한다.
  • 데이터를 저장할 시 기본적으로 블록단위로 들어오게 된다. 이 때 들어온 블록들을 어느 데이터 노드에 저장할 지 정해준다.

4. 데이터노드

데이터들이 저장되는 컴퓨터이다. 데이터노드는 파일을 저장하는 역할을 하며, 이때 파일은 블록단위로 저장된다. 데이터노드는 주기적으로 네임노드에 하트비트블록리포트를 전달한다.

  • 하트비트 – 데이터노드의 동작여부를 판단하는데 이용. 네임노드에서는 하트비트가 전달되지 않는 데이터노드는 동작하지 않는 것으로 판단하여 더이상 데이터를 저장하지 않는다.
  • 블록리포트 – 블록의 변경사항을 체크하고, 네임노드의 메타데이터를 갱신한다. 블록파일은 사용자가 설정한 위치(dfs.data.dir)에 저장된다.

맵리듀스(MapReduce)

맵리듀스는 대용량 데이터를 처리하기 위한 분산 프로그래밍 모델이다. 분산된 데이터를 한 곳으로 모아서 분석한다면, 굉장히 오래 걸리고 비효율적일 것이다. 따라서 특정 데이터를 가지고 있는 데이터노드만 분석을 하고 결과를 받는 것이 맵리듀스다.

먼저 Map 단계에서는 흩어져 있는 데이터를 key, value로 데이터를 묶어준다. 예를 들어 key는 몇 번째 데이터인지, value는 값을 추출한 정보를 가진다. 그리고 Reduce 단계는 Map단계의 key를 중심으로 필터링 및 정렬한다.

1. Split

  • 크기가 큰 인풋 파일을 작은 단위로 나누어 분산 파일 시스템(ex. HDFS)에 저장한다.

2. Map

  • 가장 먼저 수행되며 데이터의 여러 파티션에 병렬 분산으로 호출되어 수행된다.
  • 각 노드마다 수행되는 mapper는 입력 데이터의 한 줄마다 map 함수를 호출한다.
  • (key, value) 쌍 형태로 결과를 출력하고 여러 노드에 나누어 보내며 같은 key를 가진 쌍은 같은 노드으로 보내진다.

3. Shuffling

  • 모든 노드에서 map 단계가 다 끝나면 시작된다.
  • map 단계에서 각각의 노드로 보내진 (key, value) 쌍을 key 기준으로 정렬한 후, 같은 key를 가진 value-list를 만든다.
  • value-list 를 (key, value-list) 형태로 key에 따라 여러 노드으로 분산해서 보낸다.

4. Reduce

  • 모든 노드에서 shuffling 단계가 다 끝나면 각 노드마다 reduce 단계가 시작된다.
  • 각각의 노드에서 해당 노드로 보내진 (key, value-list) 쌍 마다 reduce 함수가 호출되며 하나의 reduce 함수가 끝나면 다음 (key, value-list) 쌍에 reduce 함수가 호출된다.

얀(Yet Another Resource Negotiator, YARN)

Hadoop이 2.0으로 버전 업 되면서 크게 두가지 컴포넌트로 구성되었다. 하나는 파일을 분산 환경에 에서 쉽게 관리할 수 있도록 도와주는 분산 파일 시스템인 HDFS(Hadoop Distributed File System)와 잡(Job)들의 분산 스케줄링을 관리하는 YARN(Yet Another Resource Negotiator) 이다.

YARN의 4가지 핵심 컴포넌트에 대해 알아보자.

1. Resource manager

  • 자원 할당의 핵심적인 역할이다 
  • 처리 요청을 받으면 그에 따라 요청의 일부를 해당 노드 관리자에게 전달하여 실제 처리가 발생한다.
  • 클러스터 리소스의 중재자이며 경쟁 애플리케이션에 사용 가능한 리소스 할당을 결정한다.
  • 용량 보장, 공정성 및 SLA와 같은 다양한 제약 조건에 대해 모든 리소스를 항상 사용하도록 유지하는 등 클러스터 활용을 최적화한다.
  • 두 가지 주요 구성 요소가 있습니다.  
    • Scheduler – 스케줄러는 용량, 대기열 등의 제약에 따라 실행 중인 다양한 응용 프로그램에 리소스를 할당하는 역할을 한다.
      • ResourceManager에서는 순수 스케줄러라고 하며, 이는 응용 프로그램의 상태에 대한 모니터링이나 추적을 수행하지 않음을 의미한다.
      • 응용 프로그램 오류 또는 하드웨어 오류가 있는 경우 스케줄러는 실패한 작업의 재시작을 보장하지 않는다.
      • 애플리케이션의 리소스 요구 사항에 따라 스케줄링을 수행한다.
      • 여기에는 다양한 응용 프로그램 간에 클러스터 리소스를 분할하는 역할을 하는 플러그인 가능한 정책 플러그인이 있습니다. 이러한 플러그인 에는 현재 ResourceManager에서 스케줄러로 사용되는 Capacity Scheduler  및  Fair Scheduler 의 두 가지 플러그인이  있다.
    • Application Manager
      • 작업 제출을 수락하는 역할을 한다.
      • 응용 프로그램 특정 응용 프로그램 마스터를 실행하기 위해 리소스 관리자의 첫 번째 컨테이너를 협상한다.
      • 클러스터에서 애플리케이션 마스터 실행을 관리하고 장애 시 애플리케이션 마스터 컨테이너를 다시 시작하는 서비스를 제공한다.

2. Node Manager

  • Hadoop 클러스터의 개별 노드를  관리하고 지정된 노드에서 사용자 작업 및 워크플로를 관리한다.
  • 리소스 관리자에 등록하고 노드의 상태와 함께 하트비트를 보낸다.
  • 기본 목표는 리소스 관리자가 할당한 애플리케이션 컨테이너를 관리하는 것이다.
  • 리소스 관리자를 통해 최신 상태를 유지한다.
  • 애플리케이션 마스터는 애플리케이션 실행에 필요한 모든 것이 포함된 컨테이너 시작 컨텍스트(CLC)를 노드 관리자에게 전송하여 할당된 컨테이너를 요청합니다. 노드 관리자는 요청된 컨테이너 프로세스를 생성하고 시작한다.
  • 개별 컨테이너의 리소스 사용량(메모리, CPU)을 모니터링한다.
  • 로그 관리를 수행한다.
  • 또한 리소스 관리자의 지시에 따라 컨테이너를 종료한다.

3. Application Master

  • 애플리케이션은 프레임워크에 제출된 단일 작업이다. 이러한 각 응용 프로그램에는 프레임워크 특정 엔터티인 고유한 응용 프로그램 마스터가 연결되어 있다.
  • 클러스터에서 애플리케이션의 실행을 조정하고 오류를 관리하는 프로세스다.
  • 그 작업은 리소스 관리자의 리소스를 협상하고 노드 관리자와 협력하여 구성 요소 작업을 실행하고 모니터링하는 것이다.
  • ResourceManager에서 적절한 리소스 컨테이너를 협상하고 상태를 추적하며 진행 상황을 모니터링하는 역할을 한다.
  • 시작되면 주기적으로 하트비트를 Resource Manager에 보내 상태를 확인하고 리소스 요구 기록을 업데이트한다.

4. Container

  • 단일 노드에 있는 RAM, CPU 코어 및 디스크와 같은 물리적 리소스의 모음이다.
  • YARN 컨테이너는 컨테이너 수명 주기(CLC)인 컨테이너 시작 컨텍스트에 의해 관리된다. 이 레코드에는 환경 변수 맵, 원격으로 액세스 가능한 저장소에 저장된 종속성, 보안 토큰, Node Manager 서비스용 페이로드 및 프로세스 생성에 필요한 명령이 포함된다.
  • 특정 호스트에서 특정 양의 리소스(메모리, CPU 등)를 사용할 수 있는 권한을 애플리케이션에 부여한다.

마치며

하둡의 개념과 하둡을 구성하는 핵심 요소 3가지(HDFS, MapReduce, YARN)에 대해 알아보았다. 수집, 저장, 분석, 시각화 등 다양한 데이터 정제 기술에 대해 빅데이터 시대에 발맞춰 관심을 가지고 기술 습득 및 활용에 도전해보도록 하자.



참조

https://wikidocs.net/31519

https://han-py.tistory.com/361

https://codin9.tistory.com/5

https://www.edureka.co/blog/hadoop-yarn-tutorial/

댓글 남기기