疯狂Hadoop之高可用集群搭建(二)

Hadoop3集群高可用搭建

HDFS-HA概述

1)所谓HA(high available),即高可用(7*24小时不中断服务)。

2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的 HA机制:HDFS的HA和YARN的HA。

3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。

4)NameNode主要在以下两个方面影响HDFS集群

NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启

NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用

HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

 

HDFS-HA工作要点

1)元数据管理方式需要改变:

内存中各自保存一份元数据;

Edits日志只有Active状态的namenode节点可以做写操作;

两个namenode都可以读取edits;

共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现);

2)需要一个状态管理功能模块

实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。

3)必须保证两个NameNode之间能够ssh无密码登录。

4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务

 

HDFS-HA自动故障转移工作机制

如何配置部署HA自动进行故障转移?

自动故障转移为HDFS部署增加了两个新组件:ZooKeeper和ZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能:

1)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。

2)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

 

ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:

1)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。

2)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。

3)基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为active状态。

 

HDFS-HA规划集群

准备四台虚拟机,按照如下方式分配各节点信息

疯狂Hadoop之高可用集群搭建(二)_第1张图片

配置HDFS-HA集群

因为配置文件都在hadoop-3.2.1/etc/hadoop/目录下,所以先进入该目录

进入命令: cd hadoop-3.2.1/etc/hadoop/

 

配置hadoop-env.sh文件

修改hadoop-env.sh,将文件中配置的HDFS_SECONDARYNAMENODE_USER配置注释,然后添加HDFS_ZKFC_USER、HDFS_JOURNALNODE_USER两个配置

export HDFS_ZKFC_USER=root

export HDFS_JOURNALNODE_USER=root

疯狂Hadoop之高可用集群搭建(二)_第2张图片

 

 

配置hdfs-site.xml文件


dfs.replication
3


dfs.namenode.secondary.http-address
node02:9868




  dfs.nameservices
  mycluster




  dfs.ha.namenodes.mycluster
  nn1,nn2




  dfs.namenode.rpc-address.mycluster.nn1
  node01:8020


  dfs.namenode.rpc-address.mycluster.nn2
  node02:8020




  dfs.namenode.http-address.mycluster.nn1
  node01:9870


  dfs.namenode.http-address.mycluster.nn2
  node02:9870




  dfs.namenode.shared.edits.dir
  qjournal://node01:8485;node02:8485;node03:8485/mycluster




  dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider




  dfs.ha.fencing.methods
  sshfence


  dfs.ha.fencing.ssh.private-key-files
  /root/.ssh/id_rsa




  dfs.journalnode.edits.dir
  /hadoopdata/ha/journal


  dfs.ha.automatic-failover.enabled
  true

 

配置core-site.xml文件

修改hadoop.tmp.dir的路劲,以免与完全分布式路径起冲突



fs.defaultFS
hdfs://mycluster


hadoop.tmp.dir
/opt/hdata/ha


hadoop.http.staticuser.user
root


   ha.zookeeper.quorum
   node02:2181,node03:2181,node04:2181

 

配置workers文件

workers文件,里面写上从节点所在的主机名

编辑命令:vi workers

在文件中编写如下内容

node02

node03

node04

 

文件分发

使用scp命令下发hadoop-3.2.1到node02、node03、node04上

文件分发命令如下:

scp -r hadoop-3.2.1 root@node02:/root

scp -r hadoop-3.2.1 root@node03:/root

scp -r hadoop-3.2.1 root@node04:/root

 

配置hadoop3环境变量

编辑文件命令:vi /etc/profile

 

在文件中添加如下红色部分内容

export JAVA_HOME=/usr/java/jdk1.8.0_60

export HADOOP_HOME=/root/hadoop-3.2.1

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

 

/etc/profile文件分发

scp /etc/profile node02:/etc/

scp /etc/profile node03:/etc/

scp /etc/profile node04:/etc/

 

node02、node03、node4重新加载 /etc/profile文件

source /etc/profile

 

Zookeeper集群搭建

zookeeper安装在node02、node03、node04三台虚拟机上

将zookeeper-3.4.6.tar.gz安装包上传到node02上

 

解压安装包

命令:tar -zxvf zookeeper-3.4.6.tar.gz

疯狂Hadoop之高可用集群搭建(二)_第3张图片

配置zookeeper环境

编辑文件命令:vi /etc/profile

添加如下红色部分命令

export ZOOKEEPER_HOME=/root/zookeeper-3.4.6

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

疯狂Hadoop之高可用集群搭建(二)_第4张图片

配置zookeeper文件

进入zookeeper配置文件所在目录

进入文件命令:cd zookeeper-3.4.6/conf/

修改命令:mv zoo_sample.cfg zoo.cfg

疯狂Hadoop之高可用集群搭建(二)_第5张图片

编辑zoo.cfg文件

编辑命令:vi zoo.cfg

  1. 修改zookeeper文件存储路径
  2. 标注zookeeper服务对应的虚拟机以及端口号

疯狂Hadoop之高可用集群搭建(二)_第6张图片

 

 

文件分发

分发zookeeper到node03、node04上

文件分发命令

scp -r zookeeper-3.4.6 root@node03:/root

scp -r zookeeper-3.4.6 root@node04:/root

 

分发/etc/profile文件

scp /etc/profile node03:/etc/

scp /etc/profile node04:/etc/

 

重新加载

source /etc/profile

 

启动zookeeper集群

在node02、node03、node04上创建zookeeper文件存储路径文件夹/opt/zookeeper

命令:cd /opt/

mkdir zookeeper

由于node02的server编号为1,node03的server编号为2,node04的server编号为3。所以需要在zookeeper目录下新建一个myid文件,然后在改文件中标明序号

命令:echo 1 > /opt/zookeeper/myid

疯狂Hadoop之高可用集群搭建(二)_第7张图片

 

 

运行zookeeper

命令: zkServer.sh start

疯狂Hadoop之高可用集群搭建(二)_第8张图片

 

查看运行状态

命令: zkServer.sh status

疯狂Hadoop之高可用集群搭建(二)_第9张图片

 

停止zookeeper命令:zkServer.sh stop

 

HDFS-HA集群启动

1、namenode同步穿透

在node01、node02、node03上启动journalnode

命令:hdfs --daemon start journalnode

疯狂Hadoop之高可用集群搭建(二)_第10张图片

 

 

在node01上格式化hadoop

格式化命令:hdfs namenode -format

 

2、将数据同步到node02上

1、在node01上启动namenode节点

启动节点: hadoop-daemon.sh start namenode

疯狂Hadoop之高可用集群搭建(二)_第11张图片

2、node02同步数据

同步命令:hdfs namenode -bootstrapStandby

 

3、在node01上对zookeeper进行格式化

格式化命令:hdfs zkfc -formatZK

4、启动HDFS并访问web-ui

疯狂Hadoop之高可用集群搭建(二)_第12张图片

疯狂Hadoop之高可用集群搭建(二)_第13张图片

 

 

案例1:主节点崩溃

关闭主节点

关闭节点命令:hdfs --daemon stop namenode

你可能感兴趣的:(大数据)