(Hadoop)Hadoop高可用

标签: 大学  # hadoop

hadoop2.0的改进与提升

组件 Hadoop1.0局限和不足 Hadoop2.0的改进
HDFS NameNode存在单点故障风险 HDFS引入了高可用机制
MapReduce JobTracker存在单点故障风险,且内存扩展受限 引入了一个资源管理调度框架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结尾的。
    在这里插入图片描述
版权声明:本文为Python1One原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Python1One/article/details/106234863

智能推荐

Python学习练习6----列表、字典的运用2

range 用法参见http://blog.csdn.net/chiclewu/article/details/50592368 直接在 在线编程工具中练习: https://www.tutorialspoint.com/execute_python_online.php 代码如下,增加range、列表的len()、字典的items()函数,for 函数也有了新变化 练习2: 2的运行结果,注意p...

PoolThreadCache

缓存构成   PoolThreadCache的缓存由三部分构成:tiny、small 和 normal。 tiny   缓存数据大小区间为[16B, 496B]数据,数组长度为32,根据数据大小计算索引的办法:数据大小除以16,如下代码所示: small   缓存数据大小区间为[512B, 4KB]数据,数组长度为4,根据数据大小计算索引的办法:数据大小除以512,然后log2得到指数,如下代码所...

Intellij IDEA 搭建Spring Boot项目(一)

Intellij IDEA 搭建Spring Boot项目 标签(空格分隔): SpringBoot JAVA后台 第一步 选择File –> New –> Project –>Spring Initialer –> 点击Next  第二步 自己修改 Group 和 Artif...

CentOS学习之路1-wget下载安装配置

参考1: https://blog.csdn.net/zhaoyanjun6/article/details/79108129 参考2: http://www.souvc.com/?p=1569 CentOS学习之路1-wget下载安装配置 1.wget的安装与基本使用 安装wget yum 安装软件 默认安装保存在/var/cache/yum ,用于所有用户使用。 帮助命令 基本用法 例子:下载...

深入浅出Spring的IOC容器,对Spring的IOC容器源码进行深入理解

文章目录 DispatcherServlet整体继承图 入口:DispatcherServlet.init() HttpServletBean.init() FrameworkServlet.initServletBean() 首先大家,去看Spring的源码入口,第一个就是DispatcherServlet DispatcherServlet整体继承图 入口:DispatcherServlet....

猜你喜欢

laravel框架的课堂知识点概总

1. MVC 1.1 概念理解 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑 MVC 是一种使用 MVC(Model View Controller ...

Unity人物角色动画系统学习总结

使用动画系统控制人物行走、转向、翻墙、滑行、拾取木头 混合树用来混合多个动画 MatchTarget用来匹配翻墙贴合墙上的某一点,人物以此为支点翻墙跳跃 IK动画类似于MatchTarget,控制两只手上的两个点来指定手的旋转和位置,使得拾取木头时更逼真 创建AnimatorController: 首先创建一个混合树,然后双击 可以看到该混合树有五种状态机,分别是Idle、WalkForward、...

Composer 安装 ThinkPHP6 问题

Composer 安装 ThinkPHP6 问题 先说说问题 一.运行环境要求 二.配置 参考: ThinkPHP6.0完全开发手册 先说说问题 执行ThinkPHP6的安装命令 遇到问题汇总如下: 看提示是要更新版本,执行命令更新。 更新之后,再次安装ThinkPHP,之后遇到如下问题。 尝试了很多方法,依然不能解决。其中包括使用https://packagist.phpcomposer.com...

Spring Boot 整合JDBC

今天主要讲解一下SpringBoot如何整合JDBC,没啥理论好说的,直接上代码,看项目整体结构 看一下对应的pom.xml 定义User.java 定义数据源配置,这里使用druid,所以需要写一个配置类 上面指定druid的属性配置,和用户登录的账号信息以及对应的过滤规则: 下面定义数据访问接口和对应的实现: 数据访问层很简单,直接注入JdbcTemplate模板即可,下面再看对应的servi...

html鼠标悬停显示样式

1.显示小手:     在style中添加cursor:pointer 实现鼠标悬停变成小手样式     实例:         其他参数: cursor语法: cursor : auto | crosshair | default | hand | move | help | wait | tex...