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







Posted by bloodguy
,