实验环境
namenode1: 192.168.103.4
namenode2: 192.168.103.8
datanode1:192.168.103.15
datanode2: 192.168.103.5
datanode3: 192.168.103.3
操作系统: ubuntu-16.04-x64
hadoop版本: apache-hadoop-2.6.5
jdk版本:1.8
安装步骤
1.安装jdk
jdk的安装过程此处不赘述,不熟悉的话可以参考网上的资料。
搭建zookeeper集群
zookeeper集群的搭建过程可以参考这里,本例中zookeeper集群搭建在datanode1, datanode2,datanode3节点上。
2.修改主机映射并配置ssh免密码登录
为了方便配置信息的维护,我们在hadoop配置文件中使用主机名来标识一台主机,那么我们需要在集群中配置主机与ip的映射关系。
修改集群中每台主机/etc/hosts文件,添加如下内容。
192.168.103.4 namenode1
192.168.103.8 namenode2
192.168.103.15 datanode1
192.168.103.5 datanode2
192.168.103.3 datanode3
集群在启动的过程中需要ssh远程登录到别的主机上,为了避免每次输入对方主机的密码,我们需要对namenode1和namenode2配置免密码登录
在namenode1上生成公钥
ssh-keygen
一路enter确认即可生成对应的公钥。
将namenode1的公钥拷贝到namenode2, datanode1, datanode2, datanode3节点上。
ssh-copy-id -i ~/.ssh/id_rsa.pub root@namenode2
ssh-copy-id -i ~/.ssh/id_rsa.pub root@datanode1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@datanode2
在namenode2上生成公钥后,并将namenode2的公钥拷贝到namenode1, datanode1, datanode2, datanode3节点上。具体的命令可以参考namenode1上的操作命令。
3.namenode1配置hadoop,并复制到其余节点
下载hadoop 安装包,点击这里获取hadoop-2.6.5。
解压安装包
tar xf hadoop-2.6.5.tar.gz
修改etc/hadoop/hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8.0_91
修改etc/hadoop/core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/opt/hadoop-2.6.5/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>datanode1:2181,datanode2:2181,datanode3:2181</value> </property>
ha.zookeeper.quorum为zookeeper集群的地址
修改etc/hadoop/hdfs-site.xml
<property> <name>dfs.namenode.name.dir</name> <value>file:/opt/hadoop-2.6.5/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/opt/hadoop-2.6.5/tmp/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <!--HA配置 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!--namenode1 RPC端口 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>namenode1:9000</value> </property> <!--namenode1 HTTP端口 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>namenode1:50070</value> </property> <!--namenode2 RPC端口 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>namenode2:9000</value> </property> <!--namenode1 HTTP端口 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>namenode2:50070</value> </property> <!--HA故障切换 --> <property> <name>dfs.ha.automic-failover.enabled.cluster</name> <value>true</value> </property> <!-- journalnode 配置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://datanode1:8485;datanode2:8485;datanode3:8485/mycluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--发生failover时,Standby的节点要执行一系列方法把原来那个Active节点中不健康的NameNode服务给杀掉, 这个叫做fence过程。sshfence会通过ssh远程调用fuser命令去找到Active节点的NameNode服务并杀死它--> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <!--SSH私钥 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!--SSH超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <!--Journal Node文件存储地址 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/hadoop-2.6.5/tmp/journal</value> </property>
修改etc/hadoop/slaves
datanode1 datanode2 datanode3
将配置好的hadoop安装包拷贝到namenode2和其余的datanode上
scp -r hadoop-2.6.5 root@namenode2:/opt scp -r hadoop-2.6.5 root@datanode1:/opt scp -r hadoop-2.6.5 root@datanode2:/opt scp -r hadoop-2.6.5 root@datanode3:/opt
4.启动集群
启动zookeeper集群
在datanode1,datanode2, datanode3节点执行如下命令:./bin/zkServer.sh start
格式化zk集群
namenode1上执行:/bin/hdfs zkfc -formatZK
启动journalnode集群
datanode1, datanode2, datanode2上执行:./sbin/hadoop-daemon.sh start journalnode
格式化namenode
namenode1上执行:./bin/hdfs namenode -format
启动datanode
datanode1, datanode2, datanode3上执行:./sbin/hadoop-daemon.sh start datanode
启动namenode
namenode1:./sbin/hadoop-daemon.sh start namenode
namenode2:
./bin/hdfs namenode -bootstrapStandby ./sbin/hadoop-daemon.sh start namenode
此时namenode1和namenode2同时处于standby状态。
启动zkfc服务
在namenode1和namenode2上同时执行如下命令:./sbin/hadoop-daemon.sh start zkfc
启动zkfc服务后,namenode1和namenode2会自动选举出active节点
5.验证功能
root# ./bin/hdfs dfs -mkdir /test
root# ./bin/hdfs dfs -ls /
Found 1 items
drwxr-xr-x - root supergroup 0 2018-06-01 13:49 /test
root# ./bin/hdfs dfs -put /root/a.txt /test
root# ./bin/hdfs dfs -cat /test/a.txt
hello world
HA故障自动切换
此时namenode1处于active状态,namenode2处于standby状态。模拟namenode1节点namenode服务挂掉。
namenode1:
root# jps
21235 DFSZKFailoverController
21116 Jps
20014 NameNode
root# kill -9 20014
我们再查看namenode2的节点状态
namenode2由standby状态切换到active状态,HA故障自动切换成功。