Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

소개

하둡 설치를 끝냈다고 가정하고 진행한다.

대량의 데이터를 HDFS에 저장한 다음, 맵리듀스를 이용 HDFS로 부터 데이터를 읽어서 처리하는게 하둡의 기본 기능이다. 다른 다양한 소프트웨어들은 이 두개의 핵심기능의 응용들이다.

HDFS(Hadoop distributed file system)은 확장성 및 뛰어난 이식성을 가진 자바 기반의 분산 파일 시스템이다. POSIX와 호환되지 않는 단점이 있기는 하지만 다른 파일 시스템과 비슷한 쉘 명령과 자바 API를 제공한다. 하둡 클러스터는 명목상으로 하나의 namenode와 하나의 datanode를 가지고 있지만, 그 중요도 때문에 중복해서 구성 할 수 있다. 각 데이타노드는 HDFS를 위한 블럭 프로토콜을 이용해서 네트워크를 통해서 데이터 블럭을 서비스한다. 파일 시스템 통신으로는 TCP/IP 소켓을 사용한다. 클라이언트들은 RPC를 이용해서 서로 통신한다.

HDFS는 여러 대의 노드들이 가지고 있는 저장공간(HDD 혹은 SSD)를 모아서 하나의 커다란 파일시스템으로 만든다. 데이터는 여러 호스트에 걸처서 복제해서 저장하기 때문에, 이론적으로 RAID를 구성할 필요가 없다.

기본 복제 값 3을 사용하면 데이터가 세 개의 노드에 저장이 된다. 데이터 노드들은 서로 대화하여 데이터를 다시 조정하고 복사본을 이동해서 언제든지 복제된 데이터를 사용 할 수 있게 준비한다. POSIX 파일 시스템의 요구사항과 하둡의 요구사항이 서로 다르기 때문에 POSIX와 완벽하게 호환되지 않는다.

HDFS 의 목표는 아래와 같다.
  • 장애내성과 복구.
  • 거대한 데이터의 저장.
  • 데이터 처리의 지역성.

아키텍처

HDFS의 아키텍처다.

 HDFS Architecture

HDFS는 master-slave 아키텍처를 따른다.

Namenode

네임노드는 리눅스 운영체제와 네임노드 소프트웨어가 포함된 하드웨어다. 이 시스템은 아래와 같은 작업을 수행한다.
  • 파일 시스템의 네임스페이스를 관리한다.
  • 클라이언트의 파일 접근을 관리한다.
  • 파일 이름 변경, 파일과 디렉토리의 오픈/클로즈와 같은 파일 시스템 작업을 실행한다.

Datanode

데이터노드는 리눅스 운영체제와 데이터노드 소프트웨어가 포함된 하드웨어다. 이 시스템은 아래와 같은 작업을 수행한다.
  • 클라이언트의 요청을 읽어서 파일에 읽기/쓰기 작업을 한다.
  • 또한 블럭의 생성, 삭제, 복제와 같은 작업을 수행한다.

Block

유저 데이터는 HDFS에 파일 형태로 저장된다. 그리고 파일은 하나에 저장되지 않고, 여러 데이터 노드에 더 작은 파일로 나뉜다음 분산되서 저장된다. 이러한 파일 조각들을 블럭이라고 한다. 이는 HDFS가 읽고 쓰는 것은 블럭이라는 것을 의미한다. 블럭의 기본크기는 64MB다. 이 크기는 HDFS 설정에 따라서 바꿀 수 있다.

블럭을 보관할 노드의 선택은 아래의 규칙을 따른다.

첫째, 한 랙에 동일한 파일을 구성하는 복제본이 존재하지 않도록 한다. 세 개의 복제본을 만든다고 가정 할때, 첫 번째 복제는 원본과 같은 랙에 있는 노드를 선택해서 저장한다. 하지만 두번째와 세번째는 첫 번째와 다른 랙에 보관한다. 하나의 랙에 복제를 모두 몰아 버리면, 랙 스위치나 전원에 문제가 생길 경우 서비스를 할 수 없기 때문이다. 데이터 센터를 분리한다면 더 높은 수준의 가용성을 확보 할 수 있을 것이다.

 블럭 리플리카

장애 대응

블럭 깨짐

블럭이 깨지는 것은 블럭에 대한 체크섬 파일을 만드는 것으로 대응하고 있다. 블럭이 만들어지면, 블럭 데이터를 연산해서 체크섬 파일을 만들어서 블럭과 함께 저장한다. 블럭을 읽을 때, 체크섬 연산을 해서 비교하면 블럭이 깨졌는지를 확인 할 수 있다.

 Checksum

블럭이 깨진 걸 확인하면, 문제있는 블럭을 네임노드에 통지한다. 통지받은 네임노드는 문제가 생긴 블럭에 해당하는 복제 블럭을 이용해서 블럭을 복구한다.

데이터 노드 장애

데이터 노드는 네임노드에 3초마다 heartbeat메시지를 전송한다. 만약 heartbeat 메시지를 전송하지 않는다면 장애서버로 판단한다. 장애가 발생한 데이터 노드에 있는 블럭은 복제 블럭을 이용 복구 한다.

네임 노드 장애

네임노드는 파일 시스템의 전체정보라고 할 수 있는 inode를 관리한다. 네임노드의 정보가 잘못되거나 유실되면, 클러스터 전체를 사용 할 수 없게 된다. 문제는 두 개 이상의 복제를 가지는 블럭들과는 달리 네임노드는 단지 하나만 유지된다는 점이다.

네임 노드 장애는 나중에 자세히 살펴볼 생각이다. 우선은 Hadoop namenode 이중화 시 fencing 역할문서를 참고하자.

HDFS 사용

HDFS를 실제 사용해 보자. 리눅스 명령과 비슷하다.

파일 시스템 전체 크기 및 남은 용량 확인.
$ hadoop fs -df -h
Filesystem               Size  Used  Available  Use%
hdfs://hadoop01:54310  10.6 G  48 K      6.1 G    0%

디렉토리 만들기.
$ hadoop fs -mkdir -p /yundream/document

파일을 HDFS에 복사.
$ hadoop fs -put ubuntu-16.04.2-server-amd64.iso /yundream/document
$ hadoop fs -ls -h /yundream/document
Found 1 items
-rw-r--r--   2 yundream supergroup  829 M 2017-03-11 04:17 /yundream/document/ubuntu-16.04.2-server-amd64.iso

파일 가져오기
$ hadoop fs -get /yundream/document/ubuntu-16.04.2-server-amd64.iso ./

HDFS Command 레퍼런스

  1. ls <path> : path 디렉토리에 있는 파일 목록 출력
  2. lsr <path> : path 디렉토리와 서브 디렉토리에 있는 파일 목록 출력
  3. du <path> : path 디렉토리에 있는 파이의 크기와 디스크 점유율
  4. mv <src> <dst> : 파일이나 디렉토리의 이동
  5. cp <src> <dst> : 파일이나 디렉토리를 복사
  6. rm <path> : 파일이나 빈 디렉토리를 삭제
  7. rmr <path> : 디렉토리에 포함된 모든 파일과 서브디렉토리까지 삭제 한다.
  8. put <localSrc> <dest> : 로컬 파일 시스템에 있는 파일이나 디렉토리를 HDFS에 복사 한다.
  9. get <src> <localDest> : HDFS에 있는 파일을 로컬 파일 시스템으로 복사한다.
  10. mkdir <path> : 디렉토리를 만든다.
  11. test <path> : 파일이 있는지 확인한다.

참고