HDFS Federation은 NameSpace를 다중화할 수 있게 해줌.
과거에는 하나의 HDFS에 단일 NameSpace 밖에 없었기 때문에 HDFS 영역자체를 분리하려면 클러스터를 여러개 구성하거나 ViewFS를 이용하는 수 밖에 없었으나 HDFS Federation이 도입되면서 하나의 클러스터에서 여러 영역을 구분할 수 있게 됨.
그리고 과거에는 NameNode 하나에 모든 요청이 몰리므로 throughput을 분산시킬 수 없었으나 이 문제도 해결됨.
기타 HDFS Federation의 필요성과 장점은 여러 다른 문서에서 설명하고 있으니 여기선 구성하는 법만 간단히 설명함.
[가정]
기존 Hadoop 클러스터는 NameNode HA 상태로 구성되어 있다고 가정함.
참고: [Hadoop] NameNode HA(HighAvailability)
여기에 test-cluster 라는 nameservice를 하나 더 추가하고, NameNode는 server03, server04의 HA로 구성함.
(JournalNode는 기존 것에 JournalId를 추가하여 사용함)
먼저 NameNode로 구성될 server03, server04는 전체 클러스터에 인증없이 ssh 접속이 가능하도록 방화벽 등의 세팅이 되어 있어야 함.
설정파일은 hdfs-site.xml 하나만 건드리면 됨.
원래 dfs.nameservices 에 my-hadoop-cluster 하나만 있었는데 여기에 콤마(,)로 구분하여 test-cluster를 하나 더 추가하고,
추가될 nameservice의 rpc-address, http-address, shared.edits 를 지정함.
추가되거나 바뀐 부분은 빨간색으로 표시.
<!-- test-cluster 가 추가됨 -->
<property>
<name>dfs.nameservices</name>
<value>my-hadoop-cluster,test-cluster</value>
</property>
<!-- 여기는 기존에 있던 my-hadoop-cluster nameservice에 대한 설정부분 -->
<property>
<name>dfs.ha.namenodes.my-hadoop-cluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.my-hadoop-cluster.nn1</name>
<value>server01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.my-hadoop-cluster.nn2</name>
<value>server02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.my-hadoop-cluster.nn1</name>
<value>server01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.my-hadoop-cluster.nn2</name>
<value>server02:50070</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.my-hadoop-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 여기는 바뀐 부분. 원래 하나밖에 지정되어 있지 않았음 -->
<property>
<name>dfs.namenode.shared.edits.dir.my-hadoop-cluster.nn1</name>
<value>qjournal://server01:8485;server02:8485;server03:8485/my-hadoop-cluster</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir.my-hadoop-cluster.nn2</name>
<value>qjournal://server01:8485;server02:8485;server03:8485/my-hadoop-cluster</value>
</property>
<!-- 여기서부터는 전부 추가된 nameservice에 대한 부분이므로 따로 빨간색 표시 안함 -->
<!-- namenode 이름은 그냥 nn1,nn2로 한다. 헷갈리든가 말든가 -->
<property>
<name>dfs.ha.namenodes.test-cluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.test-cluster.nn1</name>
<value>server03:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.test-cluster.nn2</name>
<value>server04:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.test-cluster.nn1</name>
<value>server03:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.test-cluster.nn2</name>
<value>server04:50070</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.test-cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- my-hadoop-cluster와 JournalID 부분이 다름에 주의 -->
<property>
<name>dfs.namenode.shared.edits.dir.test-cluster.nn1</name>
<value>qjournal://server01:8485;server02:8485;server03:8485/test-cluster</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir.test-cluster.nn2</name>
<value>qjournal://server01:8485;server02:8485;server03:8485/test-cluster</value>
</property>
이제 이 hdfs-site.xml 파일을 전체 클러스터에 배포.
HDFS Federation을 위해 NameNode를 추가하기 전 해당 클러스터의 ClusterID를 알아야 함.
// 기존 NameNode의 ${dfs.namenode.name.dir}/current/VERSION 파일에 보면 있음
[root@server01]# cat /home/hadoop/data/dfs/name/current/VERSION
...
...
clusterID=CID-d5cfd30e-72de-40c7-b04b-29d94596dfdb
이제 2번째 namespace 세팅 시작.
// server03 namenode 세팅
[root@server03]# /home/hadoop/bin/hdfs namenode -format -clusterId CID-d5cfd30e-72de-40c7-b04b-29d94596dfdb
[root@server03]# /home/hadoop/bin/hdfs zkfc -formatZK
[root@server03]# /home/hadoop/bin/hdfs namenode -initializeSharedEdits
[root@server03]# /home/hadoop/sbin/hadoop-daemon.sh start namenode
[root@server03]# /home/hadoop/sbin/hadoop-daemon.sh start zkfc
// 상태확인
// HDFS Federation이 되면서 haadmin 명령어에 반드시 -ns 를 지정해야 함
[root@server03]# /home/hadoop/bin/hdfs haadmin -ns test-cluster -getServiceState nn1
active
// standby NameNode 세팅
[root@server04]# /home/hadoop/bin/hdfs namenode -bootstrapStandby
[root@server04]# /home/hadoop/sbin/hadoop-daemon.sh start namenode
[root@server04]# /home/hadoop/sbin/hadoop-daemon.sh start zkfc
// 상태확인
[root@server03]# /home/hadoop/bin/hdfs haadmin -ns test-cluster -getServiceState nn2
standby
여기까지 하면 일단 namespace는 만들어진 상태.
아래처럼 디렉토리도 만들어짐.
URI 지정을 hdfs://test-cluster 로 해야하는 것에 주의.
// 디렉토리 생성
[root@server03]# /home/hadoop/bin/hdfs dfs -mkdir hdfs://test-cluster/test
// 확인
[root@server03]# /home/hadoop/bin/hdfs dfs -ls hdfs://test-cluster
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2015-04-14 16:44 hdfs://test-cluster/test
하지만 현재 test-cluster에는 DataNode가 하나도 없는 상태이기 때문에 실제 데이터를 밀어넣기 위해선 DataNode를 할당해줘야 함.
// 전체 DataNode 대상으로 반복
[root@server03]# /home/hadoop/bin/hdfs dfsadmin -refreshNamenodes server05:50020
[root@server03]# /home/hadoop/bin/hdfs dfsadmin -refreshNamenodes server06:50020
[root@server03]# /home/hadoop/bin/hdfs dfsadmin -refreshNamenodes server07:50020
[root@server03]# /home/hadoop/bin/hdfs dfsadmin -refreshNamenodes server08:50020
...
...
이제 DataNode도 있으므로 데이터가 들어감.
[root@server03]# /home/hadoop/bin/hdfs dfs -put /home/hadoop/LICENSE.txt hdfs://test-cluster/test
[root@server03]# /home/hadoop/bin/hdfs dfs -ls hdfs://test-cluster/test
Found 1 items
-rw-r--r-- 3 hadoop supergroup 15429 2015-04-14 16:44 hdfs://test-cluster/test/LICENSE.txt
원래 있던 my-hadoop-cluster와는 분리된 것을 확인 가능.
// core-site.xml의 fs.defaultFS 에 hdfs://my-hadoop-cluster가 지정되어 있으므로 그냥 하면 거기로 감
[root@server03]# /home/hadoop/hdfs dfs -mkdir /test
[root@server03]# /home/hadoop/hdfs dfs -put /home/hadoop/README.txt /test
[root@server03]# /home/hadoop/hdfs dfs -ls hdfs://my-hadoop-cluster/test
Found 1 items
-rw-r--r-- 3 hadoop supergroup 1366 2015-04-14 16:46 hdfs://my-hadoop-cluster/test/README.txt
여기까지 하면 데이터까지 완벽히 분리가 완료되었음.
HDFS Federation은 NameNode의 한계를 확장할 수 있고,
NameNode 하나로 몰려들던 부하를 분산하는데 사용할 수도 있고,
NameNode 하나가 죽어 나자빠져도 다른 부분은 멀쩡하게 돌아가므로 테스트용 namespace를 하나 운용하면서 과감한 테스트가 가능할 듯 함.
ViewFs를 이용해서 global namespace에 여러 namespace를 mount시켜서 쓸 수도 있으므로 관심있는 사람은 더 찾아보면 좋을 듯.
[참조]
https://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/Federation.html
'Hadoop' 카테고리의 다른 글
[Hadoop] Kerberos가 -norandkey 옵션을 지원하지 않는 버전일 경우 (0) | 2015.04.20 |
---|---|
[Hadoop] Kerberos 인증시 Receive Timed out으로 Login Failure 에러가 날 경우 (0) | 2015.04.20 |
[Hadoop] 1.0.0 -> 2.6.0 업그레이드 (0) | 2015.04.08 |
[Hadoop] HDFS - Short Circuit Local Reads (0) | 2015.04.02 |
[Hadoop] YARN - ResourceManager HA (HighAvailability) (2) | 2015.04.01 |