0x00 文章内容
- HDFS之HA环境准备
- 配置HA实战
- 配置Zookeeper自动切换状态
相关指南:
安装好Zookeeper( => D003 复制粘贴玩大数据之安装与配置Zookeeper集群 )
安装好了HDFS( => Hadoop核心组件之HDFS的安装与配置 )
0x01 HDFS之HA环境准备
1. 集群规划
a. 规划图
b. 实验说明:由于服务器只有三台,所以此处使用slave1做为备master
2. 备份原本的配置
原因:因为我想操作完之后想恢复回非HA模式,如果想一直使用,则忽略此步骤
a. 备份core-site.xml
cp $HADOOP_HOME/etc/hadoop/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml_bak
b. 备份hdfs-site.xml
cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml_bak
3. 停止HDFS集群
a. 停止HDFS(如未启动则忽略)
stop-dfs.sh
0x02 配置HA实战
1. 修改hdfs-site.sh配置
a. 在master
节点的hdfs-site.sh
添加配置
vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml
<property> <name>dfs.nameservices</name> <value>mycluster</value> <description>HDFS名字节点服务的逻辑名称,可以是任意值</description> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> <description>每一个NameNode在集群中的唯一标识</description> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>master:8020</value> <description>nn1这个名字节点在RPC的时候使用的端口</description> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>slave1:8020</value> <description>nn2这个名字节点在RPC的时候使用的端口</description> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master:50070</value> <description>nn1这个NameNode对外提供的http服务的端口</description> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>slave1:50070</value> <description>nn2这个NameNode对外提供的http服务的端口</description> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value> <description>标识Journal组</description> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop-sny/bigdata/dfs/journal/data</value> <description>存储Journal数据的地方</description> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> <description>用于Java客户端来连接Active的nameNode</description> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> <description>用于在nameNode失败的时候不会对外提供服务</description> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop-sny/.ssh/id_rsa</value> <description>用于在nameNode失败的时候不会对外提供服务</description> </property>
b. 因为配置里用到了ssh,而且备节点是slave1,所以要配置slave1能免密码登录上master,如果配置了,我们可以跳过,在slave1上操作
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys hadoop-sny@master:~/.ssh/
能在slave1免密码登录上master则表示成功
ssh master
2. 修改core-site.sh配置
a. 在master节点的core-site.sh修改fs.defaultFS配置为
vi $HADOOP_HOME/etc/hadoop/core-site.xml
<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> <description>HDFS的基本路径</description> </property>
3. 同步配置到slaves
a. 同步hdfs-site.sh到slave1与slave2
~/shell/scp_all.sh $HADOOP_HOME/etc/hadoop/hdfs-site.xml
b. 同步core-site.sh到slave1与slave2
~/shell/scp_all.sh $HADOOP_HOME/etc/hadoop/core-site.xml
4. 启动journalnode并同步元数据
a. 在master、slave1和slave2上均执行(此时三个节点可以没有进程)
~/bigdata/hadoop-2.7.5/sbin/hadoop-daemon.sh start journalnode
b1. 同步原本master已经存在的元数据到slave1,在master执行
scp -r ~/bigdata/dfs/name/ hadoop-sny@slave1:~/bigdata/dfs/
b2. 除了第一步的手动拷贝,也可以用下面方式实现:
先启动master上的namenode
hadoop-daemon.sh start namenode
在slave1中执行下面语句来同步两个namenode的数据
~/bigdata/hadoop-2.7.5/bin/hdfs namenode -bootstrapStandby
执行完,发现slave1节点上也有了name文件夹,且master上最后一个fsimage(编号fsimage......14816
)已经同步过来
c. 在master中执行下面语句来初始化journal node的数据
如果初始化前,启动了master上的namenode要先停止
hadoop-daemon.sh stop namenode
否则会报下面的错: