(Hadoop)Hadoop高可用

hadoop2.0的改进与提升

组件Hadoop1.0局限和不足Hadoop2.0的改进
HDFSNameNode存在单点故障风险HDFS引入了高可用机制
MapReduceJobTracker存在单点故障风险,且内存扩展受限引入了一个资源管理调度框架YARN

Yarn资源管理框架

Yarn体系结构

YARN(Yet Another Resource Negotiator,另一种资源协调者)是一个通用资源管理系统和调度平台,它的基本设计思想是将MRv1(Hadoop1.0中MapReduce)中的JobTracker拆分为两个独立任务,这两个任务分别是全局的资源管理器ResourceManager和每个应用程序特有的ApplicationMaster。

体系结构

在这里插入图片描述

  1. ResourceManager
    是全局资源管理系统,负责整个YARN集群资源的监控、分配、管理工作
  2. NodeManager
    是每个节点上的资源和任务管理器,一方面,他会定时向ResourceManager虎豹所在节点资源状况;另一方面,他会接受并处理ApplicationMaster容器启动、停止等各种请求
  3. ApplicationMaster
    是一个全局资源管理系统,它负责的是整个Yarn集群资源的监控、分配和管理工作。用户提交的每个应用程序都包含一个ApplicationMaster,它负责协调来自ResourceManager的资源,把获得的资源进一步分配给内部的各个任务,从而实现“二次分配”。

YARN工作流程

YARN的底层工作流程是由核心组件互相协调管理,它们各尽其职,为Hadoop资源调度提供服务,其工作流程图如下所示。
在这里插入图片描述

  1. 用户通过客户端Client向YARN提交应用程序Applicastion
  2. YARN中的ResourceManager接收到客户端请求后,内部的调度器会为应用程序分配一个容器运行本次程序对应的ApplicationMaster
  3. ApplicationMaster被创建后,首先向ResourceManager注册信息,用户通过ResourceManager查看应用程序的运行状态
  4. ApplicationMaster采用轮询方式通过RPC协议向ResourceManager申请资源
  5. ResourceManager向提出申请资源的ApplicationMaster提供资源
  6. NodeManager为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行改脚本启动任务
  7. 个任务通过RPC协议向ApplicationMaster汇报自己的运行状态,在任务运行失败时,ApplicationMaster可以重启新任务
  8. 应用过运行结束后,ApplicationMaster向ResourceManager注销并关闭自己

HDFS的高可用

HDFS的高可用框架

  • HDFS分布式文件系统中NameNode是系统核心节点,存储各类元数据信息,并负责管理文件系统的命名空间和客户端对文件的访问。若NameNode发生故障,会导致整个Hadoop集群不可用,即单点故障问题。为了解决单点故障,Hadoop2.0中HDFS中增加了对高可用的支持。

  • 在高可用HDFS中,通常有两台或两台以上机器充当NameNode,无论何时,都要保证至少有一台处于活动(Active)状态,一台处于备用(Standby)状态。Zookeeper为HDFS集群提供自动故障转移的服务,给每个NameNode都分配一个故障恢复控制器(简称ZKFC),用于监控NameNode状态。若NameNode发生故障,Zookeeper通知备用NameNode启动,使其成为活动状态处理客户端请求,从而实现高可用。

  • HDFS的高可用框架
    在这里插入图片描述

搭建Hadoop高可用集群

部署集群节点

在这里插入图片描述

环境准备

搭建普通Hadoop集群(参考第2章完成即可)。需要注意的是,原有虚拟机系统主机名为hadoop01,建议初学者在搭建Hadoop HA集群时重新安装虚拟机,以此来巩固前面所学知识,并将三台虚拟主机名设置为node-01、node-02和node-03。

配置Hadoop高可用集群

  • 若使用新主机续配置Zookeeper,zookeeper/conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.

<!-- 这里的路径需要创建并且在zkdata下有个myid文件,标注了自己是几号机与下方的server.x中的x相同,分发时需逐个修改 -->
dataDir=/export/data/zookeeper/zkdata
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

<!-- 修改下面 -->
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
  1. 修改hadoop/etc/hadoop下的core-site.xml
<?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>
		<!--指定HDFS的nameservice为ns1 -->
    	<name>fs.defaultFS</name>
    	<value>hdfs://ns1</value>
	</property>

	<property>
		<!-- 指定Hadoop的临时目录,不需要手动创建 -->
    	<name>hadoop.tmp.dir</name>
    	<value>/var/zcx/hadoop/tmp</value>
	</property>
	
	<property>
		<!-- 指定Zookeeper地址 -->
        <name>ha.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>
    </property>

	<!-- 一下为连接超时所需配置,可以不配置 -->
	<property>
   		<name>ipc.client.connect.max.retries</name>
    	<value>20</value>
  	</property>
  
  	<property>
   		<name>ipc.client.connect.retry.interval</name>
    	<value>5000</value>
	</property>
</configuration>
  1. 修改hdfs-site.xml文件,配置NameNode端口和通信方式,并指定元数据存放位置及开启失败自动切换服务,配置隔离机制方法
<?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>
    
    <property>
    	<!-- 设置NameNode.name的目录,不需手动创建 -->
        <name>dfs.namenode.name.dir</name>
        <value>file:/export/data/hadoop/name</value>   
    </property>
	
    <property>
    	<!-- 设置NameNode.data的目录,不需手动创建 -->
        <name>dfs.namenode.data</name>
        <value>file:/export/data/hadoop/data</value>
    </property>
    
	<property>
		<!-- 开启WebHDFS -->
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
        <!-- 在NN和DN上开启WebHDFS(REST API)功能,不是必须 -->
    </property>

	<property>
		<!-- 指定HDFS的nameserver为ns1,需要和core-site.xml中保持一致 -->
        <name>dfs.nameservices</name>
        <value>ns1</value>
    </property>

	<property>
		<!-- ns1下有两个NameNode分别是nn1,nn2 -->
        <name>dfs.ha.namenodes.ns1</name>
        <value>nn1,nn2</value>
    </property>

	<property>
		<!-- nn1的RPC通信地址 -->
        <name>dfs.namenode.rpc-address.ns1.nn1</name>
        <value>node1:9000</value>
    </property>

	<property>
		<!-- nn1的http通信地址 -->
        <name>dfs.namenode.http-address.ns1.nn1</name>
        <value>node1:50070</value>
    </property>

	<property>
		<!-- nn2的RPC通信地址 -->
        <name>dfs.namenode.rpc-address.ns1.nn2</name>
        <value>node2:9000</value>
    </property>
	
	<property>
		<!-- nn2的http通信地址 -->
        <name>dfs.namenode.http-address.ns1.nn2</name>
        <value>node2:50070</value>
    </property>

	<property>
		<!-- 指定NameNode的元数据在JournalNode上的存放为止 -->
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node1:8485;node2:8485;node3:8485/ns1</value>
    </property>
    
	<property>
		<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
        <name>dfs.journalnode.edits.dir</name>
        <value>/export/data/hadoop/journaldata</value>
    </property>
    
	<property>
		<!-- 开启NameNode失败自动切换 -->
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
   	</property>
   	
	<property>
		<!-- 配置失败自动切换的实现方式 -->
        <name>dfs.client.failover.proxy.provider.nsl</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>

	<property>
		<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>

	<property>
		<!-- 配置sshfence隔离机制超时时间 -->
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>

</configuration>
  1. 修改mapred-site.xml文件,配置MapReduce计算框架为YRAN方式
<configuration>
	<property>
		<!-- 指定MapReduce的框架为yarn -->
        <name>mapreduce.framework</name>
        <value>yarn</value>
    </property>
</configuration>

  1. 修改yarn-site.xml文件,开启ResourceManager高可用,指定ResourceManager的端口名称地址,并配置Zookeeper集群地址
<configuration>

	<property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value>
    </property>
    
	<property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>2048</value>
    </property>
    
	<property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>1</value>
    </property>

	<property>
		<!-- 开启ResourceManager高可用 -->
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

	<property>
		<!-- 指定ResourceManager的cluster-id -->
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</value>
    </property>

	<property>
		<!-- 指定ResourceManager的名字 -->
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

	<property>
		<!-- 分别指定ResourceManager的地址 -->
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>node1</value>
    </property>

	<property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>node2</value>
    </property>

	<property>
		<!-- 指定Zookeeper集群地址 -->
        <name>yarn.resourcemanager.zk-address</name>
        <value>node1:2181,node2:2181,node3:2181</value>
    </property>

	<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

</configuration>
  1. 修改slaves,配置集群主机名称
<!-- 集群的主机叫什么就写什么 -->
node1
node2
node3
  1. 修改hadoop-env.sh配置JDK环境变量
export JAVA_HOME=/export/servers/jdk1.8.0_161

将配置好的文件分发给node2和node3。

启动Hadoop高可用集群

  1. 启动各个节点的Zookeeper服务
# 需要每台机器都输入
zkServer.sh start
# 启动完毕后查看一下
zkServer.sh status
# 关闭Zookeeper
zkServer.sh stop

在这里插入图片描述

  1. 启动集群各个节点监控NameNode的管理日志的JournalNode
# 需要每台机器都输入
hadoop-daemon.sh start journalnode
  1. 在node1节点格式化NameNode,并将格式化后的目录复制到node2中
# 格式化
hadoop namenode -format
# 将/export/data/hadoop文件发给node2
scp -r /export/data/hadoop node2:/export/data/
  1. 在node1节点格式化ZKFC
hdfs zkfc -formatZK
  1. 在node1上启动HDFS
start-dfs.sh
  1. 在node1节点启动yarn
start-yarn.sh

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

进程缺失,报错寻找方法

  • hadoop日志文件在:*/hadoop/logs下以.log结尾的。哪个没启动找哪个日志文件然后百度。

在这里插入图片描述

  • Zookeeper日志文件在*/data/zookeeper/zkdata下以.out结尾的。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值