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

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/sbin

source /etc/profile

hadoop 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_73

2.) slaves   从节点  datanode|nodemanager
hadoop01
hadoop02
hadoop03

3.) 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>
      sshfence
      shell(/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.xml
 mv 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:/etc

source /etc/profile
启动集群

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

	1)启动zk 
	zkServer.sh start 
	
	2)启动qjm平台  启动journalnode进程
	3个节点的分别执行
	hadoop-daemon.sh start journalnode
	
	3)格式化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)关闭yarn
	stop-yarn.sh yarn的其中一个主节点
	yarn-daemon.sh stop resourcemanager
	
	3)关闭zk 
	zkServer.sh stop   3个节点的分别执行

集群再次启动顺序

	1)启动zk 
	2)启动hdfs 
	3)启动yarn 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值