第五节 Hadoop 2.0 高可用集群搭建(最详细版本)

Hadoop HA 集群搭建

1. 为啥需要配置HA?

  1. 所谓HA (High Availablity),即高可用(7*24小时不中断服务)。真正用途就是为了消除单点故障引发的 连锁反应
  2. 从之前的学习中可以了解 NameNode 就相当于整个系统的 “大脑” 一样,一旦出现问题就会导致整个集群 “休克”,为了避免出现这样的现象,在HA中,将两个单独的计算机配置为Namenode。正常状态下,只有一个Namenode处于Active状态,另一个处于Standby状态;
  3. Active Namenode用于接受Client端的请求,而Standby 节点只是充当从属,并保持足够的状态以在必要时提供快速故障转移。
    • 如: NameNode节点宕机重启,或者 NameNode节点需要升级等,这样会导致集群无法使用,而此时Standby会无缝接替工作变成 Active。 集群就会继续工作。

2. JournalNode 和 zookeeper组件引入

2.1 JournalNode

  1. 在HA之中可以有多个NameNode,那么它们之间肯定有自己的通讯方式,为了使Standby节点保持其状态与Active 节点同步,(热备份) 两个节点都与一组独立的进程进行相互通讯 称为JournalNode(JN) 的单独守护进程 进行通信。
  2. active 状态的NameNode的命名空间有任何修改时,会告知 journal 进程,Standby状态的NameNode有权力读取JNS的变更信息,并且一直监查edit log的变化,然后同步自己的命名空间
    • Standby可以确保在集群出错时,命名空间状态完全同步。
  3. 思考一个问题: 在Ha中允许多个NameNode同时工作么? 说出自己的看法!?
    • 假设突然断电之后的重启,出现了“人格分裂”两个NameNode都在工作!?

在这里插入图片描述

2.2 Zookeeper(解决Hadoop技术难点)

  1. 思考一个问题: NameNode HA中 技术难点,你认为有什么?
  1. 分布式应用提供一致性服务的软件,是Hadoop的重要组件,提供的功能包括:监听,配置维护、域名服务、分布式同步、组服务等。
  2. 作用其中之一: 引入zookeeper来对namenode进行监听, 如果,Active中 NameNode如果崩溃,就需要人工切换standby Namenode为active。如果没有及时发现,就会影响系统运行,就不是所谓的高可用。
  3. 选举机制。通过zookeeper可以监听多个namenode, 当active namenode崩溃的话, zookeeper监听到后马上通知zookeeper的leader进行主备选举, 在standby namenode中选举出一台,并将它置为active模式替换崩溃的namenode。
    在这里插入图片描述

3. Hadoop HA集群搭建准备(前期)

3.1 节点分配表

  1. hd03 的机器可以在配置两个,但是集群最好要保持单数。(根据自己机器硬件3个5个都可以)
节点名称节点功能ip地址
hd01zoopeeper,NameNode(active),Resourcemanage(active)192.168.150.134
hd02zoopeeper,NameNode(standby),Resourcemanage(standby) ,JournalNode ,DataNode192.168.150.135
hd03zookeeper,DataNode ,NodeManager ,JournalNode192.168.150.136

3.2 配置Linux服务器基本配置

  1. 首先,参考 第一节Hadoop安装中 5. Linux基本配置,配置一台节点机器。
    • 参照步骤配置一台linux,然后再进行下一步,克隆。

在这里插入图片描述
2. 配置host时需要注意,需要将集群ip都写入vim /etc/hosts
在这里插入图片描述

3.3 克隆节点

  1. 配置好机器之后在准备克隆,这样可以减少很多操作步骤,

    • 克隆一定要注意在虚拟机关机状态下操作。
      在这里插入图片描述
  2. 根据选择提示操作,然后下一步。

    在这里插入图片描述

  3. 根据选择提示操作,然后点击完成。等待克隆完成即可。

    在这里插入图片描述
    在这里插入图片描述

  4. 然后重复上面操作,在克隆2个节点。因为需要配置3个机器

3.4 修改克隆节点ip , 其他节点免密钥登录,和hostname名称

  1. 克隆之后,其他节点ip需要修改为ip分配表中的ip地址 (因为克隆ip不会自己改变,需要修改)。
  2. 免密钥登录, 一定要在其他节点ip修改之后,然后将3节点机器全部启动,依次重新配置自己的免密钥 ssh-keygen一直回车。
    • 注意: 将自己的密钥发往其他节点和自己节点。 如:发往hd02节点ssh-copy-id root@hd02
    • 因为集群之间需要通讯。不能每次需要输入密码。 相互发完之后,可以测试 ssh 节点名称

在这里插入图片描述

  1. 然后同ip一样,修改其他节点的hostname,主机名称。

4. zookeeper 框架安装

4.1 安装前提

  1. 一定要将 配置Linux服务器基本配置几项完成
    防火墙,
    hosts : 将集群机器都要配置映射。ip+主机名称
    ip地址:一定要改为手动
    免密钥:服务器之间要相互发送自己密钥。
    节点主机名称: 一定重启之后用hostname查看。
    安装环境变量jdk

  2. 将zookeeper的安装程序上传到 Linux服务器指定目录上 /usr /java /,并进行解压tar zxvf 名称

4.2 配置Zookeeper文件

  1. 进行配置zookeeper的配置目录 conf

    • 将其中的 zoo_sample.cfg 复制一份并改名为 zoo.cfg 并配置复制后的文件,使用命令 cp zoo_sample.cfg zoo.cfg
      在这里插入图片描述
  2. 配置文件 zoo.cfg 。
    在这里插入图片描述
    操作如下: 修改两处配置:

    • dataDir 是存放zookeeper缓存文件,手动创建/usr/zkdata目录 (注意:是目录,别创建成文件)
    • 配置节点选举节点。server.1=节点主机名称:2888:3888
      参数说明:1,选举id值、2888心跳端口、3888选举端口。
      注:usr/zkdata/ 创建一个文件myid(注意这个是文件,别创建成目录),编辑内容为选举节点id值。
      例如 :server.1 =hd01:2888:3888。 myid内容就是1。

    在这里插入图片描述

4.3 将配置文件同步其他节点

  1. 将配置好的文件同步到其他节点,即远程发送到其他节点。特别需要注意, 创建zkdata和修改myid里面的值
    • 加-r是指发送目录及所有使用命令 scp -r /usr/java/apache-zookeeper-3.6.0-bin root@hd02:/usr/java/
    • 不加-r只发送文件scp myid root@hd02:/usr/zkdata/

5. 配置Hadoop节点配置(中期)

5.1 安装前提

  1. 上传hadoop-2.8.1.tar.gz 安装包到Linux下的指定目录,如: /usr /java/
    • 并解压tar包,tar zxvf hadoop-2.8.1.tar.gz
  2. 配置Linux中的 Hadoop环境变量。
    • 编辑文件vim /etc /profile最下面加入hadoop的相关参数
    • 最后发送到其他节点scp /etc/profile root@hd02:/etc/
	        JAVA_HOME=/usr/java/jdk1.8.0_121 
			HADOOP_HOME=/usr/java/hadoop-2.8.1 
			PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
			CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
			export PATH JAVA_HOME CLASSPATH HADOOP_HOME

5.2 配置 hadoop-env.sh

  1. hadoop-env.sh,主要是修改hadoop运行环境配置变量。
    • 目录: /usr/java/hadoop-2.8.1/etc/hadoop
    • 参数: 修改JAVA_HOME 路径和HADOOP_CONF_DIR 路径
      在这里插入图片描述

5.3 配置core-site.xml

  1. 用于定义系统级别的参数。
    • 如:指定HDFS老大,配置zookeeper地址,hadoop 缓存目录。
    • zookeeper执行地址要与yarn-site.xml 中的zookeeper保持对应节点数。
<!-- 用来指定hdfs的老大,ns为固定属性名,表示两个namenode-->
<configuration>
	<property>
		<name>fs.defaultFS</name>
		<value>hdfs://ns</value>
	</property>
<!--hadoop生成的临时文件存放tmp需要手动创建-->
	<property>
		<name>hadoop.tmp.dir</name>
		<value>/usr/java/hadoop-2.8.1/tmp</value>
	</property>
<!--执行zookeeper地址-->
	<property>
		<name>ha.zookeeper.quorum</name>
		<value>hd01:2181,hd02:2181,hd03:2181</value>
	</property>
</configuration>

5.4 配置hdfs-site.xml(核心文件)

  1. hdfs-site.xml,配置hdfs的备份策略,和文件读取权限。
    • HA中属于核心重点文件。
<configuration>
<!--执行hdfs的nameservice为ns,和core-site.xml保持一致-->
	<property>
		<name>dfs.nameservices</name>
		<value>ns</value>
	</property>
<!--ns下有两个namenode,分别是nn1,nn2-->
	<property>
		<name>dfs.ha.namenodes.ns</name>
		<value>nn1,nn2</value>
	</property>
<!--nn1的RPC通信地址-->
	<property>
		<name>dfs.namenode.rpc-address.ns.nn1</name>
		<value>hd01:9000</value>
	</property>
<!--nn1的http通信地址-->
	<property>
		<name>dfs.namenode.http-address.ns.nn1</name>
		<value>hd01:50070</value>
	</property>

<!--nn2的RPC通信地址-->
	<property>
		<name>dfs.namenode.rpc-address.ns.nn2</name>
		<value>hd02:9000</value>
	</property>
<!--nn2的http通信地址-->
	<property>
		<name>dfs.namenode.http-address.ns.nn2</name>
		<value>hd02:50070</value>
	</property>
	
<!--指定namenode的元数据在JournalNode上的存放位置,这样,namenode2可以 从jn集群里获取
最新的namenode的信息,达到热备的效果-->
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value> qjournal://hd02:8485;hd03:8485/ns</value>
	</property>
	
<!--指定JournalNode存放数据的位置-->
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value> /usr/java/hadoop-2.8.1/journal</value>
	</property>

<!--开启 namenode 故障时自动切换-->
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
	
<!--配置切换的实现方式-->
	<property>
		<name>dfs.client.failover.proxy.provider.ns</name>
		<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	
<!--配置隔离机制-->
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>sshfence</value>
	</property>
	
<!--配置隔离机制的ssh登录秘钥所在的位置-->
	<property>
		<name>dfs.ha.fencing.ssh.private-key-files</name>
		<value>/root/.ssh/id_rsa</value>
	</property>
	
<!--配置namenode数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径-->
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>file:/usr/java/hadoop-2.8.1/tmp/namenode</value>
	</property>
<!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是
core-site.xml里配置的hadoop.tmp.dir的路径-->
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>file:/usr/java/hadoop-2.8.1/tmp/datanode</value>
	</property>
<!--配置block副本数量-->
	<property>
		<name>dfs.replication</name>
		<value>3</value>
	</property>
<!--设置 hdfs 的操作权限, false 表示任何用户都可以在 hdfs 上操作文件-->
	<property>
		<name>dfs.permissions</name>
		<value>false</value>
	</property>
</configuration>

5.5 配置mapred-site.xml.template模板文件

  1. MapReduce的核心配置文件,配置运行资源调度平台为yarn。
    • 需要将模板文件修改为 mapred-site.xml
<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
</configuration>

5.6 配置 yarn-site.xml(核心文件)

  1. yarn的核心配置文件。
    • 其中yarn.resourcemanager.zk-address 中节点数要与 core-site.xml -执行zookeeper地址中保持一致。
<configuration>
<!--开启YARN HA --> 
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
<!--指定两个 resourcemanager 的名称--> 
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
<!--配置rm1,rm2的主机--> 
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>hd01</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>hd02</value>
	</property>
<!--开启yarn恢复机制-->
	<property>
		<name>yarn.resourcemanager.recovery.enabled</name>
		<value>true</value>
	</property>
<!--执行rm恢复机制实现类,得有一个类去干这个事-->
	<property>
		<name>yarn.resourcemanager.store.class</name>
		<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
	</property>
<!--配置zookeeper的地址--> 
	<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>hd01:2181,hd02:2181,hd03:2181</value>
	</property>
<!--指定YARN HA的名称,名字随意-->
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>yarn-ha</value>
	</property>
	<property>
		<!--指定yarn的老大resoucemanager的地址-->
		<name>yarn.resourcemanager.hostname</name>
		<value>hd01</value>
	</property>
	<property>
	<!--NodeManager 获取数据的方式-->
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
</configuration>

5.7 配置slaves

  1. 作用:配置干活小弟节点。hd03 hd02。
    • 执行编辑文件 slaves vim slaves
      在这里插入图片描述

5.8 注意事项

  1. 需要手动创建上面的相应组件的缓存目录;
手动建立目录,如下

	/usr/java/hadoop-2.8.1/tmp 			hadoop缓存目录。
	/usr/java/hadoop-2.8.1/journal     JournalNode数据目录,NameNode的守护进程。


在这里插入图片描述

  1. hadoop-2.8.1配置好的安装程序发往其他节点。
    • 向hd02节点传输 scp –r /usr/java/hadoop-2.8.1 root@hd02:/usr/java

6. 启动Hadoop集群启动(后期)

6.1 启动Zookeeper集群

  1. 在zookeeper安装目录下bin目录下执行:sh zkServer.sh start 分别在安装zk节点的机器。
    注:

    • 最好将节点机器重启,然后再进行启动集群,如果无法启动:
      检查jdk是否安装,source是否生效,
      检查zkdata 中的myid文件是否存在,myid值是否正确。
      检查端口2181是否被占用。netstat -apn | grep 2181
      删除zkdata中除 myid文件(以上均不行情况)。

    在这里插入图片描述

6.2 格式化Zookeeper中的Leader节点

  1. 进入zookeeper安装目录/bin目录下,执行命令sh zkServer.sh status,哪个节点是 Mode: leader 就格式化哪个节点执行。
    • 执行命令:hdfs zkfc -formatZK (这个命令一定要手动敲入,千万别复制,切记,切记)
      不然会报错(Bad argument: formatZK)
    • 作用: 可以在zookeeper集群中生成ha节点(ns节点)。相当于在zookeeper上注册了一个节点路径为hadoop-ha/ns,然后两个NameNode会在/hadoop-ha/ns下注册临时节点。zookeeper通过检测节点变化,来了解NameNode节点状态。
      在这里插入图片描述
  2. 如果没有报错误信息,就会如下图
    • 只在Leader节点格式化即可,其他节点不需要)。
      在这里插入图片描述

6.3 启动journalNode集群

  1. 即共享守护进程。根据分配表,在hd02、hd03,节点上执行启动journalNode集群。
    • hdfs-site.xml文件中。
      在这里插入图片描述
  2. 在 hadoop安装目录的 /usr/java/hadoop-2.8.1/sbinsbin目录下。
    • 执行命令: sh hadoop-daemons.sh start journalnode
    • 注意:如果根据节点配置表发现有其他的节点没有启动,去查看配置文件 5.7 slaves是否配置。

在这里插入图片描述

6.4 格式化 NameNode

  1. 跟据节点分配表在hd01节点上进行操作。
    • 格式化hd01 上NameNode 命令:hadoop namenode -format
    • 前提是没有报错,就会有如下界面。如果报错请检查 配置Hadoop节点配置(中期)
      在这里插入图片描述
    • 同时在tmp中会生数据。
      在这里插入图片描述

6.5 启动 NameNode 和 Standby NameNode

  1. 格式化成功之后,在 hd01 节点上目录下,/usr/java/hadoop-2.8.1/sbin启动NameNode。

    • 命令: sh hadoop-daemon.sh start namenode

    在这里插入图片描述

  2. 根据节点分配表 在hd02上将NameNode节点状态 变成standby。

    • 命令: hdfs namenode -bootstrapStandby
      在这里插入图片描述
  3. 启动在 hd02 节点上目录下,/usr/java/hadoop-2.8.1/sbin启动NameNode。

    • 命令: sh hadoop-daemon.sh start namenode
      在这里插入图片描述

6.6 启动 DataNode

  1. 根据节点分配表 只有hd03,hd02上为DataNode节点。
    • 命令:sh hadoop-daemon.sh start datanode
    • 如果启动不了有一般两种情况: 第一种, 查看Slaves文件中是否配置该节点,第二种,就是 NameNode和DataNode 集群ID不一致 (原因是多次格式化NameNode导致)。
      在这里插入图片描述
      在这里插入图片描述

6.7 启动 FalioverControllerActive 机制

  1. 属于zookeeper的组件,主要是监测NameNode的状态,如果有问题则自动切换 Standby节点为Active。 在安装有NameNode节点的机器启动,hd01 ,hd02。
    • 命令: sh hadoop-daemon.sh start zkfc
      在这里插入图片描述在这里插入图片描述

6.8 启动ResourceManager

  1. 是YARN分布式资源调度系统重要组件,ResourceManager负责集群中所有资源的统一管理和分配,它接收来自各个节点的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序。

    • 命令: sh start-yarn.sh ,根据节点分配表 在hd01上启动。
    • 在主节点会有 ResourceManager 在其它节点上 NodeManager。
      在这里插入图片描述
  2. 在hd02上启动副ResourceManager的主节点的备份。

    • 命令: sh yarn-daemon.sh start resourcemanager
      在这里插入图片描述

6.9 启动测试

  1. 在地址栏输入192.168.150.134:50070 这是访问url地址。主节点+端口号。

    • 查看主节点NameNode状态 active。
      在这里插入图片描述
      在这里插入图片描述
  2. 在地址栏输入192.168.150.135:50070 这是访问url地址。主节点+端口号。

    • 查看副节点NameNode状态 standby。
      在这里插入图片描述

7 集群启动顺序

  1. hd01、hd02、hd03,启动 zookeeper。

    • 命令: zkServer.sh start
  2. hd02、hd03 、启动 journalnode

    • 命令: sh hadoop-daemons.sh start journalnode
  3. hd01 、hd02、启动 Namenode

    • 命令 : sh hadoop-daemons.sh start namenode
  4. part02、part03,启动 datanode

    • 命令: sh hadoop-daemons.sh start datanode
  5. hd01、hd02, 启动FlioverControllerActive

    • 命令: sh hadoop-daemons.sh start zkfc
  6. hd01、启动 yarn resourcemanager

    • 命令: sh strat-yarn.sh
  7. hd02 启动 resourcemanager2

    • 命令: sh yarn-daemons.sh start resourcemanager

配置环境变量的如HADOOP命令可以在任意目录启动,
如果想停止集群,则停止的操作从7-1即可。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴琼老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值