hdfs dfs -setrep -R -w 3 /user/hive/warehouse
| 옵션 | 뜻 |
|---|---|
-R |
지정한 경로 아래를 재귀적으로 적용한다 |
-w |
복제가 목표 계수에 도달할 때까지 기다렸다가 명령을 끝낸다 |
3 |
목표 복제 계수 |
핵심은 -w 다. 이것이 없으면 setrep 은 NameNode 에 목표 계수를 기록하고 바로 끝난다. 실제 블록 복사는 백그라운드에서 진행되므로, 명령이 끝났다고 해서 복제가 끝난 것이 아니다. 반대로 -w 를 주면 블록이 전부 채워질 때까지 프롬프트가 돌아오지 않는다. 대상이 수십 TB 라면 몇 시간씩 매달려 있게 되므로, 스크립트에서는 -w 없이 걸어 두고 별도로 진행 상황을 확인하는 편이 낫다.
복제 계수를 줄이는 경우에는 기다릴 것이 거의 없다. NameNode 가 초과 복제본을 지우라고 지시하면 끝이다. 오래 걸리는 것은 늘리는 방향이다.
hdfs fsck /user/hive/warehouse -files -blocks | tail -40
hdfs dfsadmin -report
fsck 요약의 Under-replicated blocks 가 줄고 있는지 본다. 값이 그대로면 복제가 스케줄되지 않고 있다는 뜻이다.
노드 수와 여유 공간이 모자란 경우. 복제 계수 3 을 채우려면 서로 다른 DataNode 가 세 대 있어야 한다. 노드가 부족하거나 남은 공간이 없으면 블록은 영원히 미복제 상태로 남는다. dfsadmin -report 로 살아 있는 노드 수와 여유 공간을 먼저 본다. 랙 인식을 쓰고 있다면 배치 정책 때문에 랙이 모자라도 같은 일이 생긴다.
한 번에 도는 복제 작업 수가 제한된다. DataNode 하나가 동시에 처리하는 복제 스트림 수는 dfs.namenode.replication.max-streams 와 dfs.namenode.replication.max-streams-hard-limit 으로 제한되고, NameNode 가 한 번의 하트비트에서 내리는 작업 수는 dfs.namenode.replication.work.multiplier.per.iteration 이 정한다. 긴급하게 복제를 밀어야 한다면 이 값들을 올린다. 다만 그만큼 디스크와 네트워크를 먹으므로 작업 창에서만 올리고 되돌린다.
대역폭 상한. DataNode 의 밸런싱·복제 대역폭은 dfs.datanode.balance.bandwidthPerSec 이 제한한다. 운영 중에는 다음처럼 재기동 없이 올릴 수 있다.
hdfs dfsadmin -setBalancerBandwidth 104857600
밸런서와 겹치는 경우. 밸런서가 돌고 있으면 같은 디스크·네트워크를 두고 경쟁한다. 복제를 급히 끝내야 하면 밸런서를 잠시 멈춘다.
경로에 / 를 주고 -R 로 전체를 바꾸는 것은 피한다. 스냅샷 · 휴지통 · 시스템 디렉터리까지 같이 바뀌고, 되돌리려면 다시 전체를 훑어야 한다. 데이터베이스나 테이블 단위 경로로 좁혀서 적용한다.