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

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和

JavaFX环境的搭建和一个简单的例子

之前在网上搜了很多与javaFX相关的资料,都说要在Eclepse上要安装sdk插件什么的,反正就是乱七八糟的一大片,最后还是没搞成功,所以我在这里写下我搭建javaFX成功的环境给大家做一个参考吧。希望能帮助到你们! 1.首先要保证你的jdk版本能够支持JavaFX的开发,jdk-7u25版本以上的都能支持,最好安装jdk8吧,因为jdk8对支持JavaFX有新的特性了,比如:3D等;