二十三、HadoopHA环境搭建(保姆篇,手把手搭建)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 二十三、HadoopHA环境搭建(保姆篇,手把手搭建)

HDFS-HA集群配置


环境准备:


1.    将各个机器修改为静态IP,见主页第十四篇文章:Linux设置静态IP及Ping通百度


2.    修改主机名及主机名和IP地址的映射,见主页第十一篇文章:修改主机名,IP映射


3.    关闭防火墙,见主页第九篇文章:永久关闭防火墙


4.    ssh免密登录,见主页第九篇文章:同上


5.    安装JDK,配置环境变量等,见主页第九篇文章:同上


规划集群:

hadoopha101 hadoopha102 hadoopha103
NameNode    NameNode


JournalNode    JournalNode    JournalNode   
DataNode DataNode


DataNode

ZK  ZK  


ZK 


ResourceManager


NodeManager NodeManager NodeManager

部署集群


1.    集群规划

在hadoopha101、hadoopha102和hadoopha103三个节点上部署Zookeeper。


2.    解压安装

(1)解压Zookeeper安装包到/home/目录下。


1.png


(2)重命名apache-zookeeper-3.5.7-bin.tar.gz 为zookeeper。


2.png

(3)在zookeeper-3.5.7/安装目录下创建zkData。


3.png


(4)重命名/home/zookeeper/conf这个目录下的zoo_sample.cfg为zoo.cfg。


4.png


3.    配置zoo.cfg文件

(1)具体配置,修改dataDir为真实路径,添加红框中的内容。


5.png


(2)配置参数解读


Server.A=B:C:D。


       A是一个数字,表示这个是第几号服务器;


       B是这个服务器的IP地址;


       C是这个服务器与集群中的Leader服务器交换信息的端口;


      D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。


       集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。


4.    集群操作


(1)在/home/zookeeper/zkData目录下创建一个myid的文件。


6.png


(2)编辑myid文件。


7.png


在文件中添加与server对应的编号:如1


(3)拷贝配置好的zookeeper发到其他机器上。


8.png


9.png


并分别修改myid文件中内容为2、3


(4)分别启动zookeeper。


10.png


11.png


12.png

(5)查看状态。


13.png


14.png


15.png

配置HDFS-HA集群


(1)在opt目录下创建一个ha文件夹。


16.png


(2)将/home/hadoop/下的 hadoop目录拷贝到/opt/ha目录下。


17.png


(3)配置hadoop-env.sh。


18.png


(4)配置core-site.xml。


<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://mycluster</value>
        </property>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/ha/hadoop/data/tmp</value>
        </property>
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/opt/ha/hadoop/data/tmp/jn</value>
        </property>
</configuration>


(5)配置hdfs-site.xml。


<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <!-- 完全分布式集群名称 -->
        <property>
                <name>dfs.nameservices</name>
                <value>mycluster</value>
        </property>
        <!-- 集群中NameNode节点都有哪些 -->
        <property>
                <name>dfs.ha.namenodes.mycluster</name>
                <value>nn1,nn2</value>
        </property>
         <!-- nn1的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn1</name>
                <value>hadoopha101:9000</value>
        </property>
        <!-- nn2的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn2</name>
                <value>hadoopha102:9000</value>
        </property>
        <!-- nn1的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn1</name>
                <value>hadoopha101:50070</value>
        </property>
        <!-- nn2的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn2</name>
                <value>hadoopha102:50070</value>
        </property>
         <!-- 指定NameNode元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoopha101:8485;hadoopha102:8485;hadoopha103:8485/mycluster</value>
        </property>
        <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>sshfence</value>
        </property>
        <!-- 关闭权限检查-->
        <property>
                <name>dfs.permissions.enable</name>
                <value>false</value>
        </property>
        <!-- 使用隔离机制时需要ssh无秘钥登录-->
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/root/.ssh/id_rsa</value>
        </property>
        <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
        <property>
                <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
</configuration>


(6)在其他两台机器上创建 /opt/下的ha目录,将用于分发。


19.png


20.png


(7)将配置好的hadoop环境分发到其他节点。


21.png


22.png


5 .   启动HDFS-HA集群


1.    在各个JournalNode节点上(/opt/ha/hadoop),输入以下命令启动journalnode服务。

23.png


25.png


24.png


2.    对其hadoopha101进行格式化。

26.png

如图所示:0即为格式化无误,1请查看配置文件是否出错。


27.png


3.     启动第一台机器的namenode。


28.png


4.        使用jps命令查看节点。


29.png


5.      在hadoopha102机器上同步第一台机器的元数据信息。


       有两种方式同步:   1.在hadoopha102上使用如下图命令


                                       2.将hadoopha101机器上的tmp目录拷贝到hadoopha102机器上。


30.png

31.png

6.       启动第二台机器的namenode。

32.png

7.       使用“hadoopha101:50070”命令在虚拟机浏览器查看web页面显示。


33.png

34.png

6.    在第一台机器上,启动所有datanode。


注意:1.开启datanode之前此处slaves文件要确保修改为主机名,且不能有多余空格。


           2.ssh配置完成。如未配置请移步:Hadoop完全分布式的搭建详情修改slaves文件配置ssh免密

27.png

35.png


39.png


40.png


7.    将第一台机器切换为Active。


41.png


8.    查看是否Active。


42.png


6    配置HDFS-HA自动故障转移


1.    具体配置


(1)在hdfs-site.xml中增加。


<property>
  <name>dfs.ha.automatic-failover.enabled</name>
  <value>true</value>
</property>

(2)在core-site.xml文件中增加。


<property>
  <name>ha.zookeeper.quorum</name>
  <value>hadoopha101:2181,hadoopha102:2181,hadoopha103:2181</value>
</property>

2.    启动


(1)关闭所有HDFS服务:


43.png


(2)启动Zookeeper集群:


44.png


(3)初始化HA在Zookeeper中状态(此处格式化只格式化一次):


45.png


(4)启动HDFS服务:


46.png


(5)在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode。


47.png


可以看到未切换前第一台机器为active,第二台机器为standby。


注意:如果发现第二台机器DFSZKFailoverController节点没有起来。则:


(1)先停止所有dfs节点。sbin/stop-dfs.sh


(2)分发/opt/ha/hadoop/etc/hadoop给第二三台机器。


         scp -r /opt/ha/hadoop/etc/hadoop/ hadoopha102:/opt/ha/hadoop/etc/hadoop/


         scp -r /opt/ha/hadoop/etc/hadoop/ hadoopha103:/opt/ha/hadoop/etc/hadoop/

(3)再启动所有dfs节点。sbin/start-dfs.sh


(6)如图节点就都没问题了。


48.png


(7)验证


       现机器状态如第五步所示。


1、将Active NameNode进程kill。


49.png


2、查看是否进行了故障转移。


50.png

        注意:可见第一台机器由于进程namenode被杀死直接网页找不到了,而同时第二台机器变为了active状态,这样就实现了自动故障转移,一旦active机器死机,自动故障转移就会将其他namenode机器变为active状态,实现自动故障转移。


YARN-HA配置


YARN-HA工作机制如图:


51.png


配置YARN-HA集群:


1.    环境准备(雷同以上hdfs配置)

(1)修改IP


(2)修改主机名及主机名和IP地址的映射


(3)关闭防火墙


(4)ssh免密登录


(5)安装JDK,配置环境变量


(6)配置Zookeeper集群


2.    规划集群

hadoop102

hadoop103  hadoop104

NameNode     


NameNode


JournalNode    JournalNode   


JournalNode  

DataNode DataNode DataNode
ZK


ZK


ZK

ResourceManager     

ResourceManager    


NodeManager NodeManager


NodeManager  

3.    具体配置


(1)yarn-site.xml配置        


<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!--启用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
    <!--声明两台resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>
 <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoopha101</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoopha102</value>
    </property>
    <!--指定zookeeper集群的地址-->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoopha101:2181,hadoopha102:2181,hadoopha103:2181</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>
</configuration>

(2)同步更新其他节点的配置信息


52.png


53.png

4.   启动hdfs

(1)在各个JournalNode节点上,输入以下命令启动journalnode服务:


sbin/hadoop-daemon.sh start journalnode


(2)在[nn1]上,对其进行格式化,并启动(如果hdfsha初始化过就不需要再次初始化了):


bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode


(3)在[nn2]上,同步nn1的元数据信息:


bin/hdfs namenode -bootstrapStandby

(4)启动[nn2]:


sbin/hadoop-daemon.sh start namenode

(5)启动所有DataNode


sbin/hadoop-daemons.sh start datanode

5.   启动YARN

(1)在hadoopha101中执行:


sbin/start-yarn.sh

(2)在hadoopha102中执行:


sbin/yarn-daemon.sh start resourcemanager

(3)查看服务状态,如图所示


54.png



        注意:yarnha和hdfsha有一些不同,hdfs使用群起命令都可以直接起来,而在yarn中使用群起命令不会全部机器都起来,需要手动启动,例如第二步单独启动第二台机器resourcemanager。yarn中能打开上图网页即为活跃状态。


至此,HadoopHA搭建完毕。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
SQL Java 关系型数据库
手把手搭建一个完整的javaweb项目(适合新手)
手把手搭建一个完整的javaweb项目(适合新手)
153 1
|
前端开发 Java 大数据
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第六节)
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第六节)
|
JSON 前端开发 JavaScript
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第十二节)
好的,那么在上一节中呢,评论功能的后台已经写好了,这一节,先把这部分后台代码和前台对接一下。
135 0
|
SQL Java 关系型数据库
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第五节)
在上一节中,我们成功将数据从前台的JSP页面传递到了controller层,但是还没有写service层,老实说还有很多工作没有,尤其是和数据库的链接方面的,所以,这一节,我们专门来处理一下关于数据库连接方面的东西。
106 0
|
SQL 移动开发 前端开发
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第四节)
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第四节)
110 0
|
前端开发 JavaScript 容器
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第二节)
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第二节)
|
前端开发 Java 关系型数据库
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第一节)
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第一节)
148 0
|
JSON JavaScript 前端开发
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第三节)
【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第三节)
123 0
|
Linux Windows
服务器小白阿里云使用初体验
来自大四学生的阿里云服务器试用初体验