Hadoop HA安装配置(容器环境),大数据职业技能竞赛模块A平台搭建,jdk+zookeeper+hadoop HA

HA概述

(1) 所谓HA(High Availablity),即高可用(7*24小时不中断服务)。

(2) 实现高可用最关键的策略是消除单点故障,HA严格来说应该分为各个组件的HA机制,HDFS的HA和YARN的HA。

(3) NameNode主要在以下两个方面影响HDFS集群

NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启

NameNode机器需要升级,包括软件、硬件省级,此时集群也将无法使用

HDFS HA功能通过配置多个NameNode(Active/Standby)实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级,这时课通过此方式将NameNode很快的切换到另一台机器

环境准备:

参考这篇文章>>大数据职业技能竞赛模块A环境搭建

没特别声明一律按在master上操作

Hadoop HA安装配置

本任务需要使用root用户完成相关配置,安装Hadoop需要配置前置环境。命令中要求使用绝对路径,具体要求如下:

1、 从宿主机/opt目录下将文件hadoop-3.1.3.tar.gz、jdk-8u212-linux-x64.tar.gz,apache-zookeeper-3.5.7-bin.tar.gz复制到容器Master中的/opt/software路径中(若路径不存在,则需新建),分别将Master节点Hadoop、Zookeeper、JDK安装包解压到/opt/module路径中(若路径不存在,则需新建),其中将JDK、Hadoop解压命令复制并粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;

第一步:从宿主机/opt目录下将文件hadoop-3.1.3.tar.gz、jdk-8u212-linux-x64.tar.gz,apache-zookeeper-3.5.7-bin.tar.gz复制到容器Master中的/opt/software路径中(若路径不存在,则需新建)

在宿主机(Bigdata)中复制到master里

bash 复制代码
docker cp /opt/jdk-8u212-linux-x64.tar.gz master:/opt/software
bash 复制代码
docker cp /opt/hadoop-3.1.3.tar.gz master:/opt/software
bash 复制代码
docker cp /opt/apache-zookeeper-3.5.7-bin.tar.gz master:/opt/software
第二步:分别将Master节点Hadoop、Zookeeper、JDK安装包解压到/opt/module路径中(若路径不存在,则需新建)

在master中解压

bash 复制代码
tar zxvf /opt/software/jdk-8u212-linux-x64.tar.gz -C /opt/module/
bash 复制代码
tar zxvf /opt/software/hadoop-3.1.3.tar.gz -C /opt/module/
bash 复制代码
tar zxvf /opt/software/apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/

重命名一下

bash 复制代码
mv /opt/module/jdk1.8.0_212 /opt/module/java
mv /opt/module/hadoop-3.1.3 /opt/module/hadoop
mv /opt/module/apache-zookeeper-3.5.7-bin /opt/module/zookeepe

2、 请完成host相关配置,将三个节点分别命名为master、slave1、slave2并做免密登录,修改容器中/etc/profile文件,设置JDK环境变量并使其生效,分发jdk至slave1、slave2中,均配置完毕后在Master节点分别执行"java -version"和"javac"命令,将命令行执行结果分别截图并粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;

第一步:完成host相关配置

下面的映射关系写到这个文件里 /etc/hosts(三个节点都要添加

bash 复制代码
192.168.100.101 master
192.168.100.102 slave1
192.168.100.103 slave2

前面是ip后面是主机名,根据自己的修改

第二步:将三个节点分别命名为master、slave1、slave2并做免密登录

修改主机名,如果修改好的可以跳过这步

master:

复制代码
hostnamectl set-hostname master

slave1:

复制代码
hostnamectl set-hostname slave1

slave2:

复制代码
hostnamectl set-hostname slave2

免密登录(三个节点都要这样操作)

生成密钥

在每台主机输入 ssh-keygen 然后一直敲回车

bash 复制代码
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:a5KqXjGa6r1CO1pe9cG9bR3Pp2om6BstpOB9l6SW24E root@master
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|       . .       |
|    + . S o   .  |
| . + * = O + . + |
|. = + = E.* o . +|
| B.o . =.*.oo  ..|
|=o*+o  .+..+...  |
+----[SHA256]-----+

复制密钥

bash 复制代码
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
第三步:修改容器中/etc/profile文件,设置JDK环境变量并使其生效

在/etc/profile文件末尾写环境变量

bash 复制代码
#JAVA_HOME
export JAVA_HOME=/opt/module/java
#HADOOP_HOME
export HADOOP_HOME=/opt/module/hadoop
#zOOKEEPER_HOME
export ZOOKEEPER_HOME=/opt/module/zookeeper

#PATH
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin

使环境变量生效

bash 复制代码
source /etc/profile
四步:分发jdk至slave1、slave2中

复制jdk到slave1、slave2

bash 复制代码
scp -rq /opt/module/java slave1:/opt/module/
scp -rq /opt/module/java slave2:/opt/module/

复制环境变量

bash 复制代码
scp /etc/profile slave1:/etc/profile
scp /etc/profile slave2:/etc/profile
第五步:均配置完毕后在Master节点分别执行"java -version"和"javac"命令

输入 java -version

bash 复制代码
java -version

输入 javac

3、 配置好zookeeper,其中zookeeper使用集群模式,分别在master、slave1、slave2作为其集群的节点,使用zkServer.sh status获取zookeeper服务端状态,将命令和结果截图粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下(注:只截取三个节点中zookeeper server角色模式为leader的节点);

第一步:配置好zookeeper,其中zookeeper使用集群模式(master、slave1、slave2作为其集群的节点)

修改文件名称

bash 复制代码
mv /opt/module/zookeeper/conf/zoo_sample.cfg /opt/module/zookeeper/conf/zoo.cfg

配置zoo.cfg

bash 复制代码
vi /opt/module/zookeeper/conf/zoo.cfg
bash 复制代码
dataDir=/opt/module/zookeeper/data
datdLogDir=/opt/module/zookeeper/logs

server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

代码位置如图:

创建目录

bash 复制代码
mkdir /opt/module/zookeeper/data
mkdir /opt/module/zookeeper/logs

添加myid文件到data里(里面就填一个数字,master填1,slave1填2,slave2填2)

bash 复制代码
vi /opt/module/zookeeper/data/myid

把配置好的zookeeper分发到子节点去

bash 复制代码
scp -r /opt/module/zookeeper slave1:/opt/module/
scp -r /opt/module/zookeeper slave2:/opt/module/

修改子节点的myid

vi /opt/module/zookeeper/data/myid

启动zookeeper集群(三个节点都要启动)

bash 复制代码
zkServer.sh start
第二步:使用zkServer.sh status获取zookeeper服务端状态

查看集群状态

bash 复制代码
zkServer.sh status

4、 配置好Hadoop HA,请将dfs.ha.namenodes.hadoopcluster设置为nn1、nn2,同时yarn.resourcemanager.ha.rm-ids设置为rm1、rm2,并在Master启动nn1与rm1,在slave1启动nn2与rm2,将master、slave1、slave2均作为datanode,分发hadoop至slave1、slave2中,启动yarn与hdfs的HA集群(Hadoop HA集群),并在Master节点上使用命令分别查看服务nn2与rm2进程状态,并将查看命令及结果截图粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下;

第一步:配置好Hadoop HA

将dfs.ha.namenodes.hadoopcluster设置为nn1、nn2,同时yarn.resourcemanager.ha.rm-ids设置为rm1、rm2,并在Master启动nn1与rm1,在slave1启动nn2与rm2,将master、slave1、slave2均作为datanode

core-site.xml
bash 复制代码
 vi /opt/module/hadoop/etc/hadoop/core-site.xml
XML 复制代码
    <!-- 指定NameNode的地址 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoopcluster</value>
    </property>

    <!-- 指定hadoop数据的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop/data</value>
    </property>

	<!-- 指定zkfc链接的zkServer地址-->	
    <property>
        <name>ha.zookeeper.quorum</name>
    	<value>master:2181,slave1:2181,slave2:2181</value>
	</property>
hdfs-site.xml
bash 复制代码
vi /opt/module/hadoop/etc/hadoop/hdfs-site.xml
XML 复制代码
    <!--完全分布式集群名称 -->
    <property>
        <name>dfs.nameservices</name>
        <value>hadoopcluster</value>
    </property>

    <!--集群中NameNode节点 -->
    <property>
        <name>dfs.ha.namenodes.hadoopcluster</name>
        <value>nn1,nn2</value>
    </property>

    <!--NameNode存储目录-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file://${hadoop.tmp.dir}/name</value>
    </property>

    <!--DataNode存储目录 -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file://${hadoop.tmp.dir}/data</value>
    </property>

    <!--JournalNode存储目录 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>${hadoop.tmp.dir}/jn</value>
    </property>

    <!--NameNode的RPC通信地址-->
    <property>
        <name>dfs.namenode.rpc-address.hadoopcluster.nn1</name>
        <value>master:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.hadoopcluster.nn2</name>
        <value>slave1:8020</value>
    </property>

    <!--NameNode的http通信地址-->
    <property>
        <name>dfs.namenode.http-address.hadoopcluster.nn1</name>
        <value>master:9870</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.hadoopcluster.nn2</name>
        <value>slave1:9870</value>
    </property>

    <!--NameNode元数据在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave1:8485;slave2:8485/hadoopcluster</value>
    </property>

    <!--访问代理类:client用于确定哪个NmaeNode为Active-->
    <property>
        <name>dfs.client.failover.proxy.provider.hadoopcluster</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>
yarn-site.xml
bash 复制代码
vi /opt/module/hadoop/etc/hadoop/yarn-site.xml
bash 复制代码
    <!-- 启用 NodeManager 的辅助服务:用于支持 MapReduce 程序的 Shuffle 操作 -->
    <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>

    <!-- 定义 HA 模式下的 ResourceManager 标识符列表 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <!-- 配置第一个 ResourceManager 的主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>master</value>
    </property>

    <!-- 配置第一个 ResourceManager 的 Web 管理页面地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm1</name>
        <value>master:8088</value>
    </property>

    <!-- 配置第一个 ResourceManager 的客户端通信地址 -->
    <property>
        <name>yarn.resourcemanager.address.rm1</name>
        <value>master:8032</value>
    </property>

    <!-- 配置第一个 ResourceManager 的调度器通信地址 -->
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm1</name>
        <value>master:8030</value>
    </property>

    <!-- 配置第一个 ResourceManager 的资源跟踪器通信地址 -->
    <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm1</name>
        <value>master:8031</value>
    </property>

    <!-- 配置第二个 ResourceManager 的主机名 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>slave1</value>
    </property>

    <!-- 配置第二个 ResourceManager 的 Web 管理页面地址 -->
    <property>
        <name>yarn.resourcemanager.webapp.address.rm2</name>
        <value>slave1:8088</value>
    </property>

    <!-- 配置第二个 ResourceManager 的客户端通信地址 -->
    <property>
        <name>yarn.resourcemanager.address.rm2</name>
        <value>slave1:8032</value>
    </property>

    <!-- 配置第二个 ResourceManager 的调度器通信地址 -->
    <property>
        <name>yarn.resourcemanager.scheduler.address.rm2</name>
        <value>slave1:8030</value>
    </property>

    <!-- 配置第二个 ResourceManager 的资源跟踪器通信地址 -->
    <property>
        <name>yarn.resourcemanager.resource-tracker.address.rm2</name>
        <value>slave1:8031</value>
    </property>

    <!-- 配置用于存储 YARN HA 元数据的 ZooKeeper 地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
    </property>

    <!-- 启用 ResourceManager 的恢复功能 -->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置 ResourceManager 的状态存储类为 ZKRMStateStore,用于 HA 模式 -->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>

    <!-- 配置 NodeManager 允许的环境变量白名单 -->
    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>
mapred-site.xml
bash 复制代码
vi /opt/module/hadoop/etc/hadoop/mapred-site.xml
XML 复制代码
<!-- 指定MapReduce程序运行在Yarn上 -->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
hadoop-env.sh
bash 复制代码
vi /opt/module/hadoop/etc/hadoop/hadoop-env.sh

把下面代码复制到这个文件末尾

bash 复制代码
export JAVA_HOME=/opt/module/java
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
workers
bash 复制代码
vi /opt/module/hadoop/etc/hadoop/workers

localhost删除这个填下面的代码

bash 复制代码
master
slave1
slave2
分发到集群去
bash 复制代码
scp -rq /opt/module/hadoop slave1:/opt/module/
scp -rq /opt/module/hadoop slave2:/opt/module/
三节点上输入以下命令启动journalnode服务

[root@master ~]# hdfs --daemon start journalnode

[root@slave1 ~]# hdfs ---daemon start journalnode

[root@slave2 ~]# hdfs ---daemon start journalnode

初始化 HDFS

master

bash 复制代码
hdfs zkfc -formatZK
hdfs namenode -format

slave1

bash 复制代码
hdfs zkfc -formatZK
hdfs namenode -bootstrapStandby
第二步:启动yarn与hdfs的HA集群(Hadoop HA集群)

启动 HDFS

bash 复制代码
start-dfs.sh

启动 YARN

bash 复制代码
start-yarn.sh

将nn1切换为Active

bash 复制代码
hdfs haadmin -transitionToActive nn1

查看nn1是否Active

bash 复制代码
hdfs haadmin -getServiceState nn1
第三步:在Master节点上使用命令分别查看服务nn2与rm2进程状态

查看服务nn2进程状态

bash 复制代码
hdfs haadmin -getServiceState nn2

查看服务rm2进程状态

bash 复制代码
yarn rmadmin -getServiceState rm2

5、 Hadoop HA配置并启动完毕后,使用jps在slave1节点查看服务进程,将查看命令及结果截图粘贴至客户端桌面【Release\任务A提交结果.docx】中对应的任务序号下。

第一步:使用jps在slave1节点查看服务进程
END

一键三连是我写文章的动力!

声明:此文章为个人学习笔记,如文章有问题欢迎留言探讨,也希望您的指正 !

相关推荐
幽兰的天空2 小时前
Servlet中配置和使用过滤器
hive·hadoop·servlet
神秘打工猴3 小时前
Spark和Mapreduce对比
大数据·spark·mapreduce
写代码的橘子n3 小时前
MapReduce相关概念(自用)
大数据·mapreduce
->yjy6 小时前
微服务-服务保护和分布式事务
分布式·微服务·架构
Kobebryant-Manba8 小时前
kafka小实站
分布式·kafka
雪芽蓝域zzs8 小时前
JavaWeb开发(五)Servlet-ServletContext
hive·hadoop·servlet
qiquandongkh8 小时前
期权懂|期权都有哪些存在的风险因素?
大数据·区块链
杰克逊的日记8 小时前
Kafka集群部署与安装
分布式·kafka
我不会敲代码a9 小时前
hive on spark报错解决(基于hive-3.1.3和spark-2.3.0)
hive·hadoop·spark