Hadoop: High Available

序言

  • 在Hadoop 2.X以前的版本,NameNode面临单点故障风险(SPOF),也就是说,一旦NameNode节点挂了,整个集群就不可用了,而且需要借助辅助NameNode来手工干预重启集群,这将延长集群的停机时间。
  • Hadoop 2.X版本只支持一个备用节点用于自动恢复NameNode故障,即HDFS 支持一主一备的架构
  • Hadoop 3.X版本则支持多个备用NameNode节点,最多支持 5 个,官方推荐使用 3 个

基于Hadoop3.x. 总的来说就是要借助Zookeeper来实现高可用,然后就是编辑Hadoop的配置文件已实现高可用cuiyaonan2000@163.com

High Available Of HDFS

总体架构图如下所示

Hadoop 实现自动故障切换需要用到下面的组件:

  • ZooKeeper
  • ZKFailoverController 进程(ZKFC)

ZooKeeper 

ZooKeeper quorum 是一种集中式服务,主要为分布式应用提供协调、配置、命名空间等功能。它提供组服务和数据同步服务,它让客户端可以实时感知数据的更改,并跟踪客户端故障。HDFS故障自动切换的实现依赖下面两个方面:

  • 故障监测:ZooKeeper维护一个和NameNode之间的会话。如果NameNode发生故障,该会话就会过期,会话一旦失效了,ZooKeeper将通知其他NameNode启动故障切换进程。

  • 活动NameNode选举:ZooKeeper提供了一种活动节点选举机制。只要活动的NameNode发生故障失效了,其他NameNode将从ZooKeeper获取一个排它锁,并把自身声明为活动的NameNode。

ZKFailoverController(ZKFC)

ZKFC 是 ZooKeeper 的监控和管理 namenode 的一个客户端。所以每个运行 namenode 的机器上都会有 ZKFC。

那ZKFC具体作用是什么?主要有以下3点:

状态监控:ZKFC 会定期用 ping 命令监测活动的 NameNode,如果 NameNode 不能及时响应ping 命令,那么 ZooKeeper 就会判断该活动的 NameNode 已经发生故障了。

ZooKeeper会话管理:如果 NameNode 是正常的,那么它和 ZooKeeper 会保持一个会话,并持有一个 znode 锁。如果会话失效了,那么该锁将自动释放。

基于ZooKeeper的选举:如果 NameNode 是正常的,ZKFC 知道当前没有其他节点持有 znode 锁,那么 ZKFC 自己会试图获取该锁,如果锁获取成功,那么它将赢得选举,并负责故障切换工作。这里的故障切换过程其实和手动故障切换过程是类似的;先把之前活动的节点进行隔离,然后把 ZKFC 所在的机器变成活动的节点。

要求

  • 如此来讲NameNode之间不会有直接的交互,NameNode只通过ZKFC跟ZooKeeper连接,以此来保证可用性,
  • 各个NameNode会实时监控JournalNode,查看是否有新的变化,如果有就自动更新到自己的环境中,以此来保证一致性.cuiyaonan2000@163.com

NameNode服务器:运行NameNode的服务器应该有相同的硬件配置

JournalNode服务器:运行的JournalNode进程非常轻量,可以部署在其他的服务器上。注意:必须允许至少3个节点。当然可以运行更多,但是必须是奇数个,如3、5、7、9个等等。

当运行N个节点时,系统可以容忍至少(N-1)/2(N至少为3)个节点失败而不影响正常运行。

在HA集群中,standby状态的NameNode可以完成checkpoint操作,因此没必要配置Secondary NameNode、CheckpointNode、BackupNode。如果真的配置了,还会报错。

配置

core-site.xml

 <!-- 指定 NameNode 的地址 单节点<property><name>fs.defaultFS</name><value>hdfs://centos1:8020</value></property>--><!-- Namenode高可用配置-自定义集群名称,且不用指定端口号 --><property><name>fs.defaultFS</name><value>hdfs://mycluster</value></property><!-- 指定 hadoop 数据的存储目录,最大的作用就是可以被其他地方引用这个公用的开头路径,比如hdfs.xml中就用到了 --><property><name>hadoop.tmp.dir</name><value>/opt/hadoop3.2/data</value></property><!-- 配置ZKFC进程连接zookeeper的地址 --><property><name>ha.zookeeper.quorum</name><value>centos1:2181,centos2:2181,centos3:2181</value></property><!--如下的内容可以不用配置cuiyaonan2000@163.com --><!-- 配置 HDFS 网页登录使用的静态用户为 bigdata --><property><name>hadoop.http.staticuser.user</name><value>bigdata</value></property><!--置超级代理--><property><name>hadoop.proxyuser.bigdata.hosts</name><value>*</value></property><property><name>hadoop.proxyuser.bigdata.groups</name><value>*</value></property>

hdfs-site.xml

 <!--nn web 端访问地址
<property>
<name>dfs.namenode.http-address</name>
<value>centos1:9870</value>
</property>
2nn web 端访问地址
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>centos3:9868</value>
</property>--><!-- namenode服务逻辑id ,注意跟core.xml中的名称要一致--><property><name>dfs.nameservices</name><value>mycluster</value></property><!-- namenode服务mycluster下3个节点 --><property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2,nn3</value></property><!-- 节点通讯地址 --><property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>centos1:8020</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>centos2:8020</value></property><property><name>dfs.namenode.rpc-address.mycluster.nn3</name><value>centos3:8020</value></property><!-- web ui地址 --><property><name>dfs.namenode.http-address.mycluster.nn1</name><value>centos1:9870</value></property><property><name>dfs.namenode.http-address.mycluster.nn2</name><value>centos2:9870</value></property><property><name>dfs.namenode.http-address.mycluster.nn3</name><value>centos3:9870</value></property><!-- 指定NameNode元数据在JournalNode上的存放位置 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://centos1:8485;centos2:8485;centos3:8485/mycluster</value></property><!--  the Java class that HDFS clients use to contact the Active NameNode -->
<!-- 
这个属性Hadoop提供了两种自带的实现:ConfiguredFailoverProxyProvider 和RequestHedgingProxyProvider
ConfiguredFailoverProxyProvider :表示按照配置去找启动的namenode
RequestHedgingProxyProvider: 首先会并发的向每个NN发送请求来判定哪个是ANN,然后接下来的请求就直接向ANN发送请求。--><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><value>shell(/bin/true)</value></property><!-- 使用隔离机制时需要ssh无秘钥登录--><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/root/.ssh/id_rsa</value></property><property><name>dfs.ha.nn.not-become-active-in-safemode</name><value>true</value></property><!-- 故障情况自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><!-- Namenode 数据存储目录--><property><name>dfs.namenode.name.dir</name><value>${hadoop.tmp.dir}/name</value></property><!-- Datanode 数据存储目录--><property><name>dfs.namenode.data.dir</name><value>${hadoop.tmp.dir}/data</value></property><!-- journalnode 数据存储目录--><property><name>dfs.journalnode.edits.dir</name><value>${hadoop.tmp.dir}/jn</value></property>

yarn-site.xml

yarn也支持高可用,同时依赖于zookeeper

 <!-- 指定 ResourceManager 的地址 单节点 --><!--
<property>
<name>yarn.resourcemanager.hostname</name>
<value>centos2</value>
</property>
-->  <!-- 指定 MR 走 shuffle --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 环境变量的继承  这段我觉得可以不用弄--><property><name>yarn.nodemanager.env-whitelist</name><value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value></property><!-- hadoop classpath输出以下路径  这段我觉得可以不用弄 --><property><name>yarn.application.classpath</name><value>/opt/hadoop3.2/etc/hadoop:/opt/hadoop3.2/share/hadoop/common/lib/*:/opt/hadoop3.2/share/hadoop/common/*:/opt/hadoop3.2/share/hadoop/hdfs:/opt/hadoop3.2/share/hadoop/hdfs/lib/*:/opt/hadoop3.2/share/hadoop/hdfs/*:/opt/hadoop3.2/share/hadoop/mapreduce/lib/*:/opt/hadoop3.2/share/hadoop/mapreduce/*:/opt/hadoop3.2/share/hadoop/yarn:/opt/hadoop3.2/share/hadoop/yarn/lib/*:/opt/hadoop3.2/share/hadoop/yarn/*</value></property><!-- 开启resourcemanager HA--><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- 自定义一个resourcemanager的逻辑集群id--><property><name>yarn.resourcemanager.cluster-id</name><value>yarn-cluster</value></property><!-- 指定resourcemanager集群的逻辑节点名称列表--><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2,rm3</value></property><!-- rm1的节点信息--><property><name>yarn.resourcemanager.hostname.rm1</name><value>centos1</value></property><!-- yarn web页面地址  --><property><name>yarn.resourcemanager.webapp.address.rm1</name><value>centos1:8088</value></property><!-- rm1 对客户端暴露的地址,客户端通过该地址向RM提交任务等 --><property><name>yarn.resourcemanager.address.rm1</name><value>centos1:8032</value></property><!-- rm1 与 applicationMaster的通信地址  --><property><name>yarn.resourcemanager.scheduler.address.rm1</name><value>centos1:8030</value></property><!-- rm1 与 nm的通信地址  --><property><name>yarn.resourcemanager.resource-tracker.address.rm1</name><value>centos1:8031</value></property><!-- rm2的节点信息--><property><name>yarn.resourcemanager.hostname.rm2</name><value>centos2</value></property><!-- yarn web页面地址  --><property><name>yarn.resourcemanager.webapp.address.rm2</name><value>centos2:8088</value></property><!-- rm2 对客户端暴露的地址,客户端通过该地址向RM提交任务等 --><property><name>yarn.resourcemanager.address.rm2</name><value>centos2:8032</value></property><!-- rm2 与 applicationMaster的通信地址  --><property><name>yarn.resourcemanager.scheduler.address.rm2</name><value>centos2:8030</value></property><!-- rm2 与 nm的通信地址  --><property><name>yarn.resourcemanager.resource-tracker.address.rm2</name><value>centos2:8031</value></property><!-- rm3的节点信息--><property><name>yarn.resourcemanager.hostname.rm3</name><value>centos3</value></property><!-- yarn web页面地址  --><property><name>yarn.resourcemanager.webapp.address.rm3</name><value>centos3:8088</value></property><property><name>yarn.resourcemanager.address.rm3</name><value>centos3:8032</value></property><!-- rm3 与 applicationMaster的通信地址  --><property><name>yarn.resourcemanager.scheduler.address.rm3</name><value>centos3:8030</value></property><!-- rm3 与 nm的通信地址  --><property><name>yarn.resourcemanager.resource-tracker.address.rm3</name><value>centos3:8031</value></property><!-- 配置zookeeper信息  --><property><name>yarn.resourcemanager.zk-address</name><value>centos1:2181,centos2:2181,centos3:2181</value></property><!-- 启动自动恢复 --><property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><!-- 配置将recourcemanager的状态信息存储在zookeeper中 --><property><name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><!-- 开启日志聚集功能 --><property><name>yarn.log-aggregation-enable</name><value>true</value></property><!-- 设置日志聚集服务器地址 --><property><name>yarn.log.server.url</name><value>http://centos1:19888/jobhistory/logs</value></property><!-- 设置日志保留时间为 7 天 --><property><name>yarn.log-aggregation.retain-seconds</name><value>604800</value></property>

mapred-site.xml

这个配置文件没什么变动

 <!-- 指定 MapReduce 程序运行在 Yarn 上 --><property><name>mapreduce.framework.name</name><value>yarn</value></property><!-- 历史服务器端地址 --><property><name>mapreduce.jobhistory.address</name><value>centos1:10020</value></property><!-- 历史服务器 web 端地址 --><property><name>mapreduce.jobhistory.webapp.address</name><value>centos1:19888</value></property>

workers------从主节点上启动,会去启动这里面包含的子节点。

这里增加工作节点的ip或者机器名,如:

centos1
centos2
centos3

启动

启动zookeeper集群

初始化ZKFC

ZKFC用于监控active namenode节点是否挂掉,通知其它节点上的ZKFC强行杀死自己ZKFC节点上的namenode(防止其假死状态产生集群namenode脑裂的发生),然后选举出其他namenode为active节点。首次在主节点执行

初始化 HA 在 Zookeeper 中状态:bin/hdfs zkfc -formatZK

启动journalnode进程

  1. 每个节点执行:${HADOOP_HOME}/bin/hdfs --daemon start journalnode (如果是使用start-dfs.sh 启动 则该进程也会自动启动)

启动namenode

主节点执行

  1. /bin/hdfs namenode -format   //另把格式化后的namenode目录下测current复制到其它机器上cuiyaonan2000@163.com
  2. /sbin/start-dfs.sh   //一键启动所有服务,另网上有种启动方式使用了命令hdfs namenode -bootstrapStandby 这种方式是 不需要zookeeper手动实现的
     

验证

测试HDFS高可用

主节点jps

 从节点jps

启动节点

 备用节点

kill -9 active namenode进程,查看页面状态,可发现另外某个namenode自动切换成active状态。

验证YARN高可用

访问任意resourcemanager节点的8088都会跳转到固定的一个resourcemanager节点上,说明高可用配置成功。

比如 101被选为了主启动的resource 

则访问100时会自动跳到101(如下hadoop1 就是101) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4984.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python学习笔记-Windows下VirtualEnv+VSCode中虚拟环境配置

1 VirtualEnv简介 VirtualEnv是一个虚拟化环境&#xff0c;是独立开的开发环境&#xff0c;在一个文件夹中创建的独立虚拟环境&#xff0c;可以分隔开不同项目&#xff0c;开发互不影响。 优点如下&#xff1a; 使不同的应用开发环境独立&#xff0c;避免互相干扰环境升级不…

RxSwift 使用方式

背景 最近项目业务&#xff0c;所有模块已经支持Swift混编开发&#xff0c;正在逐步使用Swift 方式进行开发新业务&#xff0c;以及逐步替换老业务方式进行发展&#xff0c;所以使用一些较为成熟的Swift 的三方库&#xff0c;成为必要性&#xff0c;经过调研发现RxSwift 在使用…

lvs使用

1.前言 LVS&#xff08;Linux Virtual Server&#xff09;是一个基于 Linux 内核的负载均衡器&#xff0c;用于分发网络流量和将请求转发给后端服务器。LVS 提供了多种负载均衡算法和转发模式&#xff0c;以满足不同场景和需求的负载均衡需求&#xff0c;在LVS中定义虚拟服务的…

制作Visual Studio离线安装包

vs2015之后官网就不提供离线安装包了&#xff0c;使用离线安装包就需要自己手动制作一个&#xff1b; 以vs2019为例&#xff1a; 先去官网下载在线安装器 官网下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 展开2019的标签…

【C语言】深剖数据在内存中的存储

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在回炉重造C语言&#xff08;2023暑假&#xff09; ✈️专栏&#xff1a;【C语言航路】 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你…

初识react

初识react 第一步就给我出个问题版本太低 https://www.cnblogs.com/gslgb/p/16585233.html https://blog.csdn.net/xiangshiyufengzhong/article/details/124193898 第二个问题 便利生成dom 需要绑定key 不要总想着加冒号这不是vue 第三个问题 我p标签包裹 MapList组件 MapLis…

Redis相关配置(3)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…

创意网页模板免费下载,让你的网站与众不同!

今天给大家带来的网站模板素材&#xff0c;网站类型丰富&#xff0c;包含户外旅行、餐饮、个人网站等等&#xff0c;可以学习和参考其中的布局排版和配色。 ⬇⬇⬇点击获取更多设计资源 https://js.design/community?categorydesign&sourcecsdn&planbbqcsdn772 1、设…

【1++的C++初阶】之vector

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;什么是vector?二&#xff0c;构造与析构三&#xff0c;vector迭代器的实现四&#xff0c;vector部分重要接口的实现 一&#xff0c;什么是vector? vector…

使用NVIDIA FX Composer验证多纹理合成效果

最近项目上有一个需求&#xff0c;需要将4张带透明通道纹理合成为一张&#xff0c;并且每张纹理指定一个全局透明度。由于纹理过多&#xff0c;合成效果无法保证&#xff0c;为了减少项目的风险&#xff0c;领导希望我先快速验证一下我们讨论的方法是否能完成项目的要求。因此我…

销售易的12年与七个瞬间

导读&#xff1a;企业级没有捷径 12年对一家企业意味着什么&#xff1f; 在消费互联网领域&#xff0c;12年足够长&#xff0c;短短几年内上市的故事过去屡见不鲜。在企业服务的toB领域&#xff0c;产业成熟和企业发展的时间维度被拉长&#xff0c;但故事同样精彩。 2023年7月1…

ylb-接口5产品详情

总览&#xff1a; 1、service处理&#xff08;根据产品id &#xff0c;查询产品信息&#xff09; 在api模块下service包&#xff0c;ProductService接口添加新方法&#xff08;根据产品id &#xff0c;查询产品信息queryById(Integer id)&#xff09;&#xff1a; package …

Python venv 和 virtualenv 虚拟环境的基本使用

1.前言 venv 和 virtualenv 都是搭建虚拟环境的工具&#xff0c;virtualenv 是第三方开源的&#xff0c;而 venv 作为 virtualenv 的一个子集自 Python3.3 开始集成到标准库中&#xff0c;在 virtualenv 的文档中可以看到他们的区别&#xff1a; 没有 app-data 种子方法&#…

Python爬虫——urllib_post请求百度翻译

post请求&#xff1a; post的请求参数&#xff0c;是不会拼接在url后面的&#xff0c;而是需要放在请求对象定制的参数中 post请求的参数需要进行两次编码&#xff0c;第一次urlencode&#xff1a;对字典参数进行Unicode编码转成字符串&#xff0c;第二次encode&#xff1a;将字…

isaac sim添加孔网格

isaac sim仿真和其它仿真实际上一样&#xff0c;对于孔的仿真&#xff0c;是没那么简单的 在此记录一下踩过的坑 1&#xff0c;首先&#xff0c;你需要在soildworks中将你的孔画出来&#xff0c;并导出stl 2&#xff0c;你可以在win10中使用3D画图查看孔的网格&#xff0c;看…

【css】用css样式快速写右上角badge徽标,颜色设置为渐变色

先看效果展示&#xff0c;已公开显示在图片卡片的右上角。 首先是dom代码&#xff1a;需要两个view或者div&#xff0c;public-badge是“已公开”那个矩形&#xff0c;show-signal是右边那个下三角&#xff0c;也就是阴影部分&#xff0c;这样看起来比较有立体感。 <view…

虚拟化技术及实时虚拟化概述

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;未经本人同意&#xff0c;禁止转载。如有问题&#xff0c;欢迎指正。博客地址&#xff1a;https://www.cnblogs.com/wsg1100/ 文章目录 一、前言二、分时系统三、虚拟化介绍四、虚拟化实现方式及分类模拟器Type2虚拟化…

欧姆龙PLC联网

一、设备信息确认 左上角的为PLC型号,如图该PLC型号为CP1H,不同型号的欧姆龙PLC通讯方面有什么差别呢? 通讯能力和方式不同: 有些型号PLC自带网口,有些则需要扩展(上图中右侧的两个红框内为后扩展的通讯口,扩展模块可以随意组合双网口,双232串口,双485串口都可以)…

JDBC编程连接MySQL数据库遇到的两个错误

在进行java与MySQL数据库进行连接的时候我遇到了两个报错&#xff0c;在一开始的时候遇到的报错是Access denied for user yulinlocalhost (using password: YES)&#xff0c;此时我在网络上搜索发现是密码出现错误的问题&#xff08;出现该问题确实是密码错误&#xff09;&…

【DevOps】Atlassian插件开发指南

本文以Bamboo插件开发为例&#xff0c;记录一下插件开发过程。 一、简介 Atlassian Bamboo 6.9.1 是一款持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;支持使用插件扩展其功能。如果需要开发自己的 Bamboo 插件并添加到 Bamboo 中&#xff0c;则可以参考…