Hadoop | The Definitive Guide 03

1장 하둡 기초

Part 3. 하둡 분산 파일시스템

네트워크로 연결된 여러 머신의 스토리지를 관리하는 파일시스템을 분산 파일시스템이라고 한다. 하둡은 HDFS(Hadoop Distributed FileSystem)라는 분산 파일 시스템을 제공한다. 더불어 하둡은 범용 파일시스템을 추구하기 때문에 추상화의 개념을 가지고 있다.

3.1 HDFS 설계

HDFS는 범용 하드웨어로 구성된 클러스터에서 실행되고 스트리밍 방식의 데이터 접근 패턴으로 대용량 파일을 다룰 수 있도록 설계된 파일시스템이다.

  • 매우 큰 파일

  • 스트리밍 방식의 데이터 접근

    • “한번 쓰고 여러번 읽는 것”에서 시작된 아이디어
  • 범용 하드웨어

  • 빠른 데이터 응답 시간

    • 데이터 접근에 실시간 급의 접근을 요구하는 어플리케이션은 HDFS와 맞지 않다.
      • 높은 데이터 처리량 -> HDFS
      • 빠른 응답 속도 -> HBase
  • 수많은 작은 파일

    • 네임노드에서 파일시스템의 메타데이터를 메모리에서 관리
      • 저장 파일 수 는 네임노드 메모리 용량에 좌우 된다.
        • 파일, 디렉토리, 블록은 각각 150 바이트 정도의 메모리 필요.
          • 백만개 - 300MB 메모리 필요
  • 다중 라이터와 파일의 임의 수정

    • HDFS는 단일 라이터로 파일을 쓴다.

      • 덧붙이거나 덮어 쓰기는 가능

      • 파일의 임의 위치에 있는 내용을 수정하는 것은 허용하지 않는다.

      • 다중 라이터도 지원하지 않는다.

        ※ 단, 하둡 3.0 부터는 다중 라이터를 지원한다.

3.2 HDFS 개념

3.2.1 블록

  • 물리적 Disk 파일시스템
    • 파일 시스템 블록 : 수 KB
    • 디스크 블록 : 512 Byte
  • 하둡 시스템
    • HDFS 블록 : 128MB
이득
  • 하나의 서버만 사용했다면 얻을 수 없는

  • 단일 디스크 용량보다 큰 파일을 저장 할 수 있다.

  • 파일 단위가 아닌 블록 단위 추상화로

    • 블록은 데이터의 청크로 고정 크기, 저장에 필요한 정보만 가지면 된다.

      권한 정보 같은 파일 메타데이터를 함께 저장할 필요가 없어 별도 시스템에서 다루기 좋다.

  • 내고장성(fault tolerance), 가용성(availability) 제공에 필요한 복제(replication) 구현에 적합하다.

    • 손상 시 다른 복사본을 살아있는 머신에 복제하여 복제 계수를 정상으로 돌아오게 한다.
    • 읽기 부하를 클러스터 전체에 분산시키기 위해 특정 블록의 복제 계수를 높게 설정할 수도 있다.

블록 관리 명령어

1
$ hdfs fsck / -files -blocks

3.2.2 네임노드와 데이터노드

HDFS 클러스터는 마스터-워커 패턴으로 동작하는 두 종류의 노드로 구성 되어 있다.

  • 네임노드(namenode)

    • 파일시스템 트리와 그 트리에 포함된 모든 파일과 디렉터리에 대한 메타데이터 유지

      • 네임스페이스 이미지(namespace image)
      • 에디트 로그(edit log)

      ※ 블록 위치 정보는 시스템 시작 시 모든 데이터노드로부터 받아서 재구성하기 때문에 디스크에 영속적으로 저장하지는 않는다.

  • 데이터노드(datanode)

    • 파일시스템의 일꾼으로
      • 클라이언트나 네임노드의 요청이 있을 시 블록을 저장, 탐색
      • 저장하고 있는 블록의 목록을 네임노드로 보낸다.

HDFS 클라이언트

사용자를 대신해서 네임노드와 데이터노드 사이에서 통신하고 파일시스템에 접근한다.

HDFS 클라이언트는 POSIX(Portable Operation System Interface)와 유사한 파일시스템 인터페이스를 제공하기 때문에 사용자는 네임노드와 데이터노드에 관련된 함수를 몰라도 코드를 작성할 수 있다.

네임노드 장애복구 기능
  1. 메타데이터 파일 백업
    • 로컬디스크 백업
    • 원격 NFS 마운트 백업
  2. 보조 네임노드(secondary namenode) 운영
    • 에디트 로그가 너무 커지지 않도록 주기적으로 네임스페이스 이미지를 에디트 로그와 병합하여 새로운 네임스페이스 이미지를 만드는 것이다.
    • 충분한 CPU, 네임노드와 비슷한 용량의 메모리가 필요하여 별도 물리머신에 실행되는 것이 좋다. - 주 네임노드 장애 대비 네임스페이스 이미지 복제본 보관 역할
    • 어느정도 시간차를 두고 복제를 하기 때문에 주 네임노드 장애 시 어느정도 데이터 손실은 불가피하다.

※ 복구방식은 NFS에 저장된 네임노드 메타데이터 파일을 보조 네임노드로 복사, 새로 병합된 네임스페이스 이미지를 만들고 그것을 주 네임노드에 복사 후 실행하는 것이다. (HDFS 고가용성에서는 대기 네임노드가 보조 네임노드의 역할을 대신한다.)

3.2.3 블록 캐싱

데이터노드

  • 빈번하게 접근하는 블록파일

    • 오프-힙(off-heap) 블록 캐시(block cache)로 데이터노드 메모리에 명시적 캐싱 가능

      • 해당 기능 별도 설정 및 활용으로 읽기 성능 향상 가능

        ex) 조인을 할 때 작은 룩업 테이블 캐싱

사용자, 애플리케이션

  • 특정 파일 캐싱
    • 캐시 풀(cache pool)에 캐시 지시자(cache directive)를 추가 하여 특정 파일 캐싱 가능
      • 캐시 풀은 캐시 권한이나 자원의 용도를 관리하는 관리 그룹 역할을 맡는다.

3.2.4 HDFS 페더레이션

네임노드는 파일시스템의 모든 파일과 블록 참조 정보를 메모리에서 관리한다.

하둡 2.x 에서부터 HDFS 페더레이션(federation)을 지원하는데 각각의 네임노드가 파일시스템의 네임스페이스 일부를 나눠 관리하는 방식으로 새로운 네임노드를 추가할 수 있다.

  • 네임스페이스 볼륨(namespace volume) : 네임스페이스의 메타데이터를 구성
  • 블록 풀(block pool) : 네임스페이스에 포함된 파일의 전체 블록을 보관

※ 네임스페이스 볼륨은 서로 독립되어 있다. 하지만 블록 풀의 저장소는 분리되어 있지 않다. 모든 데이터노드는 클러스터의 각 네임노드마다 등록되어 있고, 여러 블록 풀로부터 블록을 저장한다.

HDFS 페더레이션 클러스터에 접근하기 위해 클라이언트는

  • 클라이언트 측 마운트 테이블
    • 파일경로, 네임노드를 매핑한 정보

를 이용한다.

3.2.5 HDFS 고가용성

장애복구와 펜싱

3.3 명령행 인터페이스

3.3.1 기본적인 파일시스템 연산

3.4 하둡 파일시스템

3.4.1 인터페이스

HTTP
C
NFS
FUSE

3.5 자바 인터페이스

3.5.1 하둡 URL로 데이터 읽기

3.5.2 파일시스템 API로 데이터 읽기

FSDataInputStream

3.5.3 데이터 쓰기

FSDataOutputStream

3.5.4 디렉터리

3.5.5 파일시스템 질의

파일 메타데이터: FileStatus
파일 목록 조회
파일 패턴
PathFilter

3.5.6 데이터 삭제

3.6 데이터 흐름

3.6.1 파일 일기 상세

3.6.2 파일 쓰기 상세

3.6.3 일관성 모델

애플리케이션 설계를 위한 결론

3.7 distcp로 병렬 복사하기

3.7.1 HDFS 클러스터 균형 유지