HDFS 페더레이션
HDFS 페더레이션 (Federation)
이 가이드는 HDFS 페더레이션 기능의 개요와 페더레이션 클러스터를 구성·관리하는 방법을 제공합니다.
출처: HDFS Federation
배경 (Background)
HDFS에는 두 가지 주요 레이어가 있습니다.
- 네임스페이스(Namespace)
- 디렉터리, 파일, 블록으로 구성됩니다.
- create, delete, modify, list와 같은 파일과 디렉터리 관련 파일시스템 연산을 모두 지원합니다.
- 블록 저장 서비스(Block Storage Service), 두 부분으로 구성:
- 블록 관리(Block Management) - Namenode에서 수행
- 등록 처리와 주기적 하트비트로 Datanode 클러스터 구성원을 제공합니다.
- 블록 리포트를 처리하고 블록 위치를 유지합니다.
- create, delete, modify, get block location 같은 블록 관련 연산을 지원합니다.
- 복제본 배치, 복제가 부족한 블록의 블록 복제를 관리하고, 과복제된 블록을 삭제합니다.
- 저장(Storage) - Datanode가 로컬 파일시스템에 블록을 저장하고 읽기/쓰기 접근을 허용함으로써 제공됩니다.
- 블록 관리(Block Management) - Namenode에서 수행
이전 HDFS 아키텍처는 전체 클러스터에 단일 네임스페이스만 허용했습니다. 그 구성에서 단일 Namenode가 네임스페이스를 관리합니다. HDFS 페더레이션은 HDFS에 여러 Namenode/네임스페이스 지원을 추가해 이 제한을 해결합니다.
여러 Namenodes/네임스페이스
이름 서비스를 수평으로 확장하기 위해 페더레이션은 여러 개의 독립적인 Namenode/네임스페이스를 사용합니다. Namenode들은 페더레이션됩니다. 즉 독립적이며 서로 조정할 필요가 없습니다. Datanode는 모든 Namenode가 블록을 위한 공통 저장소로 사용합니다. 각 Datanode는 클러스터의 모든 Namenode에 등록합니다. Datanode는 주기적 하트비트와 블록 리포트를 보내며 Namenode의 명령도 처리합니다.
사용자는 ViewFs를 사용해 개인화된 네임스페이스 뷰를 만들 수 있습니다. ViewFs는 일부 Unix/Linux 시스템의 클라이언트 측 마운트 테이블과 유사합니다.
블록 풀 (Block Pool)
블록 풀은 단일 네임스페이스에 속한 블록 집합입니다. Datanode는 클러스터의 모든 블록 풀의 블록을 저장합니다. 각 블록 풀은 독립적으로 관리됩니다. 이를 통해 네임스페이스가 다른 네임스페이스와 조정할 필요 없이 새 블록에 대한 Block ID를 생성할 수 있습니다. Namenode가 실패해도 Datanode가 클러스터의 다른 Namenode를 서빙하는 것을 막지 못합니다.
네임스페이스와 그 블록 풀을 합쳐 Namespace Volume이라고 합니다. 이는 자족적인 관리 단위입니다. Namenode/네임스페이스가 삭제되면 Datanode의 해당 블록 풀도 삭제됩니다. 클러스터 업그레이드 중에 각 네임스페이스 볼륨이 하나의 단위로 업그레이드됩니다.
ClusterID
ClusterID 식별자는 클러스터의 모든 노드를 식별하는 데 사용됩니다. Namenode가 포맷될 때 이 식별자가 제공되거나 자동 생성됩니다. 이 ID는 다른 Namenode를 클러스터로 포맷하는 데 사용해야 합니다.
주요 이점 (Key Benefits)
- 네임스페이스 확장성(Namespace Scalability) - 페더레이션은 네임스페이스 수평 확장을 추가합니다. 대규모 배포나 많은 작은 파일을 사용하는 배포는 더 많은 Namenode를 클러스터에 추가할 수 있어 네임스페이스 확장의 혜택을 봅니다.
- 성능(Performance) - 파일시스템 처리량이 단일 Namenode에 의해 제한되지 않습니다. 클러스터에 더 많은 Namenode를 추가하면 파일시스템 읽기/쓰기 처리량이 확장됩니다.
- 격리(Isolation) - 단일 Namenode는 다중 사용자 환경에서 아무런 격리를 제공하지 않습니다. 예를 들어 실험용 애플리케이션이 Namenode를 과부하시켜 프로덕션에 중요한 애플리케이션을 느려지게 할 수 있습니다. 여러 Namenode를 사용하면 서로 다른 범주의 애플리케이션과 사용자를 서로 다른 네임스페이스로 격리할 수 있습니다.
페더레이션 구성
페더레이션 구성은 역호환되며 기존 단일 Namenode 구성을 변경 없이 동작하게 합니다. 새 구성은 클러스터의 모든 노드가 동일한 구성을 갖도록 설계되었습니다. 즉 클러스터의 노드 유형에 따라 다른 구성을 배포할 필요가 없습니다.
페더레이션은 새 NameServiceID 추상화를 추가합니다. Namenode와 그에 대응하는 secondary/backup/checkpointer 노드는 모두 NameServiceId에 속합니다. 단일 설정 파일을 지원하기 위해 Namenode와 secondary/backup/checkpointer 구성 파라미터에는 NameServiceID가 접미사로 붙습니다.
구성 (Configuration)
1단계: 구성에 dfs.nameservices 파라미터를 추가하고 쉼표로 구분된 NameServiceID 목록으로 구성합니다. Datanode가 클러스터의 Namenode를 결정하는 데 이 값을 사용합니다.
2단계: 각 Namenode와 Secondary Namenode/BackupNode/Checkpointer에 대해 공통 구성 파일에 해당 NameServiceID가 접미사로 붙은 다음 구성 파라미터를 추가합니다.
| 데몬 | 구성 파라미터 |
|---|---|
| Namenode | dfs.namenode.rpc-address dfs.namenode.servicerpc-address dfs.namenode.http-address dfs.namenode.https-address dfs.namenode.keytab.file dfs.namenode.name.dir dfs.namenode.edits.dir dfs.namenode.checkpoint.dir dfs.namenode.checkpoint.edits.dir |
| Secondary Namenode | dfs.namenode.secondary.http-address dfs.secondary.namenode.keytab.file |
| BackupNode | dfs.namenode.backup.address dfs.secondary.namenode.keytab.file |
두 개의 Namenode가 있는 예시 구성:
<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1</name>
<value>nn-host1:rpc-port</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1</name>
<value>nn-host1:http-port</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns1</name>
<value>snn-host1:http-port</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2</name>
<value>nn-host2:rpc-port</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2</name>
<value>nn-host2:http-port</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns2</name>
<value>snn-host2:http-port</value>
</property>
.... Other common configuration ...
</configuration>
Namenode 포맷
1단계: 다음 명령으로 Namenode를 포맷합니다.
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]
환경의 다른 클러스터와 충돌하지 않는 고유한 cluster_id를 선택하세요. cluster_id가 제공되지 않으면 고유한 값이 자동 생성됩니다.
2단계: 다음 명령으로 추가 Namenode를 포맷합니다.
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId <cluster_id>
2단계의 cluster_id는 1단계의 cluster_id와 동일해야 합니다. 다르면 추가 Namenode가 페더레이션 클러스터의 일부가 아닙니다.
이전 릴리스에서 업그레이드하고 페더레이션 구성
이전 릴리스는 단일 Namenode만 지원합니다. 페더레이션을 활성화하려면 클러스터를 최신 릴리스로 업그레이드하세요. 업그레이드 중에 다음과 같이 ClusterID를 제공할 수 있습니다.
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode -upgrade -clusterId <cluster_ID>
cluster_id가 제공되지 않으면 자동 생성됩니다.
기존 HDFS 클러스터에 새 Namenode 추가
다음 단계를 수행합니다.
- 구성에
dfs.nameservices를 추가합니다. - NameServiceID 접미사로 구성을 업데이트합니다. 구성 키 이름은 릴리스 0.20 이후 변경되었습니다. 페더레이션을 사용하려면 새 구성 파라미터 이름을 사용해야 합니다.
- 구성 파일에 새 Namenode 관련 config를 추가합니다.
- 구성 파일을 클러스터의 모든 노드에 전파합니다.
- 새 Namenode와 Secondary/Backup을 시작합니다.
- 아래 명령을 클러스터의 모든 Datanode에 대해 실행해 Datanode를 새로고침해 새로 추가된 Namenode를 인식하게 합니다.
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes <datanode_host_name>:<datanode_ipc_port>
클러스터 관리
클러스터 시작과 중지
클러스터를 시작하려면 다음 명령을 실행합니다.
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
클러스터를 중지하려면 다음 명령을 실행합니다.
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
이 명령들은 HDFS 구성이 있는 어떤 노드에서든 실행할 수 있습니다. 명령은 구성을 사용해 클러스터의 Namenode를 결정한 다음 해당 노드에서 Namenode 프로세스를 시작합니다. Datanode는 workers 파일에 지정된 노드에서 시작됩니다. 이 스크립트는 클러스터를 시작/중지하는 자체 스크립트를 만드는 참조로 사용할 수 있습니다.
Balancer
Balancer는 여러 Namenode와 함께 작동하도록 변경되었습니다. Balancer는 다음 명령으로 실행할 수 있습니다.
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start balancer [-policy <policy>]
policy 파라미터는 다음 중 하나일 수 있습니다.
datanode- 기본 정책입니다. Datanode 레벨에서 저장을 밸런싱합니다. 이전 릴리스의 밸런싱 정책과 유사합니다.blockpool- 블록 풀 레벨에서 저장을 밸런싱하며, 이는 Datanode 레벨에서도 밸런싱합니다.
Balancer는 데이터만 밸런싱하고 네임스페이스는 밸런싱하지 않습니다. 전체 명령 사용법은 balancer를 참고하세요.
폐기 (Decommissioning)
폐기는 이전 릴리스와 유사합니다. 폐기할 노드는 모든 Namenode의 exclude 파일에 추가됩니다. 각 Namenode는 자신의 Block Pool을 폐기합니다. 모든 Namenode가 Datanode 폐기를 마치면 그 Datanode는 폐기된 것으로 간주됩니다.
1단계: exclude 파일을 모든 Namenode에 배포하려면 다음 명령을 사용합니다.
[hdfs]$ $HADOOP_HOME/sbin/distribute-exclude.sh <exclude_file>
2단계: 모든 Namenode를 새로고침해 새 exclude 파일을 인식하게 합니다.
[hdfs]$ $HADOOP_HOME/sbin/refresh-namenodes.sh
위 명령은 HDFS 구성을 사용해 클러스터의 구성된 Namenode를 결정하고 새 exclude 파일을 인식하도록 새로고침합니다.
클러스터 웹 콘솔
Namenode 상태 웹 페이지와 유사하게, 페더레이션을 사용할 때 http://<any_nn_host:port>/dfsclusterhealth.jsp에서 페더레이션 클러스터를 모니터링할 수 있는 Cluster Web Console을 사용할 수 있습니다. 클러스터의 어떤 Namenode든 이 웹 페이지에 접근하는 데 사용할 수 있습니다.
Cluster Web Console은 다음 정보를 제공합니다.
- 전체 클러스터의 파일 수, 블록 수, 총 구성된 저장 용량, 사용 가능 및 사용 중인 저장 공간을 보여주는 클러스터 요약.
- 각 Namenode에 대한 파일 수, 블록, 누락 블록, 활성/비활성 데이터 노드를 포함한 Namenode 목록과 요약. 또한 각 Namenode의 웹 UI에 접근할 수 있는 링크를 제공합니다.
- Datanode의 폐기 상태.
더 알아보기 (Learn more)
- 원문: HDFS Federation