View

hdfs_balancer

HDFS Balancer 수행


간단 수행 명령어

sudo -u hdfs hdfs dfsadmin -setBalancerBandwidth 1073741824        // 1GB로 대역폭을 변경

sudo -u hdfs hdfs balancer -threshold 5



HDFS balancing을 수행해야 하는 경우는?

Hadoop을 운영하다보면 각 datanode 간 사용률의 차이가 커질 수 있다. 이렇게 balancing이 맞지 않는 경우 중 가장 흔하게 접할 수 있을 때는 신규 node/disk를 추가 하거나, 가끔 대량의 데이터를 삭제할 때이다. 새로운 데이터가 HDFS 상에 업로드 되는 경우 namenode는 데이터 적재량 낮은 datanode를 우선적으로 선정하여 block을 추가하게 되는데, 특정 node에 I/O가 집중되는 경우 성능 저하가 발생할 수 있다. 또 used capacity rate가 높은 datanode에 데이터가 전혀 적재가 안되는 것은 아니여서, 특정 datanode의 사용률이 임계치에 도달 한다면 Mapreduce, Hive, Hbase 등이 정상적으로 동작하지 않을 가능성이 높다. 따라서 일정 이상의 사용률이 차이가 난다면 HDFS의 balance를 맞춰주는 작업을 수행해야 한다. (http://namenode:50070)

HDFS balancing을 하면 안되는 경우?

만약 hdfs 위에 hbase 를 운영중이라고 한다면 hdfs balancer를 수행하는 것은 위험하다. 이미 Hbase RegionServer에서 locality를 가지고 있는 block들을 다른 datanode로 옮긴다면 성능상의 문제가 발생하기 때문이다. 만약 이미 hdfs balancer를 수행한 경우라면 성능 문제가 있는 table들에 대해서 major compaction을 수행해야 한다. 만약 hdfs balancer를 수행 하지 않은 경우라면 hbase의 balancer를 이용하여 balancing을 수행하거나 hbase 재기동 이후 major compaction의 스케쥴을 이용하여 region의 locality를 맞춰야 한다.

 

HDFS balancer 수행

Hortonwork의 Ambari나 Cloudera의 Cloudera Manager를 사용하는 경우 web UI를 통해 hdfs balancer를 수행할 수 있다. 만약 CLI를 더 선호하거나 web ui 에서 제공하지 않는 옵션을 사용하기 위해서는 아래와 같이 CLI를 사용해야 한다.


 sudo -u hdfs hdfs balancer [-policy <policy>] [-threshold <threshold>] [-blockpools <comma-separated list of blockpool ids>] [-include [-f <hosts-file> | <comma-separated list of hosts>]] [-exclude [-f <hosts-file> | <comma-separated list of hosts>]] [-idleiterations <idleiterations>] [-runDuringUpgrade]

옵션이 필요 이상으로 많은 것 처럼 보인다. 하지만 모두 필요에 의해서 만들어진 것이니 간단히 보고 넘어가면 좋을 듯 하다.
옵션설명
[-policy <policy>]blockpool/datanode 중 하나의 정책으로 hdfs balance를 수행한다. 'datanode'는 각 노드들의 사용량을 balancing하는 것 이라면, 'blockpool' 은 각 node의 pool까지 balancing 하는 것이다. 기본 값은 'datanode' 이다.
[-threshold <threshold>]1.0 ~100.0 사이의 수를 입력하여 어느 정도까지 node 간 balancing을 수행 할 것인지 설정한다. 기본 값은 10.0 으로 각 노드들을 10% 미만으로 차이가 날 때까지 balancing 수행한다.
[-blockpools <comma-separated list of blockpool ids>]hdfs balancer가 명시된 리스트의 blockpool만 balancing 수행한다. 만약 list가 비워져 있다면 모든 block pool을 balancing 한다. 기본 값은 공백이다.
[-include [-f <hosts-file> | <comma-separated list of hosts>]]balancing을 수행할 host를 명시한다. -f 옵션으로 host들의 리스트를 가지고 있는 파일을 지정하던가, 콤마(,)로 구분된 여러 host들을 지정한다. 만약 공백이라면 모든 datanode에 대해서 진행하며, 기본 값은 공백이다.
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]]-include 옵션과 반대로 balacing에서 제외할 host들만 입력한다. 공백값은 어떠한 node들도 제외되지 않는 것이고 기본 값은 공백이다.
[-idleiterations <idleiterations>]hdfs balacer가 더 이상 balancing할 block이 없을 때까지 반복적으로 balancer를 수행한다. 기본 값은 5인데, 이동할 block이 없더라도 5번의 검사를 진행한다.
[-runDuringUpgrade]만약 이 옵션이 추가 되어 있다면 HDFS 업그레이드 수행 중에 balancer를 수행한다. (하지만 일반적으로 hdfs 업그레이드 중 balancer를 수행하는 것은 권고하지 않는다. 지속적으로 삭제되는 hdfs block들이 hdfs 내부 trash 공간을 빠르게 채울 것 이기 때문이다. )


위의 옵션으로 balancer를 수행하는 경우 굉장히 느리게 수행된다. 앞서 별다른 설정을 수행하지 않았다면 [dfs.datanode.balance.bandwidthPerSec] 값이 10485760(10MB)로 설정되어 있기 때문이다. 해당 설정 값을 더 크게 조절하거나 아래와 같이 balancer 실행 전에 동적으로 변경할 수 있다.

hdfs dfsadmin -setBalancerBandwidth 1073741824        // 1GB로 대역폭을 변경 



그 밖에도 parameter 설정을 통한 많은 옵션들이 존재한다. 자세한 사항은 아래를 참고하라. (https://community.hortonworks.com/articles/43849/hdfs-balancer-2-configurations-cli-options.html)

 

 



Share Link
reply
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31