본문 바로가기

Big DATA/Hadoop

HDFS Balancer

DataNode 추가/삭제의 경우 보유된 DataNode에 저장된 데이터를 전체 DataNode에 균등하게 배포하기 위해 HDFS에서 제공되는 Balancer 기능을 사용하여 데이터 조정을해야 합니다.

기본적으로 클러스터 사이즈가 큰 경우, HDFS Balancer에 이동되는 데이터의 규모가 일별 2TB로 제약되어 있기 때문에 매우 오랜 시간이 소요될 수 있습니다. 또한, 데이터 이동의 경우 NameNode의 메타 정보가 변경되기 때문에 Impala Daemon들에게 Balancer이후로 조정된 메타 정보를 인지하기 위해 Refreshment / Invalidate Metadata Command나 Catalog 서비스를 재시작이 요구되기도 합니다.

HDFS Balancers

HDFS 데이터는 예를 들면 기존 클러스터에 신규 DataNode를 추가 / 삭제하는 다양한 이유로 DataNode 전역에 균등하게 배분되어 있지 않을 수 있습니다. HDFS는 블록 배치 상태를 분석하고 DataNode간 데이터 균형을 제어하기 위한 Balancer 유틸을 제공합니다. Balancer는 클러스터 데이터 노드간의 데이터가 균등하게 배분될 때까지 데이터 블록을 이동시켜주는 역할을 담당합니다. Balancer는 데이터 노드 간의 데이터 분배의 역할을 담당하지, 단일 데이터 노드의 디스크 볼륨간의 데이터 조정 역할에는 관여를 하지 않습니다. 

Configuring and Running the HDFS Balancer Using Cloudera Manager

Cloudera Manager에서, HDFS Balancer 유틸은 Balancer 역할로 구성되어 있습니다. Balancer Role은 일반적으로 HDFS 서비스를 설치할 때 추가되며, Balancer 역할이 클러스터 노드에 추가되어 있지 않은 경우, 수동으로 Balancer Role을 추가할 수 있습니다. 

Configuring the Balancer Threshold

Balacner의 기본 임계값은 10%이며, 이는 개별 DataNode 디스크 사용량이 클러스터 전체 사용량과 10% 이내의 차이점이 존재하는지를 파악합니다. 예를 들어, 클러스터의 전체 DataNode의 사용량이 클러스터의 전체 디스크 저장 용량의 40%인 경우, 개별 DataNode의 디스크 사용량이 각 DataNode 디스크 저장 용량의 30%~50% 이내에 존재하는지 여부를 파악합니다. 이 유효한 범의를 초과하는 데이터 노드의 데이터에 대해 여부 또는 부족한 디스크 사용량을 보이는 데이터 노드로 데이터를 이동시키는 역할을 담당합니다. 임계값을 변경하기 위해서는,:

  1. HDFS 서비스로 이동 후, Configuration 탭을 클릭.
  2. "Scope > Balancer"를 선택.
  3. "Category > Main"를 선택
  4. Rebalancing Threshold 속성 값을 설정  

  5. 변경사항을 저장하기 위해서 "Save Changes"를 클릭.

Configuring Concurrent Moves

"dfs.datanode.balance.max.concurrent.moves" 옵션은 DataNode Balancer가 사용하는 최대 스레드의 수를 의미합니다. 이 옵션은 Balacner가 데이터를 이동하는 작업이 전체 DataNode의 리소스를 점유하여 정상적인 작업이 진행되는 현상을 방지하는 용도로 사용됩니다. 이 값을 늘리면 더 많은 Balancer Thread가 작업을 하기 때문에 데이터 이동을 좀 더 빠르게 진행할 수 있지만, 다른 정상적인 워크로드 작업과 리소스 경합을 할 가능성이 높아집니다. 또한 이 값을 작게 설정을 하면 데이터 Balacner 작업은 느리게 진행되지만 다른 워크로드의 작업과 데이터 노드의 리소스 경합이 될 가능성을 낮게 할 수 있습니다. 이 속성의 값을 변경하기 위해서는 Balancer와 DataNode의 두 옵션을 모두 수정해야 합니다. 

  • Datanode의 옵션을 구성하기 위해서는:

    • HDFS 서비스로 이동 후, Configuration 탭을 클릭.
    • DataNode Advanced Configuration Snippet (Safety Valve) for hdfs-site.xml를 선택.
    • 다음과 같이 구성 - 예를 들면, 50으로 설정.

      <property>
        <name>dfs.datanode.balance.max.concurrent.moves</name>
        <value>50</value>
      </property>
    • DataNode 재시작.
  • Balancer의 옵션을 구성하기 위해서:

    1. HDFS 서비스로 이동 후, Configuration 탭을 클릭.
    2. Balancer Advanced Configuration Snippet (Safety Valve) for hdfs-site.xml를 선택.
    3. 다음과 같이 구성 - 예를 들면, 50으로 설정.
      <property>
        <name>dfs.datanode.balance.max.concurrent.moves</name>
        <value>50</value>
      </property>

기타 옵션 : dfs.balance.bandwidthPerSec 

밸런서에 할당할 노드당 네트워크 대역폭은 일반적으로 사용 가능한 총 대역폭의 최대 10%으로 설정하는 것이 좋다고 합니다. 실제 프로덕션 환경에서 10Gb Ethernet인 경우 아래 설정값을 추천 합니다.
dfs.balance.bandwidthPerSec 10MB -> 최대 1GB

Running the Balancer

  1. HDFS 서비스로 이둥 후, HDFS 서비스에 Balancer 역할이 추가되어 있는지를 확인. 
  2. Actions > Rebalance를 차례로 선택.
  3. Rebalance 클릭. - 완료된 상태로 변경이 되며, Balancer가 성공적으로 실행된 것을 의미합니다. 


참고 문헌: 

- https://www.cloudera.com/documentation/enterprise/5-10-x/topics/admin_hdfs_balancer.html#xd_583c10bfdbd326ba--6eed2fb8-14349d04bee--780a

- https://www.cloudera.com/documentation/enterprise/properties/5-11-x/topics/cm_props_cdh580_hdfs.html