HA: (High Available)
背景:namenode 处于某些原因无法使用,集群瘫痪
方案:两个namenode,一个正常使用,一个处于待机
Active / Standby
相关问题
1. Active /Standby 元数据同步,保证 Standby 对于变化后的 edits 文件同实时同步
cloudera: 分布式存储日志文件
1. 编辑日志使用副本数保证数据安全,采用 zookeeper 的 2n+1 的方案,节点数必须是单数
2. 监控两个 namenode, 当一个出现了问题,可以达到自动故障转移
zookeeper 对时间同步要求比较高
2. JouralNode 代替 SecondaryNameNode
JouralNode 用于管理编辑日志文件
3. 客户端判别active namenode
使用proxy代理
使用的是 sshfence / shell 隔离机制
4. namenode 是哪一个是active
zookeeper 通过选举选出 active namenode,然后 zookeeper 开始监控,如果出现文件,自动故障转移
HA配置
主机分配
前期的 ssh 免密登陆,可以看 《完全分布式 Hadoop 配置》。Java安装,selinux和防火墙,可以查看《Hadoop 伪分布式配置》
zookeeper 安装
1. 解压: 三台主机同步进行
tar -zxf /home/yin/software/zookeeper-3.4.10.tar.gz -C /opt/app/
2. 配置环境变量,方便命令在任何目录下可以执行: 三台主机同步进行
/etc/profile -> source
export ZOOKEEPER_HOME=/opt/app/zookeeper-3.4.10
export PATH=$ZOOKEEPER_HOME/bin:$PATH
3. 配置 conf/zoo.cfg:三台主机同时进行
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
//配置路径
dataDir=/opt/app/zookeeper-3.4.10/data
dataLogDir=/opt/app/zookeeper-3.4.10/datalog
//配置主机名
server.1=bigdata.001.com:28880:38880 myid = 1
server.2=bigdata.002.com:28880:38880 myid = 2
server.3=bigdata.003.com:28880:38880 myid = 3
4. 创建目录: 三台主机同时进行。
//注意路径
mkdir data == dataDir=/opt/app/zookeeper-3.4.10/data
mkdir datalog == dataLogDir=/opt/app/zookeeper-3.4.10/datalog
5. 在 data 目录下添加 myid 文件
echo 1 > myid (bigdata.001.com)
echo 2 > myid (bigdata.002.com)
echo 3 > myid (bigdata.003.com)
6. 分别启动 zookeeper:三台主机都需要进行。
zkServer.sh start
zkServer.sh status/stop/restart
正常现象:不同主机可能出现的情况不同。不过总有一台主机是leader,其他主机是Follower
***************************************************
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo.cfg
Mode: follower
或者
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo.cfg
Mode: leader
****************************************************
7. 出现正常现象,表示 zookeeper 已经正常安装,暂时停止运行:三台主机都需要进行
zkServer.sh stop
Hadoop 安装
1. 解压:三台主机同步进行
tar -zxf /home/yin/software/hadoop-2.5.0.tar.gz -C /opt/app/
2. 配置环境变量:三台主机同步进行
/etc/profile -> source
export HADOOP_HOME=/opt/app/hadoop-2.5.0
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
3. 创建 journal、 hdfs/data/、hdfs/name 的路径: 三台主机都需要如此
mkdir journal
mkdir -p hdfs/name
mkdir -p hdfs/data
4. 配置 core-site.xml 文件 : 三台主机同步进行
vi etc/hadoop/core-site.xml
<!-- 指定hdfs的nameservice为ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop数据临时存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/app/hadoop-2.5.0/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>bigdata.001.com:2181,bigdata.002.com:2181,bigdata.003.com:2181</value>
</property>
5. 修改 hdfs-site.xml : 三台主机同步进行
vi etc/hadoop/hdfs-site.xml
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>bigdata.001.com:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>bigdata.001.com:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>bigdata.002.com:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>bigdata.002.com:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata.001.com:8485;bigdata.002.com:8485;bigdata.003.com:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<!--<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/app/hadoop-2.5.0/journal</value>
</property> -->
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/app/hadoop-2.5.0/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/app/hadoop-2.5.0/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
6. 修改 mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
7. 修改 yarn-site.xml : 三台主机同步进行
vi yarn-site.xml
<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>bigdata.003.com</value>
</property>
8. 配置 hadoop-env.sh, yarn-env.sh, mapred-env.sh 的 java 环境 : 三台主机同步进行
//只需在文件中添加:
export JAVA_HOME=/opt/app/jdk1.7.0_67
9. 修改 slaves 文件 datanode 节点 :三台主机同步进行
//vi slaves
bigdata.001.com
bigdata.002.com
bigdata.003.com
上述步骤基本完成了集群的配置
集群的启动
1. 分别启动 zookeeper
zkServer.sh start //启动,三个节点都需要启动
zkServer.sh status //查看状态,最好三个节点都看看状态
2. 分别启动journalnode集群
hadoop-daemons.sh start journalnode //三个节点分别启动,不然格式化 namenode 会失败
3. 格式化 zkfc, 在主机 bigdata.001.com 上执行
//启动zk,jn,并且 namenode 没有启动
hdfs zkfc -formatZK //zk下生成hadoop-ha目录表示成功, zkCli.sh -> ls /
//这里可能会报错,表示重启主机后就 ok 了,具体原因还没找到
4. 格式化 namenode 在主机 bigdata.001.com 上执行
hadoop namenode -format
//必须所有的 journalnode 已经被启动,否则格式化会失败,且只需在 bigdata.001.com 上格式化一次
5. 在 bigdata.001.com 上启动 namenode
hadoop-daemon.sh start namenode
6. 在 bigdata.002.com 上启动数据同步和 standby 的 namenode
hdfs namenode -bootstrapStandby //同步元数据
//<value>qjournal://bigdata.001.com:8485;bigdata.002.com:8485;bigdata
// .003.com:8485/ns</value> 如果文本中出现这样的情况,会导致同步元数据失败。
hadoop-daemon.sh start namenode
7. 在 bigdata.001.com 上启动 datanode
hadoop-daemons.sh start datanode
sbin/start-dfs.sh
//root@bigdata.001.com's password: bigdata.001.com: Permission denied, please try again. 报了这个错误,这个应该是 ssh 没有配好的原因。可以临时用 ssh ip,来联通下
8. 在 bigdata.003.com 上启动 yarn
start-yarn.sh
9. 在 bigdata.001.com 启动 zkfc
hadoop-daemons.sh start zkfc
查看
bigdata.001.com:
[root@bigdata hadoop-2.5.0]# jps
2810 QuorumPeerMain
9515 DFSZKFailoverController
2932 JournalNode
9563 Jps
8609 DataNode
4278 NameNode
8828 NodeManager
*******************************************************
bigdata.002.com
[root@bigdata hadoop-2.5.0]# jps
8164 NodeManager
8682 DFSZKFailoverController
2832 QuorumPeerMain
7687 NameNode
7866 DataNode
8984 Jps
3807 JournalNode
**************************************************************
bigdata.003.com
[root@bigdata hadoop-2.5.0]# jps
7516 DataNode
8588 NodeManager
9021 Jps
7816 ResourceManager
3738 JournalNode
2805 QuorumPeerMain
通过测试:
系统中总是存在一个 namenode处于激活状态。
测试 HA
# 进入 namenode:50070
http://192.168.47.138:50070/dfshealth.html#tab-overview
http://192.168.47.139:50070/dfshealth.html#tab-overview
可以发现:
bigdata.001.com 的hadoop 处于 standby 状态
bigdata.002.com 的hadoop 处于 active 状态
对 bigdata.002.com 的 namenode 进行关闭
hadoop-daemon.sh stop namenode
此时:
bigdata.001.com 的 hadoop 处于 active 状态
bigdata.002.com 的 hadoop 处于 standby 状态
再次打开 bigdata.002.com 的namenode
hadoop-daemon.sh start namenode
此时:
bigdata.001.com 的 hadoop 处于 active 状态
bigdata.002.com 的 hadoop 无法加载,处于 404 状态