Hadoop HA高可用
为什么会有 hadoop HA 机制呢?
HA:High Available,高可用.
在Hadoop 2.0之前,在HDFS 集群中NameNode 存在单点故障 (SPOF:A Single Point of Failure)。对于只有一个 NameNode 的集群,如果 NameNode 机器出现故障(比如宕机或是软件、硬件升级),那么整个集群将无法使用,直到 NameNode 重新启动那如何解决呢?
HDFS 的 HA 功能通过配置 Active/Standby 两个 NameNodes 实现在集群中对 NameNode 的热备来解决上述问题。
如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器。
- 在一个典型的 HDFS(HA) 集群中,使用两台单独的机器配置为 NameNodes 。在任何时间点,确保 NameNodes中只有一个处于 Active 状态,其他的处在 Standby 状态。
- 其中ActiveNameNode 负责集群中的所有客户端操作,StandbyNameNode 仅仅充当备机,保证一旦ActiveNameNode 出现问题能够快速切换。
- 为了能够实时同步 Active 和 Standby 两个 NameNode 的元数据信息(实际上
editlog),需提供一个共享存储系统,可以是 NFS、QJM(Quorum Journal Manager)或者Zookeeper,ActiveNamenode 将数据写入共享存储系统,而 Standby监听该系统,一旦发现有新数据写入,则读取这些数据,并加载到自己内存中,以保证自己内存状态与 Active NameNode保持基本一致,如此这般,在紧急情况下 standby 便可快速切为 active namenode。 - 为了实现快速切换,Standby 节点获取集群的最新文件块信息也是很有必要的。为了实现这一目标,DataNode 需要配置NameNodes 的位置,并同时给他们发送文件块信息以及心跳检测。
2、集群服务器准备
- 1.修改主机名
- 2.修改 IP 地址
- 3.添加主机名和 IP 映射
- 4.添加普通用户 hadoop 用户并配置 sudoer 权限
- 5.设置系统启动级别
- 6.关闭防火墙/关闭 Selinux
- 7.安装 JDK
两种准备方式:
- 1.每个节点都单独设置,这样比较麻烦。线上环境可以编写脚本实现
- 2.虚拟机环境可是在做完以上 7 步之后,就进行克隆
- 3.然后接着再给你的集群配置 SSH 免密登陆和搭建时间同步服务
- 4.配置 SSH 免密登录
- 5.同步服务器时间
3集群安装
- 1.安装 Zookeeper 集群(可自行百度)
- 2.安装 hadoop 集群
core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- 指定hdfs的nameservice为myha01 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://7master:9000/</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata/</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>7master:2181,node1:2181,node2:2181</value>
</property>
<!-- hadoop链接zookeeper的超时时长设置 -->
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>1000</value>
<description>ms</description>
</property>
</configuration>
hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!-- 指定副本数 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 配置namenode和datanode的工作目录-数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/hadoopdata/dfs/data</value>
</property>
<!-- 启用webhdfs -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<!--指定hdfs的nameservice为myha01,需要和core-site.xml中的保持一致
dfs.ha.namenodes.[nameservice id]为在nameservice中的每一个NameNode设置唯一标示符。
配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。
例如,如果使用"myha01"作为nameservice ID,并且使用"nn1"和"nn2"作为NameNodes标示符
-->
<property>
<name>dfs.nameservices</name>
<value>myha01</value>
</property>
<!-- myha01下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.myha01</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn1</name>
<value>node1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myha01.nn1</name>
<value>node1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.myha01.nn2</name>
<value>node2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.myha01.nn2</name>
<value>node2:50070</value>
</property>
<!-- 指定NameNode的edits元数据的共享存储位置。也就是JournalNode列表
该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
journalId推荐使用nameservice,默认端口号是:8485 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;/myha01</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/data/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.myha01</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
<value>60000</value>
</property>
</configuration>
3、 修改 slaves
添加 datanode 的节点地址:
hadoop02
hadoop03
hadoop04
hadoop05
4、 分发安装包到其他机器
scp -r hadoop-2.6.5 hadoop@hadoop03:$PWD
scp -r hadoop-2.6.5 hadoop@hadoop04:$PWD
scp -r hadoop-2.6.5 hadoop@hadoop05:$PWD
5、 并分别配置环境变量
vi ~/.bashrc
添加两行:
export HADOOP_HOME=/home/hadoop/apps/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
保存退出
6、 集群初始化操作
1、 先启动 zookeeper 集群
启动:zkServer.sh start
检查启动是否正常:zkServer.sh status
2、 分别在每个 zookeeper(也就是规划的三个 journalnode 节点,不一定跟 zookeeper
节点一样)节点上启动 journalnode 进程
[hadoop@hadoop02 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop03 ~]$ hadoop-daemon.sh start journalnode
[hadoop@hadoop04 ~]$ hadoop-daemon.sh start journalnode
然后用 jps 命令查看是否各个 datanode 节点上都启动了 journalnode 进程
如果报错,根据错误提示改进
3、 在第一个 namenode 上执行格式化操作
[hadoop@hadoop02 ~]$ hadoop namenode -format
然后会在 core-site.xml 中配置的临时目录中生成一些集群的信息
把他拷贝的第二个 namenode 的相同目录下
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata/</value>
这个目录下,千万记住:两个 namenode 节点该目录中的数据结构是一致的
[hadoop@hadoop02 ~]$ scp -r ~/data/hadoopdata/ hadoop03:~/data
或者也可以在另一个 namenode 上执行:hadoop namenode -bootstrapStandby
4、 格式化 ZKFC
[hadoop@hadoop02 ~]$ hdfs zkfc -formatZK
在第一台机器上即可
5、 启动 HDFS
[hadoop@hadoop02 ~]$ start-dfs.sh