架构图
从nameNode1、namenode2克隆出namenode3、namenode4,分别作为1、2的standby node。
把datanode2、3、4作为namenode1的jounalnodes,datanode4、5、6作为namenode2的journalnodes。
同时将datanode2、3、4组成zookeeper cluster1,datanode5、6、7组成zookeeper cluster2,分别为namenode1、2管理的两个nameservice,提供namonode间的HA自动切换。
配置
1. 在datanode2、3、4、5、6、7上安装zookeeper
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar zxvf zookeeper-3.4.6.tar.gz
mv zookeeper-3.4.6 zookeeper
cd zookeeper/conf
cp zoo_sample.cfg zoo.cfg
修改datanode2、3、4中的zoo.cfg文件为
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hduser/mydata/zookeeper/zkdata
dataLogDir=/home/hduser/mydata/zookeeper/zkdatalog
clientPort=2181
server.1=datanode2:2888:3888
server.2=datanode3:2888:3888
server.3=datanode4:2888:3888
datanode5、6、7中的zoo.cfg为
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hduser/mydata/zookeeper/zkdata
dataLogDir=/home/hduser/mydata/zookeeper/zkdatalog
clientPort=2181
server.1=datanode5:2888:3888
server.2=datanode6:2888:3888
server.3=datanode7:2888:3888
在每个节点上创建配置文件中所设的目录,同时在dataDir下新建myid文件
mkdir -p /home/hduser/mydata/zookeeper/zkdata
mkdir -p /home/hduser/mydata/zookeeper/zkdatalog
vi /home/hduser/mydata/zookeeper/zkdata/myid
myid文件里就写一个数字,就是zoo.cfg文件里所配置的
server.X = datanodeN:2888:3888
中,节点N所对应的数字X。所以datanode2、5中myid文件内容就是数字1,datanode3、6是数字2,datanode4、7是数字3。
最后还要设置一下环境变量,添加一行到~/.bashrc
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
2. 修改配置文件core-site.xml
基本的配置前面的文章都写了,这里只贴出需要修改和增加的配置项。
修改所有namenode和datanode的core-site.xml
<property>
<name>fs.defaultFS</name>
<value>viewfs:///</value>
</property>
<property>
<name>fs.viewfs.mounttable.default.link./ns1</name>
<value>hdfs://ns1</value>
</property>
<property>
<name>fs.viewfs.mounttable.default.link./ns2</name>
<value>hdfs://ns2</value>
</property>
其中ns1、ns2与下面hdfs-site.xml中配置的nameservices对应。
在datanode1、3的core-site.xml中添加
<property>
<name>ha.zookeeper.quorum</name>
<value>datanode2:2181,datanode3:2181,datanode4:2181</value>
</property>
在datanode2、4的core-site.xml中添加
<property>
<name>ha.zookeeper.quorum</name>
<value>datanode5:2181,datanode6:2181,datanode7:2181</value>
</property>
3.修改配置文件hdfs-site.xml
在所有节点(datanode1-3、namenode2-7)中的hdfs-site.xml中都添加以下配置
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2</value>
</property>
<property>
<name>dfs.ha.namenodes.ns1</name>
<value>nn1,nn3</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn1</name>
<value>namenode1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1.nn3</name>
<value>namenode3:9000</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.namenodes.ns2</name>
<value>nn2,nn4</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2.nn2</name>
<value>namenode2:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2.nn4</name>
<value>namenode4:9000</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns2</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hduser/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hduser/mydata/hdfs/journalnode</value>
</property>
然后单独在namenode1、3的hdfs-site.xml中添加