린아저씨의 잡학사전

하둡(Hadoop) 클러스터를 운영하다보면 자주하는 작업은 아니지만, 간혹 데이터노드(datanode)를 제거해야 할 때가 있습니다. 예를 들면 해당 클러스터에 적재하게 될 데이터 양보다 지나치게 많은 데이터노드를 구성하여 일부 데이터 노드를 제거해서 다른 용도의 장비로 사용해야할 수도 있습니다. 혹은 어떤 데이터노드가 너무 노후되어 다른 데이터 노드로 교체해야할 경우에도 데이터노드의 제거 작업이 필요합니다.

 

이렇게 데이터노드의 제거가 필요할 경우, 제거할 데이터노드가 가지고 있는 데이터를 유실하지 않고 안전하게 데이터노드를 제거하는 방법에 대해 알아보도록 하겠습니다.

 

더보기

1. 데이터노드 제거 전 확인할 사항

2. dfs.hosts.exclude 사용 설정이 되어 있지 않은 경우

3. dfs.hosts.exclude 사용 설정이 되어 있는 경우

 

1. 데이터노드 제거 전 확인할 사항

  • 데이터노드를 제거한 후의 클러스터의 데이터노드 수가 설정된 Replication Factor(복제인수)의 수보다 크거나 같아야 합니다. 일반적으로 복제인수는 3으로 설정되어 있으니 데이터노드를 제거한 후의 클러스터의 데이터 노드 수는 3대 이상이면 문제가 없습니다. 
    만약 복제 인수 보다 남게 되는 데이터 노드의 수가 적다면, 해당 데이터노드를 대신할 새로운 데이터노드를 추가한 이후에 제거하고자 했던 데이터노드를 제거해주면 됩니다.

  • 제거할 데이터노드가 현재 정상적으로 실행 중인지 확인해야 합니다. 데이터노드가 정상적으로 실행되고 있어야지 가지고 있는 데이터를 다른 노드에 전달해 줄 수 있습니다.

 

2. dfs.hosts.exclude 사용 설정이 되어 있지 않은 경우

dfs.hosts.exclude 파일은 해당 클러스터에서 제외시킬 호스트를 정의하는 파일 입니다. 해당 파일의 사용 설정이 되어 있지 않다면 우선 dfs.hosts.exclude 파일을 사용하도록 설정해주어야 합니다.

 

1. hdfs-site.xml 파일을 수정하여 dfs.hosts.exclude 를 사용하도록 설정해 줍니다.

<property>
    <name>dfs.hosts.exclude</name>
    <value>${HADOOP_HOME}/etc/hadoop/dfs.hosts.exclude</value>
</property>

2. dfs.hosts.exclude 파일에 제거할 데이터노드의 호스트명 또는 IP를 입력해 줍니다.

vi ${HADOOP_HOME}/etc/hadoop/dfs.hosts.exclude

test-datanode-005

3. 위의 설정들이 클러스터에 반영될 수 있도록 HDFS를 재시작 해줍니다.

$ stop-dfs.sh
$ start-dfs.sh

여기까지 진행을 해주면 dfs.hosts.exclude에 정의한 데이터노드가 decommissioning 상태로 변경되며, 가지고 있는 데이터가 다른 데이터노드로 복제가 시작됩니다. decommissioning에 소요되는 시간은 가지고 있는 데이터의 양이나 네트워크 상태에 따라 달라지며, 데이터 양이 많을 경우 오랜시간이 소요될 수도 있습니다. decommission이 완료되면 해당 데이터노드는 decommissioned로 상태가 변경되고 데이터노드를 중지 후 제거해주면 됩니다.

 

3. dfs.hosts.exclude 사용 설정이 되어 있는 경우

dfs.hosts.exclude 사용 설정이 되어 있는 경우, 앞서 dfs.hosts.exclude 설정을 위해 했던 작업을 제외하고는 동일하게 이루어 집니다.

 

1. dfs.hosts.exclude 파일에 제거할 데이터노드의 호스트명 또는 IP를 입력해 줍니다.

vi ${HADOOP_HOME}/etc/hadoop/dfs.hosts.exclude

test-datanode-005

2. dfs.hosts.exclude 파일을 네임노드가 reload 하도록 refresh 명령어를 입력해 줍니다.

$ hdfs dfsadmin -refreshNodes

이렇게 하면 dfs.hosts.exclude에 정의한 데이터노드가 decommissioning 상태로 변경되며, 앞서 설명드린 과정과 동일한 절차를 통해 데이터노드를 제거해 주면 됩니다.

 

decommissioning이 진행되는 상태는 active 네임노드의 WebUI에서 확인이 가능합니다. WebUI의 Overview에서 Decommissioning Nodes 항목에 제거하는 데이터노드의 수만큼 표시되고, Number of Under-Replicated Blocks에는 제거할 데이터노드로부터 복사해야할 데이터 블럭 수가 표기 됩니다.

 

여기까지 데이터노드를 데이터 유실 없이 제거하는 방법에 대해서 알아보았습니다. 데이터노드를 제거하는데 가지고 있는 블럭 복제하는데 시간이 많이 소요될 수는 있으나, 절차나 방법은 매우 쉽기 때문에 누구나 어려움 없이 제거하실 수 있으실 것이라 생각됩니다. 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band