HDFS Federation Balance 가이드
HDFS Federation Balance 가이드
HDFS Federation Balance는 서로 다른 federation 네임스페이스 간에 데이터를 균형(balance) 있게 분배하는 도구예요. 소스 경로에서 타깃 경로로 데이터를 복사하는 데 DistCp를 사용해요. 먼저 소스 경로에 스냅샷을 만들고 초기 distcp를 제출해요. 그다음 소스와 타깃이 같아질 때까지 distcp diff로 증분 복사를 수행해요. RBF 모드로 동작 중이면 Router의 마운트 테이블을 갱신하고, 마지막으로 소스를 trash로 옮겨요.
출처: 문서
본문
개요 (Overview)
HDFS Federation Balance는 서로 다른 federation 네임스페이스 간에 데이터를 균형 있게 분배하는 도구예요. DistCp를 사용해 소스 경로에서 타깃 경로로 데이터를 복사해요. 먼저 소스 경로에 스냅샷을 만들고 초기 distcp를 제출해요. 둘째로 소스와 타깃이 같아질 때까지 distcp diff로 증분 복사를 수행해요. 그다음 RBF 모드로 동작 중이라면 Router의 마운트 테이블을 갱신해요. 마지막으로 소스를 trash로 옮겨요. 이 문서는 HDFS Federation Balance의 사용법과 설계를 설명하는 것을 목표로 해요.
사용법 (Usage)
기본 사용법 (Basic Usage)
hdfs federation balance 도구는 일반 federation 클러스터와 router 기반 federation 클러스터를 모두 지원해요. 예를 들어 rbf를 들어 보자면, Router에 다음과 같은 마운트 항목이 있다고 가정해요:
Source Destination
/foo/src hdfs://namespace-0/foo/src
아래 명령은 hdfs federation balance 작업을 실행해요. 첫 번째 파라미터는 마운트 항목이고, 두 번째는 타깃 경로(타깃 클러스터를 반드시 포함해야 함)예요.
bash$ /bin/hadoop rbfbalance -router submit /foo/src hdfs://namespace-1/foo/dst
hdfs://namespace-0/foo/src에서 hdfs://namespace-1/foo/dst로 데이터를 증분 복사하고, 마지막으로 마운트 항목을 다음과 같이 갱신해요:
Source Destination
/foo/src hdfs://namespace-1/foo/dst
hadoop shell 프로세스가 예기치 않게 종료되면 다음 명령으로 완료되지 않은 작업을 계속할 수 있어요:
bash$ /bin/hadoop rbfbalance continue
이것은 저널(journal)을 스캔해 완료되지 않은 모든 작업을 찾아 복구하고 계속 실행해요.
일반 federation 클러스터에서 균형을 맞추려면 다음 명령을 사용해요:
bash$ /bin/hadoop fedbalance submit hdfs://namespace-0/foo/src hdfs://namespace-1/foo/dst
일반 federation 모드에서는 소스 경로에 경로 스키마를 반드시 포함해야 해요.
RBF 모드와 일반 Federation 모드 (RBF Mode And Normal Federation Mode)
hdfs federation balance 도구는 두 가지 모드가 있어요:
- router 기반 federation 모드 (RBF mode)
- 일반 federation 모드 (normal federation mode)
rbfbalance 명령은 router 기반 federation 모드에서 동작해요. fedbalance 명령은 일반 federation 모드에서 동작해요.
rbf 모드에서 첫 번째 파라미터는 마운트 포인트로 간주돼요. 마운트 포인트를 readonly로 설정해 쓰기를 비활성화해요. 일반 federation 모드에서 첫 번째 파라미터는 소스의 전체 경로로 간주돼요. 첫 번째 파라미터는 소스 클러스터를 반드시 포함해야 해요. 소스 경로의 모든 권한을 취소해 쓰기를 비활성화해요. 쓰기 비활성화에 대한 자세한 내용은 HDFS FedBalance 를 참고하세요.
명령 옵션 (Command Options)
submit 명령의 옵션:
| Option key | Description | Default |
|---|---|---|
-forceCloseOpen |
DIFF_DISTCP 단계에서 diff가 없을 때 모든 열린 파일을 강제로 닫아요. | 열린 파일이 없을 때까지 대기 |
-map |
복사에 사용할 최대 동시 map 수 | 10 |
-bandwidth |
map당 bandwidth를 MB로 지정 | 10 |
-delay |
작업이 재시도할 때 지연 시간(밀리초) | 1000 |
-moveToTrash |
이 옵션에는 trash(소스 경로를 trash로 이동), delete(소스 경로 직접 삭제), skip(trash와 삭제 모두 건너뜀) 3가지 값이 있어요. 기본적으로 서버 측 trash 간격이 사용돼요. 서버 측에서 trash가 비활성화되어 있으면 기본 trash 간격 60분이 사용돼요. |
trash |
-diffThreshold |
증분 복사 단계에 사용되는 diff 항목의 임계값을 지정해요. |
HDFS Federation Balance의 아키텍처 (Architecture of HDFS Federation Balance)
HDFS Federation Balance의 컴포넌트는 다음 범주로 분류할 수 있어요:
- Balance Procedure Scheduler
- HDFS FedBalance
Balance Procedure Scheduler
Balance Procedure Scheduler는 상태 머신(state machine)을 구현해요. balance 작업을 제출(submit), 실행(run), 지연(delay), 복구(recover)하는 것을 포함한 스케줄링을 담당해요.
작업이 제출된 후 작업은 pendingQueue에 추가돼요. 워커 스레드가 작업을 가져와 실행해요. 저널이 스토리지에 기록돼요. 저널 쓰기가 실패하면 작업은 나중에 복구하기 위해 recoverQueue에 추가돼요. Worker 스레드가 RetryTaskException을 잡으면 작업을 delayQueue에 추가해요. Rooster 스레드가 delayQueue에서 작업을 가져와 pendingQueue에 다시 추가해요. 스케줄러가 시작되면 저널에서 완료되지 않은 모든 작업을 스캔해 recoverQueue에 추가해요. recover 스레드가 저널에서 이를 복구해 pendingQueue에 다시 추가해요.
HDFS FedBalance
HDFS FedBalance는 상태 머신의 한 작업(job)으로 구현돼요. 모든 distcp balance 로직이 여기에 구현돼 있어요.
HDFS FedBalance 작업은 3개의 프로시저로 구성돼요:
- DistCpProcedure: 첫 번째 프로시저예요. 모든 데이터 복사 작업을 처리해요. 6개의 단계가 있어요:
PRE_CHECK: src와 dst 경로의 사전 검사를 수행해요.INIT_DISTCP: 소스 경로의 스냅샷을 만들고 이를 타깃으로 distcp해요.DIFF_DISTCP: 소스와 타깃 경로를 동기화하기 위해-diff를 사용한 distcp를 라운드별로 제출해요.-forceCloseOpen이 설정되면 src와 dst 사이에 diff가 없을 때 이 단계가 끝나요. 그렇지 않으면 이 단계는 diff가 없고 열린 파일도 없을 때만 끝나요.DISABLE_WRITE: src가 변경되지 않도록 쓰기 연산을 비활성화해요. router 모드에서는 마운트 포인트를 readonly로 만들어 수행돼요. 일반 federation 모드에서는 소스 경로의 모든 권한을 취소해 수행돼요.FINAL_DISTCP: 모든 열린 파일을 강제로 닫고 최종 distcp를 제출해요.FINISH: 정리 작업을 수행해요.
더 알아보기 (Learn more)
- 원문: 문서