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
  2. 群起脚本:sbin/hadoop-daemons.sh start journalnode

启动namenode

主节点执行

/bin/hdfs namenode -format

/bin/hdfs --daemon start namenode

其它节点执行

/bin/hdfs namenode -bootstrapStandby

验证

测试HDFS高可用

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

验证YARN高可用

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 组策略 部署打印机

一、服务端 1、打印机管理&#xff1a;添加打印机 2、选择打印机 3、第一次安装&#xff0c;选择这个 4、下载驱动&#xff0c;从磁盘安装 5、已成功安装 6、选中打印机右击属性&#xff1a;列出目录 7、创建一个组策略 8、组策略设置 用户设置 → 首选项 → 控制面板 → 打印…

C++day4 (拷贝构造函数、拷贝赋值函数、匿名对象、友元函数、常成员函数、常对象、运算符重载)

#include <iostream> #include <cstring> using namespace std;class mystring { private:char *str; //记录C风格字符串int size; //记录字符串的实际长度public://无参构造mystring():size(10){strnew char[size];//构造出一个长度为10的字符串strcpy(str,&…

22.代理模式

代理模式 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦…

移动端深度学习部署:TFlite

1.TFlite介绍 &#xff08;1&#xff09;TFlite概念 tflite是谷歌自己的一个轻量级推理库。主要用于移动端。 tflite使用的思路主要是从预训练的模型转换为tflite模型文件&#xff0c;拿到移动端部署。 tflite的源模型可以来自tensorflow的saved model或者frozen model,也可…

初识protobuf

Protobuf 全称Protocol Buffers&#xff08;协议缓冲区&#xff09;&#xff0c;是一种轻量级、高效的数据序列化格式&#xff0c;由Google开发。它被设计用于结构化数据的序列化、反序列化以及数据交换&#xff0c;常用于网络通信和数据存储等领域。 Protobuf使用简洁的消息描…

解决appium-doctor报 bundletool.jar cannot be found

一、下载bundletool.jar 下载地址&#xff1a;https://github.com/google/bundletool/releases 二、重命名 重命名这个jar包为bundletool.jar&#xff0c;在android sdk目录下&#xff0c;新建bundle-tool目录&#xff0c;把bundletool.jar包放入其中。 三、配置环境 path后追加…

re学习(19)[ACTF新生赛2020]easyre1(UPX脱壳)

文章链接&#xff1a;BUUCTF在线评测 参考视频&#xff1a;B站 【新手教程三】小Z带你学习什么是ESP定律和什么是堆栈平衡 &#xff1f; - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn 题解&#xff1a; 工具脱壳 key"*F\"N,\"…

蒲公英打包环境搭建碰到问题

一&#xff1a;证书那边选择手动&#xff0c;不要自动&#xff0c;——》debug配置dev证书&#xff0c;release配置ad-hoc证书 二&#xff1a;证书有时候不生效&#xff0c;删除重新下载。~/Library/MobileDevice/Provisioning Profiles 三&#xff1a;更新测试手机时&#…

# Linux终端控制字符详解以及简单应用实践

Linux终端控制字符详解以及简单应用实践 文章目录 Linux终端控制字符详解以及简单应用实践1 控制字符表2 控制字符 ESC &#xff08;0x1B&#xff0c;^[&#xff09;子参数表3 控制字符 ESC &#xff08;0x1B&#xff0c;^[&#xff09;子参数表 - 字符颜色参照表4 实践&#x…

SpringBoot+JWT实现单点登录解决方案

一、什么是单点登录? 单点登录是一种统一认证和授权机制&#xff0c;指在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的系统&#xff0c;不需要重新登录验证。 单点登录一般用于互相授信的系统&#xff0c;实现单一位置登录&#xff0c;其他信任的…

【JavaEE面试题(九)线程安全问题的原因和解决方案】

多线程-初阶 4. 多线程带来的的风险-线程安全 (重点)4.1 观察线程不安全原因是 1.load 2. add 3. save 4.2 线程安全的概念4.3 线程不安全的原因最根本的是 操作系统对线程的调度是随机的★1. 修改共享数据&#xff08;多个线程修改同一个变量&#xff09;★2. 操作不是原子性★…

EIK+Filebeat+Kafka

目录 Kafka 概述 为什么需要消息队列&#xff08;MQ&#xff09; 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 Partation 数据路由规则&#xff1a; 分区的原因 部署 kafka 集群 1.下载安装包 2.安装 Kafka 修改配…

前端 | (七)浮动 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;浮动介绍&#x1f407;元素浮动后的特点&#x1f407;浮动小练习&#x1f525;盒子1右浮动&#x1f525;盒子1左浮动&#x1f525;所有盒子都浮动&#x1f5…

后端Linux软件安装大全[JDK、Tomcat、MySQL、Irzsz、Git、Maven、Redis...持续更新中]

文章目录 前言1.软件安装方式2.安装jdk3.安装Tomcat4.安装MySQL5.安装lrzsz6. 安装Git7. 安装Maven8. 安装Redis 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的…

Vue第三篇:最简单的vue购物车示例

本文参考&#xff1a;Vue Cli&#xff08;脚手架&#xff09;实现购物车小案例 - - php中文网博客 效果图&#xff1a; 编写流程&#xff1a; 1、首先通过vue/cli创建工程 vue create totalprice 2、改写App.vue代码如下&#xff1a; <template><div><div v…

【深度学习笔记】训练 / 验证 / 测试集

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

【电路原理学习笔记】第3章:欧姆定律:3.1 电压、电流与电阻的关系

第3章&#xff1a;欧姆定律 3.1 电压、电流与电阻的关系 欧姆定律指出&#xff1a;电流与电压成正比&#xff0c;与电阻成反比。即 I V R I\frac{V}{R} IRV​ 3.1.1 电压与电流之间的线性关系 数学上&#xff0c;线性指的是变量之间的关系在图形上是一条直线。线性方程所对…

ChatGPT 最佳实践指南之:系统地测试变化

Test changes systematically 系统地测试变化 Improving performance is easier if you can measure it. In some cases a modification to a prompt will achieve better performance on a few isolated examples but lead to worse overall performance on a more representa…

分布式运用——存储系统Ceph

分布式运用——存储系统Ceph 一、Ceph 介绍1.Ceph 简介2、存储基础2.1 单机存储设备2.2 单机存储的问题2.3 商业存储解决方案2.4 分布式存储&#xff08;软件定义的存储 SDS&#xff09;2.5 分布式存储的类型 3.Ceph 优势3.1 高扩展性3.2 高可靠性3.3 高性能3.4 功能强大 4.Cep…

pwm呼吸灯

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …