概述
Ø NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
Ø NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用
这时可通过此种方式将NameNode很快的切换到另外一台机器。
HDFS-HA配置
原理
zookeeper客户端检测到namenode假死,后通过zookeeper服务器告知另外一个客户端
客户端会进行相关操作
要点:
1)元数据管理方式需要改变
内存中各自保存一份元数据;
Edits日志只有Active状态的NameNode节点可以做写操作;
两个NameNode都可以读取Edits;
共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);
2)需要一个状态管理功能模块
实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。
3)必须保证两个NameNode之间能够ssh无密码登录
4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务
谁先启动谁创建一把锁,其他namenode无法创建,只有释放锁才能创建。
手动故障转移
1.把原先的集群停掉
2.各节点做一个快照
3.将原Hadoop复制一份拷贝到/opt/ha
①创建/opt/ha目录 并修改所属主和所属组
②将hadoop拷贝过来后,需要将hadoop中的data,logs删除
③将/tmp/*内容也删除掉
④分发
4.每个节点修改HADOOP_HOME(一定一定要source)
5.在core-site.xml中配置
<property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><!-- 自定义标签 --><property><name>hadoop.data.dir</name><value>/opt/ha/hadoop-3.1.3/data</value></property>
6.在hdfs-site.xml中配置
<property><name>dfs.namenode.name.dir</name><value>file://${hadoop.data.dir}/name</value></property><property><name>dfs.datanode.data.dir</name><value>file://${hadoop.data.dir}/data</value></property><property><name>dfs.nameservices</name><value>mycluster</value></property><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2,nn3</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>hadoop102:9820</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>hadoop103:9820</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn3</name><value>hadoop104:9820</value></property><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>hadoop102:9870</value></property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>hadoop103:9870</value></property><property><name>dfs.namenode.http-address.mycluster.nn3</name><value>hadoop104:9870</value></property><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value></property><!-- 访问代理类,client用于确定哪个NN为Active --><property><name>dfs.client.failover.proxy.provider.mycluster</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>/home/atguigu/.ssh/id_rsa</value></property><!-- 指定NN的元数据在JournalNode的哪个位置存放 --><property><name>dfs.journalnode.edits.dir</name><value>${hadoop.data.dir}/jn</value></property>
下面步骤一定要按顺序执行!!!
1.在每台机器上输入以下命令启动journalnode服务
注意:先将/tmp/下的内容清空
hdfs --daemon start journalnode
2.在hadoop102上,对其进行格式化,并启动
hdfs namenode -formathdfs --daemon start namenode
3. 在hadoop103和hadoop104上,同步nn1的元数据信息
hdfs namenode -bootstrapStandby
4. 启动NameNode 在hadoop103和hadoop104
hdfs --daemon start namenode
5. 在hadoop102,hadoop103,hadoop104节点上上,启动datanode
hdfs --daemon start datanode
6. 在任意一台节点上将nn1切换为Active
/hdfs haadmin -transitionToActive nn1
7. 在任意一台节点上查看是否Active
hdfs haadmin -getServiceState nn1
自动故障转移
1.在hdfs-site.xml中增加
<property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property>
2.在core-site.xml文件中增加
<property><name>ha.zookeeper.quorum</name><value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value></property>
1.在任意一台节点上关闭所有HDFS服务:
stop-dfs.sh
2.在任意一台节点上启动Zookeeper集群:
zkCluster.sh start
3.在任意一台节点上初始化HA在Zookeeper中状态:
hdfs zkfc -formatZK
4.在任意一台节点上启动HDFS服务:
start-dfs.sh
5.在任意一台节点上验证
将Active NameNode进程kill
hdfs —daemon stop namenode
YARN-HA配置
原理:
直接由zookeeper进行监控
配置:
1.前面的NN的HA已经配好
2.Yarn-site.xml
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!--启用resourcemanager ha--><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!--声明两台resourcemanager的地址--><property><name>yarn.resourcemanager.cluster-id</name><value>cluster-yarn1</value></property><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2,rm3</value></property><property><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop102</value></property><property><name>yarn.resourcemanager.hostname.rm3</name><value>hadoop104</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop103</value></property><!--指定zookeeper集群的地址--><property><name>yarn.resourcemanager.zk-address</name><value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value></property><!--启用自动恢复--><property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><!--指定resourcemanager的状态信息存储在zookeeper集群--><property><name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property></configuration>
3.(1)在任意一台节点中执行:
start-yarn.sh
(2)查看服务状态
yarn rmadmin -getServiceState rm1
HDFS Federation架构设计
解决namenode数据量不断变大的问题
每个namenode不是互为备份的设计
