본문 바로가기

DATA SCIENCE/DATA ENGINEERING

[Hadoop] HDFS Quota 살펴보기 (HDFS에 파일 개수 제한이 존재하는 이유)

Hadoop 을 통해 데이터 생성 파이프라인 단계별로 저장하던 중, HDFS 가 quota 기준치를 초과했다는 알림을 받게 되었다.
처음에 당연히 파일 디스크 크기가 문제일줄 알았는데, 알고보니 데이터 파일 개수가 과도하게 많아서 문제였다.
왜 Hadoop에서는 HDFS 파일 개수를 제한하고 있을까?
이번 글에서는 HDFS에서 어떤 기준의 할당량을 가지고 있는지와, 해당 할당량 기준을 가지고 있는 이유를 HDFS 내부 아키텍쳐를 통해 살펴보고자 한다.
 

HDFS quota 종류

Hadoop 분산 파일 시스템(HDFS)을 사용하면 관리자가 설정할 수 있는 quota는 다음과 같다.
각 quota 할당량은 독립적이지만, 내부적으로는 유사한 방식으로 관리 및 구현이 이루어진다.

  • space quota: 디스크 공간 관련 할당량 설정
    • 파일 데이터가 사용하는 실제 디스크 공간을 제한하며, 복제본 및 휴지통에 있는 삭제된 파일도 공간 할당량에 포함된다.
    • 설정 방법: hdfs dfsadmin -setQuota <N> <directory>...<directory>
  • name quota: 파일 및 디렉토리 개수에 대한 할당량
    • 디렉토리 자체도 name quota에 포함되며, 삭제된 파일도 휴지통에 있는 동안에는 이름 할당량을 차지한다.
    • 설정 방법: hdfs dfsadmin -setSpaceQuota <N> <directory>...<directory>

space quota는 일반 서버에서도 디스크 크기 제한이 있으니 이해가 됐지만, name quota는 왜 설정해 두는 것일까?
한번 HDFS 내부 구조를 살펴보면서 좀 더 알아보고자 한다.
 

디스크 블록 개념 살펴보기

우선 물리적인 디스크가 갖고 있는 '블록' 개념에 대해 간단히 짚어보자면,
물리 저장 장치에서 데이터를 저장하고 접근하는 연속적 섹터들의 집합으로 디스크에서 데이터를 읽고 쓰는 최소 단위를 말한다.
한번에 읽고 쓸 수 있는 데이터 최대량인 블록 크기는 기본 512byte로 설정되어 있다.

HDFS에서도 유사하게 블록 개념을 갖고 있는데,
단일 디스크를 위한 파일시스템처럼 HDFS 파일은 특정 블록 크기의 청크로 쪼개지고, 각 청크는 독립적으로 저장된다.
이 때 블록 크기가 기본 128MB로 탐색 비용을 최소화하기 위해 일반 물리적인 디스크보다 훨씬 큰 단위로 구성되어 있다.
단일 디스크를 위한 파일시스템은 디스크 블록 크기보다 작은 데이터라도 한 블록 전체를 점유하지만,
HDFS 파일은 블록 크기보다 작은 데이터의 경우 전체 블록 크기에 해당하는 하위 디스크를 모두 점유하지는 않는다.
(ex: HDFS 블록 크기가 128MB이고, 1MB 크기 파일을 저장한다면 1MB 디스크만 사용)
 

HDFS 클러스터 아키텍쳐

위와 같은 블록을 기반으로 동작되는 HDFS 클러스터는 다음과 같이 구성되어 있다.

https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html

전반적인 HDFS 클러스터 아키텍쳐는 다음과 같이 master-worker 패턴으로 동작한다.

  • namenode (master)
    : 파일시스템의 namespace을 관리하는 역할을 한다. 파일시스템 트리에 포함된 모든 파일과 디렉토리의 메타데이터를 유지하고, 파일에 속한 모든 블록이 어느 datanode에 있는지 파악한다.
  • datanode (worker)
    : (클라이언트나 namenode의 요청이 있을 때) 블록을 저장 및 탐색하며, 블록 목록을 주기적으로 namenode에 보고한다.

파일을 읽을 때는
1) 클라이언트가 먼저 namenode에 파일 metadata를 요청해서 각 블록 위치 정보를 받아온 뒤,
2) 클라이언트에서 직접 해당 datanode와 통신하며 데이터를 읽어온다.
파일을 쓸 때는
1) 클라이언트가 데이터를 쓰기 전 namenode에 쓰기 요청을 보내고
2) namenode는 데이터를 저장할 datanode의 list를 반환한다.
3) 이후 클라이언트에서 datanode에 순차적으로 데이터를 전송해서 각 블록 복제본을 생성한다.
이 때 블록 복제본은 데이터의 안정성을 위해 파일을 여러 블록으로 분할해서 각 블록이 여러 datanode에 복제되어 저장되도록 처리한다.
보통 복제 개수(replication factor)는 3개로 설정하며, 하나의 노드에 장애가 발생하더라도 다른 노드에 저장된 복제본을 통해 데이터 손실 없이 시스템을 운영할 수 있다.
추가로 datanode의 주기적인 heartbeat와 block report를 통해 NameNode는 각 노드의 상태를 모니터링하고, 복제본의 수를 조정하는 등 장애 복구 작업을 수행한다.
 

HDFS에서 name quota가 설정된 이유

HDFS에서 name quota(파일 및 디렉토리 개수 제한)를 설정하는 주 이유는 namenode가 파일 시스템의 모든 메타데이터를 메모리에 저장하고 관리하기 때문이다.
namenode에서는 갖고 있는 메타데이터(파일 이름, 디렉토리 구조 및 각 파일별 구성 블록 정보 등)를 모두 메모리에 유지하고 있어서
빠르게 탐색을 가능하게 하지만 파일이나 디렉토리의 수가 급격하게 증가하면 namenode의 메모리 부담도 함께 커지게 된다.
따라서 수많은 작은 파일이 존재할 경우, 메타데이터의 양이 급증하여 namenode의 메모리 사용량이 과도하게 증가할 수 있다.
또한 많은 메타데이터를 처리해야 하면 이에 따라 응답시간이 늘어나고 최악의 경우에는 시스템 장애가 발생할 수 있다.
이렇게 되면 namenode 자체 성능 저하 및 장애 위험을 초래할 수 있기 때문에, 일정 수준 이상의 파일 생성이나 디렉토리 확장을 미리 방지하는 것이다.
이처럼 HDFS의 내부 아키텍처에서 namenode가 메타데이터를 메모리에 올려두면서 빠른 파일 접근을 가능하게 하는 대신,
파일 개수가 폭증할 경우 발생할 수 있는 메모리 과부하와 성능 저하를 예방하기 위해 name quota라는 제약을 도입한 것이다.
이러한 설계는 HDFS가 대규모 데이터 처리 환경에서도 안정적으로 운영될 수 있도록 하는 중요한 요소 중 하나로 볼 수 있다.


정리하자면,
1) HDFS에서는 디스크 공간에 대한 할당량을 설정하는 space quota와 파일 및 디렉토리 개수에 대한 할당량을 설정하는 name quota가 존재한다.
2) HDFS 클러스터는 master-worker 패턴으로 namenode와 datanode를 기반으로 파일을 읽고 쓰며 관리되고 있다.
3) name quota는 메타데이터를 메모리에 올려두는 namenode가 안정적으로 관리되기 위해 설정되어 있다.

추가적으로 name quota를 넘지 않도록 방지하기 위해 (hadoop 계의 알집이라고 할 수 있는) hadoop archive 압축 방식이 존재한다.
다음 글에서는 hadoop archive가 동작되는 내부 방식과 사용 방법 등에 대해 살펴보고자 한다.

 

References

https://www.usenix.org/publications/login/april-2010-volume-35-number-2/hdfs-scalability-limits-growth

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsQuotaAdminGuide.html

https://aosabook.org/en/v1/hdfs.html

반응형