步骤
背景
在hadoop2.x中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
hadoop2.x官方提供了两种HDFS HA的解决方案,一种是NFS,一种是QJM。QJM主要是主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode.
前提
- 三台服务器分别为hadoop01,hadoop02,hadoop03且已经在hosts中配置
- 三台服务器网络连通
- 三台服务器都已经安装好jdk和zookeeper
1. 首先解压hadoop
tar -zxvf hadoop-3.1.2.tar.gz -C /home/hadoop/app/
2. 配置环境变量
HADOOP_HOME=/home/hadoop/app/hadoop-3.1.2
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
3. 配置core-site.xml
进入配置文件目录:
cd ./hadoop-3.1.2/etc/hadoop
修改配置文件:
vi core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--指定hdfs的命名空间-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://qf</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>qf</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hahadoopdata/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zk的集群地址,用来协调namenode服务-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
4. 配置hdfs-site.xml
编辑hdfs-site.xml
vi hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--副本数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--块大小-->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
<!--hdfs元数据存储的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hahadoopdata/dfs/name</value>
</property>
<!--hdfs数据存储的位置-->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hahadoopdata/dfs/data</value>
</property>
<!--指定hdfs的虚拟服务名-->
<property>
<name>dfs.nameservices</name>
<value>qf</value>
</property>
<!--指定hdfs虚拟服务名下的namenode的名字-->
<property>
<name>dfs.ha.namenodes.qf</name>
<value>nn1,nn2</value>
</property>
<!--指定namenode的内部通信地址-->
<property>
<name>dfs.namenode.rpc-address.qf.nn1</name>
<value>hadoop01:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.qf.nn2</name>
<value>hadoop02:9000</value>
</property>
<!--指定namenode的web ui通信地址-->
<property>
<name>dfs.namenode.http-address.qf.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.qf.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定jouranlnode数据共享目录-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/qf</value>
</property>
<!--指定jouranlnode本地共享目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hahadoopdata/journaldata</value>
</property>
<!--开启namenode失败自动切换-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--指定namenode失败进行自动切换的主类-->
<property>
<name>dfs.client.failover.proxy.provider.qf</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--防止多个namenode同active(脑裂),采用某种方式杀死其中一个-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
5. 配置hadoop启停用户
在start-dfs.sh和stop-dfs.sh中头部加入如下代码:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
在start-yarn.sh和stop-yarn.sh中头部加入如下代码:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root
6. 配置服务器之间免密登录
首先生成密钥,在hadoop01上执行:
ssh-keygen -t rsa
ssh-copy-id -i hadoop01
ssh-copy-id -i hadoop02
完成之后直接在hadoop02这台服务器上ssh连接hadoop01
ssh hadoop01
出现如下则说明ssh免密配置成功
继续在hadoop02上执行如下操作:
ssh-keygen -t rsa
ssh-copy-id -i hadoop01
ssh-copy-id -i hadoop02
7. 启动zookeeper
在三台机器上分别执行zkServer.sh start:
zkServer.sh start
然后查看zookeeper的状态:
zkServer.sh status
8. 启动journalnode
在三台服务器上分别执行如下命令:
hadoop-daemon.sh start journalnode
jps查看journalnode是否启动
9. 格式化hdfs
在hadoop01上执行如下命令:
hdfs namenode -format(首次启动执行)
hadoop-daemon.sh start namenode
在hadoop02上执行:
hdfs namenode -bootstrapStandby(首次启动执行)
hadoop-daemon.sh start namenode
10. 格式化ZKFC
在hadoop01上执行
hdfs zkfc -formatZK(首次启动执行)
11. 启动hdfs
在hadoop01上执行
hadoop-daemon.sh start zkfc
start-dfs.sh
在hadoop02上执行
hadoop-daemon.sh start zkfc
12. 测试
输入 http://192.168.130.136:50070和http://192.168.130.137:50070查看谁是active谁是standby
我的机器是hadoop01为active,hadoop02为standby
所以在hadoop01上杀死namenode进行,查看hadoop02状态是否变为active
可以看到hadoop02变为active
问题:hadoop HA自动切换不成功
配置好之后杀掉active的namenode,另一台服务器并没有变为active
解决办法:yum install psmisc