HDFS DataNode 관리자 가이드

HDFS DataNode 관리자 가이드

HDFS 네임노드가 모든 데이터노드의 상태를 관리하는 방법과, 데이터노드를 운영 상태(서비스 중/제외/유지보수)별로 관리하는 절차를 정리한 가이드예요. 데이터노드를 내렸다가 다시 올리는(decommission/recommission) 방법과 유지보수 상태 설정을 다룹니다.

출처: 문서

본문

개요 (Overview)

HDFS 네임노드는 모든 데이터노드의 상태를 유지·관리합니다. 상태에는 두 가지 종류가 있어요. 첫 번째는 데이터노드가 살아있는지(live), 죽었는지(dead), 오래됐는지(stale)를 나타내는 liveness(활성) 상태이고, 두 번째는 노드가 서비스 중(in service), 제외(decommissioned), 유지보수(under maintenance) 중인지를 나타내는 admin(관리) 상태예요.

관리자가 데이터노드를 제외(decommission)시키면, 해당 노드는 먼저 DECOMMISSION_INPROGRESS 상태로 전환됩니다. 그 노드가 가진 모든 블록이 각 블록의 복제 팩터에 따라 다른 곳에 완전히 복제되면 DECOMMISSIONED 상태로 전환되어요. 이후 관리자는 노드를 종료하고 며칠에서 몇 주가 걸릴 수도 있는 장기 수리·유지보수를 수행할 수 있고, 수리가 끝나면 다시 클러스터로 복귀(recommission)시킬 수 있습니다.

때로는 관리자가 몇 분~몇 시간 동안만 데이터노드를 내려서 단기 수리·유지보수를 하고 싶을 때가 있어요. 이 경우 decommission으로 인해 발생하는 HDFS 블록 복제 오버헤드가 꼭 필요하지 않을 수 있고, 가벼운 절차가 바람직합니다. 바로 그럴 때 유지보수(maintenance) 상태를 사용합니다. 관리자가 데이터노드를 유지보수 상태로 넣으면 먼저 ENTERING_MAINTENANCE 상태로 전환되고, 해당 노드의 모든 블록이 최소한 다른 곳에 복제되어 있으면 즉시 IN_MAINTENANCE 상태로 전환됩니다. 유지보수가 끝나면 관리자는 노드를 유지보수 상태에서 해제할 수 있어요. 또한 유지보수 상태는 타임아웃을 지원해서, 데이터노드가 유지보수 상태에 머물 수 있는 최대 시간을 관리자가 설정할 수 있습니다. 타임아웃이 지나면 HDFS가 사람의 개입 없이 자동으로 노드를 유지보수 상태에서 해제합니다.

정리하면, 데이터노드 관리 작업(admin operations)은 다음과 같습니다.

  • Decommission (노드 제외)
  • Recommission (노드 복귀)
  • 노드를 유지보수 상태로 넣기
  • 노드를 유지보수 상태에서 빼기

그리고 데이터노드 관리 상태(admin states)는 다음과 같습니다.

  • NORMAL — 노드가 서비스 중입니다.
  • DECOMMISSIONED — 노드가 제외되었습니다.
  • DECOMMISSION_INPROGRESS — 노드가 DECOMMISSIONED 상태로 전환되는 중입니다.
  • IN_MAINTENANCE — 노드가 유지보수 상태입니다.
  • ENTERING_MAINTENANCE — 노드가 유지보수 상태로 전환되는 중입니다.

호스트 단위 설정 (Host-level settings)

데이터노드 관리 작업을 수행하려면 두 단계가 필요합니다.

  1. 호스트 단위 설정 파일을 갱신해서 대상 데이터노드의 원하는 관리 상태를 나타냅니다. 설정 파일은 두 가지 형식을 지원해요.
    • 호스트명만 쓰는 형식(Hostname-only configuration). 각 줄이 하나의 데이터노드 호스트명/IP 주소입니다. 기본 형식입니다.
    • JSON 기반 형식(JSON-based configuration). 설정이 JSON 형식입니다. 각 요소가 데이터노드 하나에 대응하고, 데이터노드마다 여러 속성을 가질 수 있어요. 데이터노드를 유지보수 상태로 넣으려면 이 형식이 필요합니다.
  2. 다음 명령을 실행해 네임노드가 호스트 단위 설정 파일을 다시 읽도록 합니다. hdfs dfsadmin [-refreshNodes]

호스트명만 쓰는 형식 (Hostname-only configuration)

네임노드가 사용하는 기본 설정입니다. 노드 제외(decommission)와 복귀(recommission)만 지원하고, 유지보수 상태 관련 관리 작업은 지원하지 않아요. hdfs-default.xml에서 설명하는 대로 dfs.hosts와 dfs.hosts.exclude를 사용합니다.

다음 예시에서 host1과 host2는 서비스 중이어야 하고, host3과 host4는 제외(decommissioned) 상태여야 합니다.

dfs.hosts 파일

host1
host2
host3
host4

dfs.hosts.exclude 파일

host3
host4

JSON 기반 형식 (JSON-based configuration)

JSON 기반 형식은 데이터노드에 일반적인 속성을 지원하는 새 설정 형식입니다. hdfs-default.xml에서 설명하는 대로 다음 설정을 지정해 JSON 기반 형식을 활성화합니다.

설정 값
dfs.namenode.hosts.provider.classname org.apache.hadoop.hdfs.server.blockmanagement.CombinedHostFileManager
dfs.hosts json hosts 파일의 경로

HDFS가 현재 지원하는 속성 목록은 다음과 같습니다.

속성 설명
hostName 필수. 데이터노드의 호스트 이름.
upgradeDomain 선택. 데이터노드의 업그레이드 도메인 id.
adminState 선택. 기대하는 관리 상태. 기본값은 NORMAL이고, decommission은 DECOMMISSIONED, 유지보수는 IN_MAINTENANCE.
port 선택. 데이터노드의 포트 번호.
maintenanceExpireTimeInMS 선택. 데이터노드가 유지보수 상태에 머무는 기한(epoch 시간, 밀리초). 기본값은 영구(forever).

다음 예시에서 host1과 host2는 서비스 중, host3은 제외, host4는 유지보수 상태여야 합니다.

dfs.hosts 파일

[
  {
    "hostName": "host1"
  },
  {
    "hostName": "host2",
    "upgradeDomain": "ud0"
  },
  {
    "hostName": "host3",
    "adminState": "DECOMMISSIONED"
  },
  {
    "hostName": "host4",
    "upgradeDomain": "ud2",
    "adminState": "IN_MAINTENANCE"
  }
]

클러스터 단위 설정 (Cluster-level settings)

데이터노드 관리와 관련된 클러스터 단위 설정이 몇 가지 있습니다. 일반적인 사용에서는 기본값을 그대로 쓰는 것이 좋아요. 설명과 기본값은 hdfs-default.xml을 참고하세요.

dfs.namenode.maintenance.replication.min
dfs.namenode.decommission.interval
dfs.namenode.decommission.blocks.per.interval
dfs.namenode.decommission.max.concurrent.tracked.nodes

Backing-off Decommission Monitor (실험)

기존 decommission 알고리즘은 블록을 많이 가진 DataNode를 제외할 때 문제가 있습니다.

  • 네임노드의 쓰기 잠금(write lock)이 재복제(re-replication) 큐잉 때문에 오랫동안 유지될 수 있음.
  • 여러 DataNode가 decommission 중이면 재복제 작업이 노드 하나씩 순차적으로 진행됨.

HDFS-14854에서 이런 문제를 완화하기 위해 새 decommission 모니터를 도입했어요. 이 기능은 현재 실험(experimental) 단계이며 기본적으로 비활성화되어 있습니다. hdfs-site.xml에서 dfs.namenode.decommission.monitor.class 값을 org.apache.hadoop.hdfs.server.blockmanagement.DatanodeAdminBackoffMonitor로 설정하면 활성화할 수 있어요.

관련 설정 속성은 아래 표와 같습니다. 설명과 기본값은 hdfs-default.xml을 참고하세요.

속성
dfs.namenode.decommission.monitor.class
dfs.namenode.decommission.backoff.monitor.pending.limit
dfs.namenode.decommission.backoff.monitor.pending.blocks.per.lock

메트릭 (Metrics)

관리 상태는 네임노드의 웹UI와 JMX에 포함됩니다. HDFSCommands.html에서 설명하는 것처럼, 다음 명령으로도 관리 상태를 확인할 수 있어요.

클러스터 단위 관리 상태는 dfsadmin으로 확인합니다.

hdfs dfsadmin -report

특정 경로의 데이터를 저장하는 데이터노드의 관리 상태는 fsck로 확인합니다. 하위 호환성을 위해 유지보수 상태를 출력하려면 별도의 플래그가 필요해요.

hdfs fsck <path> // only show decommission state
hdfs fsck <path> -maintenance // include maintenance state

더 알아보기 (Learn more)