实验任务一:Linux 基础环境配置

1)查看 ip
3个虚拟机都执行 ip a 命令,查看当前IP地址和网络接口

2)修改主机名
master下执行

hostnamectl set-hostname master
bash

slave1下执行

hostnamectl set-hostname slave1
bash

slave2下执行

hostnamectl set-hostname slave2
bash

3)修改主机映射
三个虚拟机依次执行:

vi /etc/hosts

写入

192.168.26.148 master
192.168.26.149 slave1
192.168.26.150 slave2

4)关闭防火墙
三台都要执行

systemctl stop firewalld
systemctl disable firewalld

查看防火墙状态

 systemctl status firewalld

5)设置SSH免密登陆

仅master执行
master输入

ssh-keygen -t rsa

三次回车出现密文如下(大概这个样子,不完全一样)

+--[ RSA 2048]----+
|  .o.+.   ..     |
|. . o..   .E.    |
|.o.++  . * .     |
|..+o..  + =      |
|   +.   S+       |
|    .. .  .      |
|      .          |
|                 |
|                 |
+-----------------+
ssh-copy-id -i /root/.ssh/id_rsa.pub master
ssh-copy-id -i /root/.ssh/id_rsa.pub slave1
ssh-copy-id -i /root/.ssh/id_rsa.pub slave2

依次输入 yes和root 用户的密码
依次验证
登录一次就及时退出一次(exit)

ssh master
ssh slave1
ssh slave2

6)安装Java JDK环境

执行

mkdir /opt/software/  

创建新华三考证指定目录
执行

cp jdk-8u152-linux-x64.tar.gz /opt/software/   

把安装包拷贝到新华三考证指定目录/opt/software/
下面开始新华三的JDK实验步骤:
在master主机执行:
a)解压缩JDK包 执行

tar -zxvf /opt/software/jdk-8u152-linux-x64.tar.gz  -C /usr/local/src/

b)JDK目录改名

 mv /usr/local/src/jdk1.8.0_152/ /usr/local/src/java

c)更改JDK目录拥有者为root用户

chown -R root:root /usr/local/src/java  

然后执行ll命令查看拥有者是root用户
d)配置 java 的环境变量
执行

vi /etc/profile

删除最后几行没用的配置参数,新增加以下配置参数

#jdk
export JAVA_HOME=/usr/local/src/java   #JAVA_HOME 指向 JAVA 安装目录
export PATH=$PATH:$JAVA_HOME/bin       #将 JAVA 安装目录加入 PATH 路径

然后执行

source /etc/profile 

使得环境变量生效
e)依次执行以下两个命令:

update-alternatives --install /usr/bin/java java /usr/local/src/java/bin/java 200
update-alternatives --set java /usr/local/src/java/bin/java

实验任务二:ZooKeeper集群安装部署

以下在master主机执行:
实验准备:

cp zookeeper-3.4.8.tar.gz /opt/software/ 

把ZooKeeper安装包拷贝到新华三考证指定目录/opt/software/

1)解压缩ZooKeeper安装包

tar -zxvf /opt/software/zookeeper-3.4.8.tar.gz  -C /usr/local/src/

2)ZooKeeper目录改名

mv /usr/local/src/zookeeper-3.4.8/ /usr/local/src/zookeeper

3)创建 ZooKeeper 数据目录

执行

mkdir /usr/local/src/zookeeper/data

再执行

mkdir /usr/local/src/zookeeper/logs

说明:data 是用来存放数据的,logs 是用来记录日志的
4)配置 ZooKeeper 环境变量
执行

vi /etc/profile

新增加以下配置参数

#zk
export ZK_HOME=/usr/local/src/zookeeper
export PATH=$PATH:$ZK_HOME/bin

5)修改 zoo.cfg 配置文件
a)复制一个zoo.cfg文件 执行

 cp /usr/local/src/zookeeper/conf/zoo_sample.cfg /usr/local/src/zookeeper/conf/zoo.cfg

b)切换到配置文件所在目录

cd /usr/local/src/zookeeper/conf/

c)修改zoo.cfg 执行

vi zoo.cfg

修改并增加以下配置参数:

dataDir=/usr/local/src/zookeeper/data
dataLogDir=/usr/local/src/zookeeper/logs

末尾新增加以下配置参数:

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

6)创建 myid 配置文件
执行

echo 1 > /usr/local/src/zookeeper/data/myid

7)分发JDK
a)执行

scp -r /usr/local/src/java/ root@slave1:/usr/local/src/

b)执行

scp -r /usr/local/src/java/ root@slave2:/usr/local/src/

8)分发 ZooKeeper 集群
a)执行

scp -r /usr/local/src/zookeeper/ root@slave1:/usr/local/src/

b)执行

scp -r /usr/local/src/zookeeper/ root@slave2:/usr/local/src/

9)分发环境变量并使其生效
a)执行

scp /etc/profile root@slave1:/etc/

b)执行

scp /etc/profile root@slave2:/etc/

三台全部执行刷新环境变量

source /etc/profile 

使环境变量生效

10)修改另外两个主机的 myid 配置文件
a)在slave1执行

echo 2 > /usr/local/src/zookeeper/data/myid

b)在slave2执行

echo 3 > /usr/local/src/zookeeper/data/myid

11)启动 ZooKeeper 集群
三台依次执行

zkServer.sh start

12)查看 ZooKeeper 集群状态
三台依次执行

zkServer.sh status  

执行jps
查看进程QuorumPeerMain

实验任务三:Hadoop HA高可用集群安装部署

实验准备:在master执行

cp hadoop-2.7.1.tar.gz /opt/software/ 

把Hadoop安装包拷贝到新华三考证指定目录/opt/software/

1)解压缩Hadoop安装包
在master执行

tar -zxvf /opt/software/hadoop-2.7.1.tar.gz -C /usr/local/src/

Hadoop目录改名 执行

mv /usr/local/src/hadoop-2.7.1 /usr/local/src/hadoop

2)配置 Hadoop 环境变量
在master执行

vi /etc/profile

新增加以下配置参数:

#hadoop enviroment
export HADOOP_HOME=/usr/local/src/hadoop #HADOOP_HOME 指向 JAVA 安装目录
export HADOOP_PREFIX=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

3)配置Hadoop环境变量
在master执行

vi /usr/local/src/hadoop/etc/hadoop/hadoop-env.sh

修改hadoop-env.sh 配置文件,末尾新增加以下配置参数:

export JAVA_HOME=/usr/local/src/java
export HADOOP_CONF_DIR=/usr/local/src/hadoop/etc/hadoop/

记得执行

source /usr/local/src/hadoop/etc/hadoop/hadoop-env.sh 

使得Hadoop环境变量生效

4)修改core-site.xml配置文件
在master执行

vi /usr/local/src/hadoop/etc/hadoop/core-site.xml

<configuration></configuration>之间添加如下配置参数:

<!-- 指定 hdfs 的 nameservice 为 mycluster -->
<property>
 <name>fs.defaultFS</name>
 <value>hdfs://mycluster</value>
</property>
<property>
 <name>hadoop.tmp.dir</name>
 <value>file:/usr/local/src/hadoop/tmp</value>
</property>
<!-- 指定 zookeeper 地址 -->
<property>
 <name>ha.zookeeper.quorum</name>
 <value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!-- hadoop 链接 zookeeper 的超时时长设置 -->
<property>
 <name>ha.zookeeper.session-timeout.ms</name>
 <value>30000</value>
 <description>ms</description>
</property>
<property>
 <name>fs.trash.interval</name>
 <value>1440</value>
</property>

5)修改hdfs-site.xml配置文件
在master执行

vi /usr/local/src/hadoop/etc/hadoop/hdfs-site.xml

<configuration> </configuration>之间添加如下配置参数:

<!-- journalnode 集群之间通信的超时时间 -->
 <property>
 <name>dfs.qjournal.start-segment.timeout.ms</name>
 <value>60000</value>
 </property>
 <!--指定 hdfs 的 nameservice 为 mycluster,需要和 core-site.xml 中的保持一致
dfs.ha.namenodes.[nameservice id]为在 nameservice 中的每一个 NameNode 设置唯一标示
符。配置一个逗号分隔的NameNode ID列表。这将是被DataNode识别为所有的NameNode。
如果使用"mycluster"作为 nameservice ID,并且使用"master""slave1"作为 NameNodes 标
示符 -->
 <property>
 <name>dfs.nameservices</name>
 <value>mycluster</value>
 </property>
 <!-- mycluster 下面有两个 NameNode,分别是 master,slave1 -->
 <property>
 <name>dfs.ha.namenodes.mycluster</name>
 <value>master,slave1</value>
 </property>
 <!-- master 的 RPC 通信地址 -->
 <property>
 <name>dfs.namenode.rpc-address.mycluster.master</name>
 <value>master:8020</value>
 </property>
 <!-- slave1 的 RPC 通信地址 -->
 <property>
 <name>dfs.namenode.rpc-address.mycluster.slave1</name>
 <value>slave1:8020</value>
 </property>
 <!-- master 的 http 通信地址 -->
 <property>
 <name>dfs.namenode.http-address.mycluster.master</name>
 <value>master:50070</value>
 </property>
 <!-- slave1 的 http 通信地址 -->
 <property>
 <name>dfs.namenode.http-address.mycluster.slave1</name>
 <value>slave1:50070</value>
 </property>

<!-- 指定 NameNode 的 edits 元数据的共享存储位置。也就是 JournalNode 列表
 该 url 的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId
 journalId 推荐使用 nameservice,默认端口号是:8485 -->
 <property>
 <name>dfs.namenode.shared.edits.dir</name>
 <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
 </property>
 <!-- 配置失败自动切换实现方式 -->
 <property>
 <name>dfs.client.failover.proxy.provider.mycluster</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>
 <property>
 <name>dfs.permissions.enabled</name>
 <value>false</value>
 </property>
 <property>
 <name>dfs.support.append</name>
 <value>true</value>
 </property>
 <!-- 使用 sshfence 隔离机制时需要 ssh 免登陆 -->
 <property>
 <name>dfs.ha.fencing.ssh.private-key-files</name>
 <value>/root/.ssh/id_rsa</value>
 </property>
 <!-- 指定副本数 -->
 <property>
 <name>dfs.replication</name>
 <value>2</value>
 </property>
 <property>
 <name>dfs.namenode.name.dir</name>
 <value>/usr/local/src/hadoop/tmp/hdfs/nn</value>
 </property>
 <property>
  <name>dfs.datanode.data.dir</name>
  <value>/usr/local/src/hadoop/tmp/hdfs/dn</value>
 </property>
 <!-- 指定 JournalNode 在本地磁盘存放数据的位置 -->
 <property>
 <name>dfs.journalnode.edits.dir</name>
 <value>/usr/local/src/hadoop/tmp/hdfs/jn</value>
 </property>
 <!-- 开启 NameNode 失败自动切换 -->
 <property>
 <name>dfs.ha.automatic-failover.enabled</name>
 <value>true</value>
 </property>
 <!-- 启用 webhdfs -->
 <property>
 <name>dfs.webhdfs.enabled</name>
 <value>true</value>
 </property>
 <!-- 配置 sshfence 隔离机制超时时间 -->
 <property>
 <name>dfs.ha.fencing.ssh.connect-timeout</name>
 <value>30000</value>
 </property>
 <property>
 <name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
 <value>60000</value>
 </property>

6)修改mapred-site.xml配置文件
在master执行

cp /usr/local/src/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/src/hadoop/etc/hadoop/mapred-site.xml

在master执行

vi /usr/local/src/hadoop/etc/hadoop/mapred-site.xml

<configuration> </configuration>之间添加如下配置参数:

<!-- 指定 mr 框架为 yarn 方式 -->
 <property>
 <name>mapreduce.framework.name</name>
 <value>yarn</value>
 </property>
 <!-- 指定 mapreduce jobhistory 地址 -->
 <property>
 <name>mapreduce.jobhistory.address</name>
 <value>master:10020</value>
 </property>
 <!-- 任务历史服务器的 web 地址 -->
 <property>
 <name>mapreduce.jobhistory.webapp.address</name>
 <value>master:19888</value>
 </property>

7)修改yarn-site.xml配置文件
在master执行

vi /usr/local/src/hadoop/etc/hadoop/yarn-site.xml

<configuration> </configuration>之间添加如下配置参数:

<!-- Site specific YARN configuration properties -->
 <!-- 开启 RM 高可用 -->
 <property>
 <name>yarn.resourcemanager.ha.enabled</name>
 <value>true</value>
 </property>
 <!-- 指定 RM 的 cluster id -->
 <property>
 <name>yarn.resourcemanager.cluster-id</name>
 <value>yrc</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>master</value>
 </property>
 <property>
 <name>yarn.resourcemanager.hostname.rm2</name>
 <value>slave1</value>
 </property>
 <!-- 指定 zk 集群地址 -->
 <property>
 <name>yarn.resourcemanager.zk-address</name>
 <value>master:2181,slave1:2181,slave2:2181</value>
 </property>
 <property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
 </property>
 <property>
 <name>yarn.log-aggregation-enable</name>
 <value>true</value>
</property>
 <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>

8) 配置 slaves 配置文件
在master执行

vi /usr/local/src/hadoop/etc/hadoop/slaves

删除localhost并增加以下内容:

master
slave1
slave2

9)为多个服务进程创建存放数据的目录
在master, slave1和slave2都要依次执行以下命令:

mkdir -p /usr/local/src/hadoop/tmp/hdfs/nn
mkdir -p /usr/local/src/hadoop/tmp/hdfs/dn
mkdir -p /usr/local/src/hadoop/tmp/hdfs/jn
mkdir -p /usr/local/src/hadoop/tmp/logs

10)分发 Hadoop安装目录到其他主机
在master依次执行:

scp -r /usr/local/src/hadoop/ root@slave1:/usr/local/src/
scp -r /usr/local/src/hadoop/ root@slave2:/usr/local/src/

再依次在slave1和slave2执行

source /usr/local/src/hadoop/etc/hadoop/hadoop-env.sh 

使得Hadoop环境变量生效

11)分发环境变量到其他主机并使其生效

scp /etc/profile root@slave1:/etc/
scp /etc/profile root@slave2:/etc/

再依次在slave1和slave2执行

source /etc/profile

使环境变量生效

12)启动 journalnode 守护进程
在master执行

hadoop-daemons.sh start journalnode

再依次在3个主机执行jsp命命令,查看JournalNode进程应该已经启动

13)格式化NameNode

在master执行格式化命令

hdfs namenode -format

出现提示“Storage directory /usr/local/src/hadoop/tmp/hdfs/nn has been successfully formatted.” 说明NameNode格式化成功

14)格式化ZooKeeper
在master执行

hdfs zkfc -formatZK

注册所需要的ZNode节点
出现提示“Successfully created /hadoop-ha/mycluster in ZK.” 说明ZooKeeper格式化成功

15)在master启动 namenode 和 resourcemanager 进程
在master执行

hadoop-daemon.sh start namenode

在master执行

yarn-daemon.sh start resourcemanager

16)同步NameNode元数据
在master执行

scp -r /usr/local/src/hadoop/tmp/hdfs/nn/*  root@slave1:/usr/local/src/hadoop/tmp/hdfs/nn/ 

拷贝master的NameNode元数据到slave1节点

17)在slave1 启动 namenode 和 resourcemanager 进程
在slave1执行

hadoop-daemon.sh start namenode

在slave1执行

yarn-daemon.sh start resourcemanager

18) 启动HDFS集群
在master执行

start-dfs.sh 

启动HDFS集群

19) 启动YARN集群
在master执行

start-yarn.sh 

启动YARN集群

20)检查Hadoop HA集群各节点的服务进程
在master, slave1和slave2都要依次执行jps命令:

root@master ~# jps
6224 DataNode
5521 JournalNode
6693 NodeManager
6809 Jps
2858 QuorumPeerMain
5802 ResourceManager
5659 NameNode
6510 DFSZKFailoverController

root@slave1 ~# jps
4308 JournalNode
4597 DataNode
4806 NodeManager
4934 Jps
4392 NameNode
4490 ResourceManager
3132 QuorumPeerMain
4719 DFSZKFailoverController

root@slave2 ~]# jps
4195 DataNode
4452 Jps
3175 QuorumPeerMain
4120 JournalNode
4332 NodeManager

21) 查看HDFS和YARN自带的监控Web页面
浏览器访问

http://192.168.26.148:50070/dfshealth.html

http://192.168.26.149:50070/dfshealth.html

查看两个web页面的NameNode状态信息,应该一个显示为Active,另一个显示为Standby,说明HDFS HA高可用集群安装并运行正常

浏览器访问

http://192.168.26.148:8088/cluster/cluster

http://192.168.26.149:8088/cluster/cluster

查看两个web页面的ResourceManager HA state,应该一个显示为Active,另一个显示为Standby,说明YARN HA高可用集群运行正常

22)高可用性验证
(1)验证主备NameNode自动切换
a)分别检查standby和master两台主机的NameNode的主备状态,假如是master主机的NameNode处于Active状态,standy主机的NameNode处于StandBy状态
执行

hdfs haadmin -getServiceState master

应该输出:
Active
执行

hdfs haadmin -getServiceState slave1

应该输出:
StandBy
b)在master执行命令

hadoop-daemon.sh stop namenode

停止Active状态的NameNode
c)检查slave1主机的NameNode的主备状态,看其状态是否能通过zookeeper自动切换为Active,执行

hdfs haadmin -getServiceState slave1

应该输出:
active
d)在master主机执行命令

hadoop-daemon.sh start namenode

重新启动之前停止的NameNode,再执行

hdfs haadmin -getServiceState master

查看master主机的NameNode状态是否切换为Standby,应该输出:
standby
(2)验证主备ResourceManager自动切换
a)在master执行

yarn rmadmin -getServiceState rm1

查看master主机的ResourceManager的主备状态,假设为Active
b)在master执行

yarn rmadmin -getServiceState rm2

查看stanby主机的ResourceManager的主备状态,假设为Standby
c)在master执行

yarn-daemon.sh stop resourcemanager

停止master主机的ResourceManager进程
d)在master执行

yarn rmadmin -getServiceState rm2

查看stanby主机的ResourceManager的主备状态,应该自动切换为Active
e)在master执行

yarn-daemon.sh start resourcemanager

重新启动master主机的ResourceManager进程
f)在master命令

yarn rmadmin -getServiceState rm1

查看master主机的ResourceManager的主备状态,应该变成Standby

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐