Hadoop高可用(Hadoop2.x)

Hadoop高可用(Hadoop2.x)

目录

Hadoop高可用(Hadoop2.x)

1.什么是高可用

2.Hadoop集群存在的问题

3.单点故障

3.1HDFS的单点故障

3.2NameNode的内存受限的问题

3.3Yarn的单点故障

4.Hadoop的高可用

5. Hadoop HA架构搭建

5.1基本环境配置

5.2安装Zookeeper

5.3安装Hadoop

5.4测试

6.NameNode的联邦机制

联邦的好处


1.什么是高可用

高可用性HA(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性

2.Hadoop集群存在的问题

  1. HDFS的单点故障,NameNode单点故障,难以应用于在线场景
  2. 单个NameNode压力过大,且内存受限,影响系统扩展性
  3. Yarn的单点故障,Resourcemanager单点故障,导致MR程序无法正常运行

3.单点故障

单点故障(single point of failure,缩写SPOF)是指系统中一点失效,就会让整个系统无法运作的部件,换句话说,单点故障即会整体故障。

3.1HDFS的单点故障

在Hadoop 2.0之前,NameNode是HDFS集群中的单点故障(SPOF)。每个群集只有一个NameNode,如果该计算机或进程不可用,则整个群集将不可用,直到NameNode重新启动或在单独的计算机上启动

3.2NameNode的内存受限的问题

单个NameNode节点的机器的内存是有限的,随着对HDFS文件系统的操作次数的增多,产生的日志文件(edits.log)和元数据的序列化文件(FsImage)会不断的增大,最终元数据文件会读到内存之中,而内存是有限,这样就会导致HDFS的启动速度变慢,也不利于集群DataNode的扩展。

3.3Yarn的单点故障

Hadoop2.0引入的统一的资源调度平台Yarn,包含一个Resourcemanger和多个NodeManager,Resourcemanger很重要的一个功能就是负责处理客户端提交的MR程序,并将该程序启动。如果Resourcemanger发生单点故障,就会导致MR程序无法在Yarn运行。

4.Hadoop的高可用

Hadoop实现高可用主要有两种方式,一种是使用共享日志编辑系统(QJM),另一种是基于网络文件系统(NFS)的高可用方案。基于NFS的高可用方案需要额外安装NFS服务器,而QJM的高可用方案不需要安装额外的服务器。两种高可用方案都依赖于Zookeeper。

两个单独的计算机配置为NameNode。在任何时间点,一个NameNode都恰好处于活动状态(Active),而另一个则处于Standby状态。Active NameNode负责集群中的所有客户端操作,而Standby则仅充当从属,并保持足够的状态以在必要时提供快速故障转移。基于JournalNode实现的高可用,如下图:

Hadoop高可用(Hadoop2.x)_第1张图片

1.两台NN启动后都会去zk(zookeeper)进行注册,优先注册的为主节点(Active),另外一个为备节点(Standby),

2.主NN对外提供服务,备NN同步主NN元数据,以待切换,通过集群JN(JournalNode)。

备用NN也会帮助主NN合并editsLog文件和fsimage产生新的fsimage,并推送ActiveNN。

3.ZKFailover Controller(ZKFC,与NN在同一机器上)的作用是监控NameNode健康状态,当主NN挂掉之后,备用NN的ZKFC会得到消息,然后会将备用NN状态改为(Active),并是原来的主NN改为备用NN。

4.DN(datenode)会同时把信息报告给主从NN。

以上都是主备NN自动切换,基于zookeeper实现;

手动切换:通过命令实现,场景—HDFS升级等场合

5. Hadoop HA架构搭建

使用VmWare模拟多台机器,由于电脑配置有限,只使用三台机器,配置如下:

主机名

IP

内存

磁盘

node-1

192.168.200.10

2G

40G

node-2

192.168.200.20

2G

40G

node-3

192.168.200.30

2G

40G

集群的节点角色分配如下:

Hadoop高可用(Hadoop2.x)_第2张图片

5.1基本环境配置

在三台机器上做如下操作

1.关闭防火墙

2.配置/etc/hosts

3.配置时间同步

4.配置ssh免密码登录(三台机器都要配置)

5.安装JDK并配置环境变量

5.2安装Zookeeper

需要上传zookeeper的安装包

5.2.1解压安装包

tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/

5.2.2配置环境变量

vi /etc/profile

export ZOOKEEPER_HOME=/opt/zookeeper-3.4.10/

export PATH= P A T H : PATH: PATH:ZOOKEEPER_HOME/bin

source /etc/profile

5.2.3修改配置文件

配置文件位于zookeeper安装目录的conf目录

cd /opt/zookeeper-3.4.10/conf/

复制配置文件模板

cp zoo_sample.cfg zoo.cfg

vi zoo.cfg

dataDir=/opt/zookeeper-3.4.10/zkdata

server.1=node-1:2888:3888

server.2=node-2:2888:3888

server.3=node-3:2888:3888

PS:2888为集群之间通信的端口,主要由leader管理,3888是leader选举时使用的端口,2181为客户端提供服务的端口

5.2.4创建存放数据的文件夹

mkdir /opt/zookeeper-3.4.10/zkdata

5.2.5分发安装包到其他节点

scp -r /opt/zookeeper-3.4.10 node-1:/opt/

scp -r /opt/zookeeper-3.4.10 node-2:/opt

4.2.6myid文件

集群中的每台ZK server都会有一个用于唯一标识自己的id,有两个地方会使用到这个id:myid文件和zoo.cfg文件中。myid文件存储在dataDir目录中,指定了当前server的server id。在zoo.cfg文件中,根据server id,配置了每个server的ip和相应端口。Zookeeper启动的时候,读取myid文件中的server id,然后去zoo.cfg 中查找对应的配置

node-1

echo 1 > /opt/zookeeper-3.4.10/zkdata/myid

node-2

echo 2 > /opt/zookeeper-3.4.10/zkdata/myid

node-3

echo 3 > /opt/zookeeper-3.4.10/zkdata/myid

5.3安装Hadoop

使用 sftp 将 Hadoop 的安装包上传到node-1

1.解压

2.配置环境变量

3.修改配置文件

  1. hadoop-env.sh

export JAVA_HOME=/opt/jdk1.8.0_171

  1. core-site.xml

fs.defaultFS

hdfs://hadoop-ha/

hadoop.tmp.dir

/opt/hdfs

ha.zookeeper.quorum

node-1,node-2,node-3

  1. hdfs-site.xml

dfs.nameservices

hadoop-ha

dfs.ha.namenodes.hadoop-ha

nn1,nn2

dfs.namenode.rpc-address.hadoop-ha.nn1

node-1:9000

dfs.namenode.http-address.hadoop-ha.nn1

node-1:50070

dfs.namenode.rpc-address.hadoop-ha.nn2

node-2:9000

dfs.namenode.http-address.hadoop-ha.nn2

node-2:50070

dfs.namenode.name.dir

/opt/hdfs/name

dfs.datanode.data.dir

/opt/hdfs/data

dfs.namenode.shared.edits.dir

qjournal://node-1:8485;node-2:8485;node-3:8485/hadoop-ha

dfs.journalnode.edits.dir

/opt/hdfs/journaldata

dfs.ha.automatic-failover.enabled

true

dfs.client.failover.proxy.provider.hadoop-ha

org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

dfs.ha.fencing.methods

sshfence

shell(/bin/true)

dfs.ha.fencing.ssh.private-key-files

/root/.ssh/id_rsa

dfs.ha.fencing.ssh.connect-timeout

30000

  1. mapred-site.xml

mapreduce.framework.name

yarn

  1. yarn-site.xml

yarn.resourcemanager.ha.enabled

true

yarn.resourcemanager.cluster-id

yrc

yarn.resourcemanager.ha.rm-ids

rm1,rm2

yarn.resourcemanager.hostname.rm1

node-1

yarn.resourcemanager.hostname.rm2

node-3

yarn.resourcemanager.zk-address

node-1:2181,node-2:2181,node-3:2181

yarn.nodemanager.aux-services

mapreduce_shuffle

yarn.resourcemanager.address.rm1

node-1:8032

yarn.resourcemanager.scheduler.address.rm1

node-1:8030

yarn.resourcemanager.webapp.address.rm1

node-1:8088

yarn.resourcemanager.resource-tracker.address.rm1

node-1:8031

yarn.resourcemanager.admin.address.rm1

node-1:8033

yarn.resourcemanager.ha.admin.address.rm1

node-1:23142

yarn.resourcemanager.address.rm2

node-3:8032

yarn.resourcemanager.scheduler.address.rm2

node-3:8030

yarn.resourcemanager.webapp.address.rm2

node-3:8088

yarn.resourcemanager.resource-tracker.address.rm2

node-3:8031

yarn.resourcemanager.admin.address.rm2

node-3:8033

yarn.resourcemanager.ha.admin.address.rm2

node-3:23142

  1. slaves

node-1

node-2

node-3

4.分发安装包

scp -r /opt/hadoop-2.9.0 node-2:/opt

scp -r /opt/hadoop-2.9.0 node-3:/opt

5.启动步骤

高可用的启动和普通的启动方式有很大的区别,一定要按照下面的步骤启动

5.1启动zookeeper集群(三台机器)

zkServer.sh start

5.2手动启动journalnode(三台机器)

hadoop-daemon.sh start journalnode

启动完成后使用jps命令查看进程

5.3格式化Namenode(node-1)

在node-1节点格式化Hadoop集群

hdfs namenode -format

格式化完成后,会在hdfs-site.xml中指定的namenode的元数据存放目录生成对应的元数据文件,需要将元数据文件复制到第二个NameNode的机器的对应目录

scp -r /opt/hdfs/name node-2:/opt/hdfs

5.4格式化ZKFC(node-1)

hdfs zkfc -formatZK

5.5启动集群

在node-1上执行如下命令

start-dfs.sh

start-yarn.sh

分别访问http://192.168.200.10:50070 http://192.168.200.20:50070可以看到一个NameNode是active的状态另一个NameNode是standby的状态

5.6启动另一个ResourceManager

Yran的ResourceManager需要手动启动另一个,根据yarn-site.xml的配置,在node-3节点上启动ResourceManager

yarn-daemon.sh start resourcemanager

5.4测试

1.NameNode的高可用测试

查看NameNode的状态,将active状态的NameNode杀掉,一般会根据启动的顺序决定NameNode的状态,使用kill命令杀掉NameNode进程

使用jps查看进程号

kill -9 (NameNode pid)

可以通过如下命令查看ResourceManager的状态

hdfs haadmin -getServiceState nn1

hdfs haadmin -getServiceState nn2

2.ResourceManager的高可用测试

在访问ResourceManage的时候,如果是standby状态的ReSourcemanage会将链接重定向到active的ResourceManager

可以通过如下命令查看ResourceManager的状态

yarn rmadmin -getServiceState rm1

yarn rmadmin -getServiceState rm1

6.NameNode的联邦机制

通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使得namenode/namespace可以通过增加机器来进行水平扩展。

Hadoop高可用(Hadoop2.x)_第3张图片

能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。

注意:在Hadoop2.x中联邦只支持两个NameNode,在Hadoop3.x中可以支持多个NameNode

联邦的好处

  • 命名空间可伸缩性-联合会添加命名空间水平伸缩。大型部署或使用大量小文件的部署可通过允许将更多的Namenode添加到群集中而受益于命名空间扩展。
  • 性能-文件系统的吞吐量不受单个Namenode的限制。向群集添加更多Namenodes可以扩展文件系统的读/写吞吐量。
  • 隔离-单个Namenode在多用户环境中不提供隔离。例如,一个实验性应用程序可能会使Namenode过载,并降低生产关键型应用程序的速度。通过使用多个Namenode,可以将不同类别的应用程序和用户隔离到不同的名称空间。

你可能感兴趣的:(java,hadoop,大数据,hdfs,搜索引擎,spring)