HDFS 디스크 밸런서
HDFS 디스크 밸런서 (Disk Balancer)
디스크 밸런서는 데이터노드의 모든 디스크에 데이터를 고르게 분배하는 명령줄 도구입니다. 이 도구는 클러스터 전체 데이터 밸런싱을 담당하는 Balancer와는 다릅니다. 대량의 쓰기와 삭제 또는 디스크 교체로 인해 노드의 디스크 간에 데이터가 고르지 않게 퍼질 수 있습니다. 이 도구는 주어진 데이터노드에 대해 작동하며 한 디스크에서 다른 디스크로 블록을 옮깁니다.
아키텍처
Disk Balancer는 계획(plan)을 만들고 그 계획을 데이터노드에서 실행하는 방식으로 작동합니다. 계획은 두 디스크 사이에서 얼마나 많은 데이터가 이동해야 하는지를 설명하는 일련의 명령문(statement)입니다. 계획은 여러 개의 이동 단계(move step)로 구성됩니다. 이동 단계에는 소스 디스크, 대상 디스크, 이동할 바이트 수가 있습니다. 계획은 운영 중인 데이터노드에 대해 실행할 수 있습니다. Disk balancer는 매초 복사되는 데이터 양을 제한(throttle)하므로 다른 프로세스와 간섭하지 않아야 합니다. disk balancer는 클러스터에서 기본적으로 활성화되어 있습니다.
명령 (Commands)
다음 절에서는 disk balancer가 지원하는 명령과 사용 방법을 설명합니다.
Plan
주어진 데이터노드에 대해 plan 명령을 실행할 수 있습니다.
hdfs diskbalancer -plan node1.mycluster.com
이 명령은 Generic Options를 받습니다.
plan 명령에는 또한 사용자가 계획의 출력과 실행을 제어할 수 있는 파라미터 집합이 있습니다.
| 명령 옵션 | 설명 |
|---|---|
-out |
사용자가 계획 파일의 출력 위치를 제어할 수 있습니다. |
-bandwidth |
데이터노드가 운영 중이라 다른 작업을 실행 중일 수 있으므로 diskbalancer는 초당 이동되는 데이터의 양을 제한합니다. 이 파라미터는 사용할 최대 대역폭을 설정할 수 있게 합니다. 지정하지 않으면 diskBalancer가 기본 대역폭을 사용하므로 설정할 필요가 없습니다. |
-thresholdPercentage |
데이터노드의 스냅샷에 대해 작동하므로, 이동 연산이 성공을 선언하는 데 허용 오차 백분율이 있습니다. 사용자가 10%를 지정하고 이동 연산 크기가 예를 들어 20GB라면, 18GB를 이동할 수 있으면 연산이 성공한 것으로 간주됩니다. 이는 데이터노드의 실시간 변경을 수용하기 위한 것입니다. 이 파라미터는 필요하지 않으며 지정하지 않으면 기본값이 사용됩니다. |
-maxerror |
이동 단계를 중단하기 전에 실패해야 하는 블록 복사 연산 수를 지정할 수 있습니다. 역시 필요하지 않은 파라미터이며 지정하지 않으면 시스템 기본값이 사용됩니다. |
-v |
자세한(verbose) 모드. 이 파라미터를 지정하면 plan 명령이 계획 요약을 stdout에 출력하도록 강제합니다. |
-fs |
사용할 namenode를 지정합니다. 지정하지 않으면 config의 기본값이 사용됩니다. |
plan 명령은 두 개의 출력 파일을 씁니다. <nodename>.before.json은 diskbalancer 실행 전 클러스터 상태를 캡처하고, <nodename>.plan.json은 계획입니다.
Execute
Execute 명령은 plan을 받아 그 계획이 생성된 데이터노드에 대해 실행합니다.
hdfs diskbalancer -execute /system/diskbalancer/nodename.plan.json
이것은 plan 파일에서 데이터노드 주소를 읽어 계획을 실행합니다. DiskBalancer가 계획을 실행할 때는 오래 걸릴 수 있는 비동기 프로세스의 시작입니다. 따라서 query 명령이 execute 명령의 현재 상태를 얻는 데 도움이 될 수 있습니다.
| 명령 옵션 | 설명 |
|---|---|
-skipDateCheck |
날짜 검사를 건너뛰고 계획을 강제로 실행합니다. |
Query
Query 명령은 지정된 노드에서 현재 diskbalancer 상태를 가져옵니다.
hdfs diskbalancer -query nodename1.mycluster.com,nodename2.mycluster.com,...
| 명령 옵션 | 설명 |
|---|---|
-v |
자세한 모드. 개별 이동 상태를 출력합니다. |
Cancel
Cancel 명령은 실행 중인 계획을 취소합니다. 데이터노드의 계획 정보는 일시적(transient)이므로 데이터노드를 재시작하는 것도 cancel 명령과 같은 효과가 있습니다.
hdfs diskbalancer -cancel /system/diskbalancer/nodename.plan.json
또는
hdfs diskbalancer -cancel planID -node nodename
Plan ID는 query 명령으로 데이터노드에서 읽을 수 있습니다.
Report
Report 명령은 지정된 노드 또는 disk balancer 실행으로 혜택을 볼 상위 노드에 대한 상세 보고서를 제공합니다. 노드는 호스트 파일이나 쉼표로 구분된 노드 목록으로 지정할 수 있습니다.
hdfs diskbalancer -fs http://namenode.uri -report -node <file://> | [<DataNodeID|IP|Hostname>,...]
또는
hdfs diskbalancer -fs http://namenode.uri -report -top topnum
설정 (Settings)
hdfs-site.xml을 통해 제어할 수 있는 일련의 diskbalancer 설정이 있습니다.
| 설정 | 설명 |
|---|---|
dfs.disk.balancer.enabled |
클러스터에 diskbalancer가 활성화되었는지 제어합니다. 활성화되지 않으면 어떤 execute 명령도 데이터노드가 거부합니다. 기본값은 true입니다. |
dfs.disk.balancer.max.disk.throughputInMBperSec |
데이터를 복사하는 동안 diskbalancer가 소비하는 최대 디스크 대역폭을 제어합니다. 10MB 값을 지정하면 diskbalancer는 평균 10MB/S만 복사합니다. 기본값은 10MB/S입니다. |
dfs.disk.balancer.max.disk.errors |
두 디스크 사이의 특정 이동에서 포기하기 전에 무시할 수 있는 최대 오류 수 값을 설정합니다. 예를 들어 계획에 복사할 디스크 쌍이 3개 있고 첫 번째 디스크 집합이 5개 이상의 오류를 만나면 첫 번째 복사를 포기하고 계획의 두 번째 복사를 시작합니다. max errors의 기본값은 5입니다. |
dfs.disk.balancer.block.tolerance.percent |
임의 복사 단계에서 충분히 좋은 값에 도달했을 때를 지정하는 허용 오차 백분율. 예를 들어 10%를 지정하면 목표 값의 10%에 가까워지는 것으로 충분합니다. |
dfs.disk.balancer.plan.threshold.percent |
계획의 볼륨 데이터 밀도(volume Data Density)에 대한 백분율 임계값. 노드에서 임계값을 벗어난 볼륨 데이터 밀도의 절대값이 있으면, 디스크에 해당하는 볼륨이 계획에서 밸런싱을 수행해야 함을 의미합니다. 기본값은 10입니다. |
dfs.disk.balancer.plan.valid.interval |
disk balancer 계획이 유효한 최대 시간. ms(millis), s(sec), m(min), h(hour), d(day) 접미사(대소문자 무시)를 지원합니다(예: 2s, 2m, 1h). 접미사가 지정되지 않으면 밀리초로 가정합니다. 기본값은 1d입니다. |
디버깅 (Debugging)
Disk balancer는 두 개의 출력 파일을 생성합니다. nodename.before.json은 namenode에서 읽은 클러스터 상태를 포함합니다. 이 파일은 데이터노드와 볼륨에 대한 상세 정보를 포함합니다.
이 파일을 apache JIRA에 게시할 계획이라면, 개인 정보가 새어나갈 수 있으므로 호스트 이름과 볼륨 경로를 바꾸는 것이 좋습니다.
또한 JIRA에 보고하려는 노드에만 초점을 맞추도록 이 파일을 줄일 수 있습니다.
nodename.plan.json은 특정 노드에 대한 계획을 포함합니다. 이 계획 파일은 일련의 단계로 구성됩니다. 단계는 데이터노드 내부의 일련의 이동 연산으로 실행됩니다.
노드의 상태를 전후로 비교하려면 plan 명령을 다시 실행하고 새 nodename.before.json을 이전 before.json과 diff하거나, 노드에 대해 report 명령을 실행하면 됩니다.
실행 중인 계획의 진행 상황을 보려면 -v 옵션으로 query 명령을 실행하세요. 이렇게 하면 일련의 단계가 출력됩니다. 각 단계는 한 디스크에서 다른 디스크로의 이동 연산을 나타냅니다.
이동 속도는 지정된 대역폭에 의해 제한됩니다. 대역폭의 기본값은 10MB/sec로 설정되어 있습니다. -v 옵션으로 query를 실행하면 다음 값들을 보게 됩니다.
"sourcePath" : "/data/disk2/hdfs/dn",
"destPath" : "/data/disk3/hdfs/dn",
"workItem" :
"startTime" : 1466575335493,
"secondsElapsed" : 16486,
"bytesToCopy" : 181242049353,
"bytesCopied" : 172655116288,
"errorCount" : 0,
"errMsg" : null,
"blocksCopied" : 1287,
"maxDiskErrors" : 5,
"tolerancePercent" : 10,
"bandwidth" : 10
- source path - 복사하는 볼륨.
- dest path - 복사 대상 볼륨.
- start time - 밀리초 단위의 현재 시간.
- seconds elapsed - 통계를 업데이트할 때마다 갱신됨. 벽시계 시간보다 느릴 수 있음.
- bytes to copy - 복사해야 하는 바이트 수. 일정 백분율의 플러스/마이너스로 복사합니다. 따라서 bytesCopied가 bytes to copy보다 작은 값으로 보이는 경우가 많습니다. 기본적으로 이동할 바이트의 10% 이내에 도달하면 충분한 것으로 간주합니다.
- bytes copied - 소스 디스크에서 대상 디스크로 실제로 이동한 바이트 수.
- error count - 오류를 만날 때마다 오류 수를 증가시킵니다. 오류 수가 최대 오류 수(기본값 5)보다 작은 동안 이 이동을 완료하려고 시도합니다. 최대 오류 수에 도달하면 현재 단계를 포기하고 계획의 다음 단계를 실행합니다.
- error message - 현재로서는 마지막 오류 메시지를 보고하는 단일 문자열. 이전 메시지는 데이터노드 로그에 있어야 합니다.
- blocks copied - 복사된 블록 수.
- max disk errors - 이 이동 단계에 사용된 설정. 현재는 단계별 값을 제어하는 사용자 인터페이스가 없으므로 기본 설정값을 보고합니다. 미래 작업 항목입니다. plan 명령에 지정된 기본값 또는 커맨드라인 값이 이 값에 사용됩니다.
- tolerance percent - 데이터를 이동하는 동안 얼마나 벗어날 수 있는지 나타냅니다. 바쁜 클러스터에서 관리자가 계획을 계산하되 이 노드가 사용 중임을 알므로 disk balancer가 복사할 바이트의 +/- 10%에 도달하면 괜찮다고 말할 수 있게 합니다.
- bandwidth - disk balancer가 사용하는 최대 집계 소스 디스크 대역폭. 블록을 이동한 후 disk balancer는 지정된 대역폭으로 그 블록을 이동하는 데 걸려야 할 시간을 계산합니다. 실제 이동이 예상보다 덜 걸렸다면 disk balancer는 그 시간 동안 잠듭니다. 현재 모든 이동은 단일 스레드에 의해 순차적으로 실행됩니다.