hadoop HA (高可用 high available)的搭建

2024-08-29 05:08

本文主要是介绍hadoop HA (高可用 high available)的搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

hadoop HA 的搭建

    • hadoop HA 需求来源
        • 为什么要搭建hadoop HA?
        • 如何实现高可用?
        • 如何写入zookeeper数据?
    • hadoop HA 的搭建:
        • 搭建准备
        • 开始搭建
        • 启动集群

hadoop HA 需求来源

为什么要搭建hadoop HA?

在hadoop 2.0之前,整个hdfs集群中只有一个nn,所以一旦nn节点宕机,则整个集群无法使用。这种现象称为单点故障。
解决办法: 设置2个namenode
在hadoop2.0之前,一个集群只能有一个nn,2.0可以设计2个nn,3.0可以支持多个nn。

在hadoop 2.0里,设计的2个nn,在同一时间,只有一个namenode对外提供服务,将这个称为 active namenode;另一个处于热备份状态,叫 standby namenode。一旦active namenode 宕机的时候,standby namenode 就立即无缝切换为 active namenode。 对于客户端来说,觉得集群是24小时都处于对外服务状态。 不过,宕机的namenode即使复活了,也只能做 standby 了。

Active namenode:
只能有一个,正在活跃的,处理dn,客户端等。
Standby namenode:
Active nomenode的热备。
hadoop HA 原理
如何实现高可用?

要想实现高可用,必须保证:

  • 1)active 和 standby 的元数据,必须实时保持一致性
    namenode的元数据,核心的有两部分:
    • 1.1)fsimage:磁盘元数据文件 (初始化的fsimage文件 (hdfs格式化时自己生成) + edits 定期合并而来)
      所以 active 和 standby 要保持一致,只需要保证初始化的 fsimage 和 edits 保持一致即可。

      • 1.1.1)初始化的 fsimage 文件保持一致
        将这个初始化的 fsimage 文件发送给另一个namenode就可以了。
      • 1.1.2)保证 edits 文件保持一致
        edits文件是持续性产生的,所以保证active 和 standby 的一致性,核心是保证active 和 standby 的 edits 文件实时一致即可。 active 将 edits 文件 存入 QJM 平台,standby 会时刻监听 QJM 平台 edits 文件的更新,一旦有更新,standby 会立即将更新的 edits 文件拉取到自己的节点。
    • 1.2)edits:编辑日志文件

  • 2)active 和 standby 的状态信息一致,standby 实时感知active的存活状态
    借助于zookeeper,active可以将状态信息写入zookeeper中,standby监听zookeeper对应的状态信息节点,一旦发现状态信息改变了,立即将自己的状态切换为active,同时修改zookeeper中的状态信息。
    切换过程中,为了避免发生脑裂(集群中有两个active namenode),standby在切换为active之前,会向active发送一个shell命令(kill -9,init 0),确保原来的active是宕机的。
如何写入zookeeper数据?
  • active的namenode通过zkfc(zookeeper failoverControler)将数据写入zookeeper中。
  • standby也通过zkfc获取zookeeper中active namenode的状态信息。

注意: zkfc是hadoop自带的,和namenode安装在同一个节点

hadoop HA 的搭建:

搭建准备

1)依赖环境

jdk 
linux 用户  ip hosts 免密  用户设置。。。  9步

2)集群规划(重点)
hdfs规划如下:

namenode--2个
zkfc--2个
datanode--3个   
jounalnode --3个
yarn resourcemanager --2个
nodemanager--3个

进程规划如下:

项目hadoop01进程hadoop02进程hadoop03进程
hdfsnamenodenamenode
hdfszkfczkfc
hdfsdatanodedatanodedatanode
hdfsjounalnodejounalnodejounalnode
yarnresourcemanagerresourcemanager
yarnnodemanagernodemanagernodemanager
zookeeperQuorumPeerMainQuorumPeerMainQuorumPeerMain
总计6个进程7个进程5个进程
开始搭建

1)上传
2)解压

tar -xvzf hadoop-2.7.7.tar.gz 

3)配置环境变量

export HADOOP_HOME=/home/hadoop/app/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbinsource /etc/profilehadoop version

4)修改hadoop的配置文件

/home/hadoop/app/hadoop-2.7.7/etc/hadoop 下面1.) hadoop-env.sh 
export JAVA_HOME=/home/hadoop/app/jdk1.8.0_732.) slaves   从节点  datanode|nodemanager
hadoop01
hadoop02
hadoop033.) core-site.xml
hadoop fs -ls /
hadoop fs -ls hdfs://hadoop01:9000/<!-- 指定hdfs的访问的url入口 完全分布式 hdfs://hadoop01:9000  高可用中 给的是一个nameservice bd1904 组名 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://bd1904/</value>
</property><!-- 指定 hadoop 工作目录 namenode   datanode -->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/data/hadoopdata/</value>
</property><!-- 指定 zookeeper 集群访问地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>4.hdfs-site.xml<!-- 指定副本数 --><property><name>dfs.replication</name><value>2</value></property><!--指定 hdfs 的 nameservice 为 bd1904,需要和 core-site.xml 中保持一致--><property><name>dfs.nameservices</name><value>bd1904</value></property><!-- bd1904 下面有两个 NameNode,分别是 nn1,nn2 --><property><name>dfs.ha.namenodes.bd1904</name><value>nn1,nn2</value></property><!-- nn1 的 RPC 通信地址 --><property><name>dfs.namenode.rpc-address.bd1904.nn1</name><value>hadoop01:8020</value></property><!-- nn1 的 http 通信地址 --><property><name>dfs.namenode.http-address.bd1904.nn1</name><value>hadoop01:50070</value></property><!-- nn2 的 RPC 通信地址 --><property><name>dfs.namenode.rpc-address.bd1904.nn2</name><value>hadoop02:8020</value></property><!-- nn2 的 http 通信地址 --><property><name>dfs.namenode.http-address.bd1904.nn2</name><value>hadoop02:50070</value></property><!-- 指定 NameNode 的 edits 元数据在 JournalNode 上的存放位置 qjm节点 --><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/bd1904</value></property><!-- 指定 JournalNode 在本地磁盘存放数据的位置 --><property><name>dfs.journalnode.edits.dir</name><value>/home/hadoop/data/hadoopdata/journaldata</value></property><!-- 开启 NameNode 失败自动切换 --><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><!-- 配置失败自动切换实现方式 -->
<!-- 此处配置在安装的时候切记检查不要换行--><property><name>dfs.client.failover.proxy.provider.bd1904</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--><property><name>dfs.ha.fencing.methods</name><value>sshfenceshell(/bin/true)</value></property><!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 --><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/hadoop/.ssh/id_rsa</value></property><!-- 配置 sshfence 隔离机制超时时间 --><property><name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property>5.mapred-site.xmlmv mapred-site.xml.template mapred-site.xml<!-- 指定 mr 框架为 yarn 方式 --><property><name>mapreduce.framework.name</name><value>yarn</value></property><!-- 设置 mapreduce 的历史服务器地址和端口号 --><property><name>mapreduce.jobhistory.address</name><value>hadoop03:10020</value></property>
<!-- mapreduce 历史服务器的 web 访问地址 --><property><name>mapreduce.jobhistory.webapp.address</name><value>hadoop03:19888</value></property>6.yarn-site.xml<!-- 开启 RM 高可用 --><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- 指定 RM 的 cluster id rm 组名--><property><name>yarn.resourcemanager.cluster-id</name><value>yarnbd1904</value></property><!-- 指定 RM 的名字 --><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><!-- 分别指定 RM 的地址 --><property><name>yarn.resourcemanager.hostname.rm1</name><value>hadoop02</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>hadoop03</value></property><!-- 指定 zk 集群地址 --><property><name>yarn.resourcemanager.zk-address</name><value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value></property><!-- 要运行 MapReduce 程序必须配置的附属服务 --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><!-- 开启 YARN 集群的日志聚合功能 --><property><name>yarn.log-aggregation-enable</name><value>true</value></property><!-- YARN 集群的聚合日志最长保留时长 --><property><name>yarn.log-aggregation.retain-seconds</name><value>86400</value></property><!-- 启用自动恢复 --><property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><!-- 制定 resourcemanager 的状态信息存储在 zookeeper 集群上--><property><name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property>

5)远程发送

scp -r hadoop-2.7.7 hadoop01:/home/hadoop/app/
scp -r hadoop-2.7.7 hadoop03:/home/hadoop/app/scp -r hadoop-2.7.7 hadoop01:/home/jacob/app/sudo scp /etc/profile hadoop01:/etc
sudo scp /etc/profile hadoop03:/etcsource /etc/profile
启动集群

6)启动集群(以下步骤 严格按照顺序执行)

	1)启动zk zkServer.sh start 2)启动qjm平台  启动journalnode进程3个节点的分别执行hadoop-daemon.sh start journalnode3)格式化hdfs namenode 在其中一个namenode节点执行  hadoop01 hadoop namenode -format 格式化元数据磁盘目录4)将hadoop01上的namenode的相关元数据信息  远程发送到另一个namenode节点scp -r /home/hadoop/data/hadoopdata/* hadoop02:/home/hadoop/data/hadoopdata/scp -r /home/jacob/data/hadoopdata/* hadoop02:/home/jacob/data/hadoopdata/5)初始化zkfc    (在zkfc的一个节点执行)hdfs zkfc -formatZK看到 Successfully created /hadoop-ha/bd1904 in ZK. 这句话时表示成功目的是 在zk中创建对应的存储namenode的状态信息的节点6)启动 start-dfs.sh   任意节点启动start-yarn.sh   在yarn的其中一个主节点启动另一个yarn的主节点单独启动 resourcemanager命令:yarn-daemon.sh start resourcemanager也可以使用图形界面查看,在浏览器中查看:查看namenode状态:hadoop01:50070  或 hadoop02:50070查看resourcemanager的状态:hadoop02:8088 或 hadoop03:8088

关闭集群的顺序:

	1)关闭hdfs stop-dfs.sh  任意节点2)关闭yarnstop-yarn.sh yarn的其中一个主节点yarn-daemon.sh stop resourcemanager3)关闭zk zkServer.sh stop   3个节点的分别执行

集群再次启动顺序

	1)启动zk 2)启动hdfs 3)启动yarn 

这篇关于hadoop HA (高可用 high available)的搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116925

相关文章

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.

Spring Cloud GateWay搭建全过程

《SpringCloudGateWay搭建全过程》:本文主要介绍SpringCloudGateWay搭建全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Spring Cloud GateWay搭建1.搭建注册中心1.1添加依赖1.2 配置文件及启动类1.3 测

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr