HADOOP+SPARK-HA 安装
[一、版本 2](#_Toc72997488)
[二、系统架构 2](#_Toc72997489)
[2.1 服务器架构 2](#_Toc72997490)
[2.2相关的缩写描述: 3](#_Toc72997491)
[2.3 架构说明 3](#_Toc72997492)
[2.4 NN active 3](#_Toc72997493)
[2.5 NN standby 3](#_Toc72997494)
[2.6 JN 3](#_Toc72997495)
[2.7 zk/zkfs 3](#_Toc72997496)
[三、基础环境 4](#_Toc72997497)
[3.1、安装 java 和 psmic 4](#_Toc72997498)
[3.2、服务器分配 4](#_Toc72997499)
[3.3、增加hadoop用户和免密登陆 4](#_Toc72997500)
[3.4、 上传安装包和环境变量 4](#_Toc72997501)
[四、ZOOKEEPER安装配置 5](#_Toc72997502)
[4.1、 配置conf/zoo.conf文件 5](#_Toc72997503)
[4.2、myid配置 5](#_Toc72997504)
[4.3、配置zookeeper 启动/查看/停止脚本 6](#_Toc72997505)
[4.4、zookeeper启动和状态验证 6](#_Toc72997506)
[五、HADOOP 安装配置 6](#_Toc72997507)
[5.1示例配置如下: 6](#_Toc72997508)
[5.2 HADOOP 初始化、启动 8](#_Toc72997509)
[六、HADOOP 主备切换测试 9](#_Toc72997510)
[6.1主备状态查看 9](#_Toc72997511)
[6.2主备状态切换测试 9](#_Toc72997512)
[七、SPARK 安装配置 11](#_Toc72997513)
[7.1、spark-env.sh 11](#_Toc72997514)
[7.2、workers 文件 11](#_Toc72997515)
[7.3、log4j.properties 11](#_Toc72997516)
[7.4、启动spark 11](#_Toc72997517)
[八、SPARK 主备测试 12](#_Toc72997518)
[8.1、spark 主备状态查看 12](#_Toc72997519)
[8.2、spark 主备切换测试 12](#_Toc72997520)
[九、相关启动停止测试 13](#_Toc72997521)
[9.1 相关手工启动 13](#_Toc72997522)
[9.2部分hdfs命令 13](#_Toc72997523)
[9.3部分性能测试命令 14](#_Toc72997524)
##### 一、版本
操作系统--CENTOS 8
hadoop-3.2.2
https://downloads.apache.org/hadoop/core/
spark3.1.1
https://downloads.apache.org/spark/
zookeeper-3.6.3
https://downloads.apache.org/zookeeper/
java-1.8.0-openjdk
##### 二、系统架构
###### 2.1 系统服务架构

###### 2.2相关的缩写描述:
HA: High Availabilty 高可用的意思
zk: ZooKeeper 分布式应用程序服务的组件
NN: NameNode 管理文件系统的元数据信息
DN: DataNode 存储数据的
JN: JournalNode 主要用于NN的数据共享
zkfc: ZooKeeperFailoverControl 监控和管理NN的状态
###### 2.3 架构说明
HA使用active NN和standby NN两个节点解决单点问题,
两个NN节点通过JN集群共享状态,通过ZKFC选举active,
监控NN的状态,实现自动备源,DN会同时向两个NN节点发送心跳
###### 2.4 NN active
1.接受Client的rpc请求并处理,自己写一份editlog,同时向JN集群发送一份editlog
2.同时接受DN的块报告block report, 块位置更新block location
updates和心跳heartbeat
###### 2.5 NN standby
NN standby是NN active的一个热备,一旦切换active状态,可以及时对外提供服务
1.同样的会接受JN上面的editlog,并执行更新,与NN active的元数据保持同样的状态
2.同时接受DN的块报告block report, 块位置更新block location
updates和心跳heartbeat
###### 2.6 JN
用于同步active nn和standby
nn之间的数据,本身由一组jn节点组成的集群,一般是奇数,保证高可用,必须有半数以上存活。也就是说如果有3个journalnode,则可以请允许1个down掉,如果有5个的话,可以允许2个down掉。
###### 2.7 zk/zkfs
zk集群一般是奇数,必须有半数以上存活。也就是说如果有3个zk,则可以请允许1个down掉,如果有5个的话,可以允许2个down掉。
zkfc主要用来监控nn节点的健康状态
zkfc会向zk集群发送心跳,让自己被选举,如果自己被选举主时,会通过rpc调用nn,让nn变成active状态
##### 三、基础环境
###### 3.1、安装 java 和 psmic
yum install java-1.8.0-openjdk-devel.x86\_64 psmisc -y
说明:Psmisc软件包包含 fuser, namenode failover 用到
###### 3.2、服务器分配
5台服务器举例
| IP | HOSNAME | 节点用途 | | | |
|---------------|----------|----------------|----------|----------|-------------|
| 192.168.2.185 | master1 | zookeeper/zkfs | namenode | | |
| 192.168.2.183 | master2 | zookeeper/zkfs | namenode | | |
| 192.168.2.186 | slave1 | zookeeper | | datanode | JournalNode |
| 192.168.2.187 | slave2 | | | datanode | JournalNode |
| 192.168.2.184 | slave3 | | | datanode | JournalNode |
每台/etc/hosts 添加如下
192.168.2.185 master1
192.168.2.183 master2
192.168.2.186 slave1
192.168.2.187 slave2
192.168.2.184 slave3
###### 3.3、增加hadoop用户和免密登陆
3.3.1、**每台**都需要添加hadoop 用户useradd -m hadoop -s /bin/bash
echo 'greatbit@2021' \| passwd hadoop --stdin
usermod -G wheel hadoop
sed -i 's/\#auth\\s\*required\\s\*pam_wheel.so use_uid/auth required
pam_wheel.so group=wheel/'
/etc/pam.d/su
3.3.2、每台设置免密登陆
su hadoop 用户后
\#ssh-keygen -t rsa ssh 版本不同可能导致默认算法无法failover 切换,建议用PEM
\#“RFC4716” (RFC 4716/SSH2 public or private key)
\#“PKCS8” (PEM PKCS8 public key)
ssh-keygen -t rsa -m PEM
ssh-copy-id 本机和其它4台 都要
###### 3.4、 上传安装包和环境变量
3.4.1、安装包
mkdir –p /phd/bin 目录
上传安装包到master1上,解压到/phd/bin下,重命名为:Hadoop , spark ,zookeeper
chown –R hadoop: hadoop /phd 改变文件属主
3.4.2、环境变量
vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java
export SPARK_HOME=/phd/bin/spark
export HADOOP_HOME=/phd/bin/hadoop
export
PATH=\$PATH:\$JAVA_HOME/bin:\$HADOOP_HOME/bin:\$HADOOP_HOME/sbin:\$SCALA_HOME/bin
执行:source /etc/profile
##### 四、ZOOKEEPER安装配置
Hdaoop 用户下:
###### 4.1、 配置conf/zoo.conf文件
tickTime=2000
dataDir=/phd/tmp/zookeeper
dataLogDir=/phd/bin/zookeeper/logs
clientPort=2181
initLimit=10
syncLimit=5
server.1=master1:2888:3888
server.2=master2:2888:3888
server.3=slave1:2888:3888
说明:server.id=host:port1:port2
其中id为一个数字,表示zk进程的id,这个**id也是dataDir目录下myid文件的内容**。
host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。
###### **4.2、myid配置**
myid文件里面就有一个数据就是 id 的值, Zookeeper
启动时会读取这个文件,拿到里面的数据与 zoo.cfg
里面的配置信息比较从而判断到底是那个 server。
在每台的/phd/tmp/zookeeper 下分别修改如下:
master1:myid 为 1
master2:myid 为 2
slave1 : myid 为 3
###### 4.3、配置zookeeper 启动/查看/停止脚本
/phd/bin 下新建 zkServer.sh 755权限
\#!/bin/bash
for host in master1 master2 slave1
do
echo "\$host zkServer.sh \$1"
ssh \$host "source /etc/profile;/phd/bin/zookeeper/bin/zkServer.sh \$1"
done
启动/查看/停止 脚本
./zkServer.sh start\|status\|stop
###### 4.4、zookeeper启动和状态验证
4.4.1、zookeeper.sh start启动后
使用zookeeper.sh status查询三台如下,一个leader ,两个follower
Mode: follower
Mode: leader
Mode: follower
4.4.2、启动后使用jps命令查看3台zookeeper 状态
如看到QuorumPeerMain表明zookeeper正在运行。
##### 五、HADOOP 安装配置
Hdaoop 用户下:
在master1 上修改/phd/bin/hadoop/etc/hadoop 下配置文件
###### **5.1**示例配置如下:
1. yarn-env.sh
1. hadoop-env.sh
2. core-site.xml
3. mapred-site.xml
4. yarn-site.xml
5. hdfs-site.xml
其中workers中服务器上 的 datanode 存储位置每台根据硬盘多少可以不同
> \<!-- dataode存储位置 --\>
> \<property\>
> \<name\>dfs.datanode.data.dir\</name\>
> \<value\>/phd/sdb,/phd/sdc,phd/sdd,/phd/sde\</value\>
> \</property\>
其中master 服务器上的 namenode存储根据硬盘多少可以添加多个
\<!-- namenode存储位置 --\>
\<property\>
\<name\>dfs.namenode.name.dir\</name\>
\<value\>/phd/sdb,/phd/sdc\</value\>
\</property\>
1. workers
\#master1
> \#master2
> slave1
> slave2
> slave3
在服务器较少时,master 也可以作为workers 存储配置datanode存储空间
注意和 namenode 区分存储目录或空间
1. log4j.properties
日志配置中,统一把级别设置为**ERROR**
1. 复制/phd/bin/hadoop 到其它服务器
按需修改 hdfs-site.xml 里datanode 空间
###### 5.2 HADOOP 初始化、启动
1、在所有JN服务器上启动journalnode,执行如下命令:
Hdfs --daemon start journalnode
2、创建主备切换命名空间, 格式化zkfc
在master1上执行如下命令:
Hdfs zkfc –formatZK
3、格式化namenode
在master1上执行以下命令:
hdfs namenode –format
4、master1 启动**主用** namenode
Hdfs --daemon start namenode
5、把NameNode的数据同步到master2 上
Master2 上执行
hdfs namenode –bootstrapStandby
6、启动 所有
6.1、 确保三台zk 已启动
6.2、 cd /phd/bin/hadoop/sbin ; ./start-all.sh
显示如下:
Starting namenodes on [master1 master2]
Starting datanodes
Starting journal nodes [slave3 slave2 slave1]
Starting ZK Failover Controllers on NN hosts [master1 master2]
Starting resourcemanagers on [ master1 master2]
Starting nodemanagers
6.3 、jps查看启动进程
Master:
NameNode
ResourceManager
QuorumPeerMain
DFSZKFailoverController
Slave :
JournalNode
NodeManager
DataNode
则安装成功
##### 六、HADOOP 主备切换测试
###### 6.1主备状态查看
启动后查看hadoop主备状态如下:
Master1: **active**
http://192.168.2.185:9870/dfshealth.html\#tab-overview

master2:**standby**
http://192.168.2.183:9870/dfshealth.html\#tab-overview

###### 6.2主备状态切换测试
Hdaoop 用户下:
6.2.1、master1 上停止namenode,模拟进程kill
hdfs --daemon stop namenode
观察 master2 自动切换为 active
6.2.2、 master1 上再启动 namenode
hdfs --daemon start namenode
观察 master1 状态为standby


5.2.3、重启 master2 服务器,模拟DOWN机
观察 master1 自动切换为 active
5.2.4、 master2 重启动后,手工启动 namenode
hdfs --daemon start namenode
观察 master2 状态为standby


##### 七、SPARK 安装配置
Hadoop 用户下,MASTER1上
###### 7.1、spark-env.sh
修改/phd/bin/spark/conf/spark-env.sh
export SPARK_HOME=\$SPARK_HOME
export JAVA_HOME=/usr/lib/jvm/java
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER
\-Dspark.deploy.zookeeper.url=master1:2181,master2:2181 -D
spark.deploy.zookeeper.dir=/spark"
SPARK_LOCAL_DIRS=/phd/tmp/spark
SPARK_PID_DIR=/phd/tmp/spark
SPARK_DRIVER_MEMORY=1G
export SPARK_LIBARY_PATH=.:\$JAVA_HOME/lib:\$JAVA_HOME/jre/lib
###### 7.2、workers 文件
master1,master2参与计算如下,不参与注释掉
master1
master2
slave1
slave2
slave3
###### 7.3、log4j.properties
日志文件类型修改为ERROR
###### 7.4、启动spark
复制/phd/bin/spark/ 到其余服务器
主master1 上启动spark
cd /phd/bin/spark/sbin ;./start-all.sh
在master2机器上单独启动spark master
cd /phd/bin/spark/sbin ; start-master.sh
master 上jps 查看
Master
Worker
slave 上jps 查看
Worker
##### 八、SPARK 主备测试
###### 8.1、spark 主备状态查看
Master1
<http://192.168.2.185:8080/>

Master2
http://192.168.2.183:8080/

###### 8.2、spark 主备切换测试
7.1.1、停止master1上进程 ,模拟进程kill 测试
Hadoop 用户下:
master1 上停止Master
/phd/bin/spark/sbin/stop-master.sh
master2 自动切换为 alvie
master1 上再启动Master
/phd/bin/spark/sbin./start-master.sh
master1 变为standby
##### 九、相关启动停止测试
###### 9.1 相关手工启动
部分节点down机恢复后,手工加入集群所需启动的服务如下,注意节点用途不同启动服务不同
hadoop
hdfs --daemon start namenode
hdfs --daemon start zkfc
hdfs --daemon start datanode
hdfs --daemon start journalnode
yarn --daemon start resourcemanager
yarn --daemon start nodemanager
spark
start-master.sh / stop-master.sh
start-worker.sh / stop-worker.sh
###### 9.2部分hdfs命令
HDFS命令
创建一个文件夹 hdfs dfs -mkdir /myTask
创建多个文件夹 hdfs dfs -mkdir -p /myTask1/input1
上传文件 hdfs dfs -put /opt/wordcount.txt /myTask/input
查看总目录下的文件和文件夹 hdfs dfs -ls /
查看myTask下的文件和文件夹 hdfs dfs -ls /myTask
查看myTask下的wordcount.txt的内容 hdfs dfs -cat /myTask/wordcount.txt
删除总目录下的myTask2文件夹以及里面的文件和文件夹 hdfs dfs -rmr /myTask2
删除myTask下的wordcount.txt hdfs dfs -rm -r /myTask/wordcount.txt
下载hdfs中myTask/input/wordcount.txt到本地opt文件夹中 hdfs dfs -get
/myTask/input/wordcount.txt /opt
hdfs haadmin –getAllServiceState
master1:8020 standby
master2:8020 active
hadoop getconf
[-namenodes] gets list of namenodes in the cluster.
[-journalNodes] gets list of journal nodes in the cluster.
###### 9.3部分性能测试命令
\#SPARK 测试(带主备)
/phd/bin/spark/bin/spark-submit --master spark://master1:7077,master2:7077
/phd/bin/spark/examples/src/main/python/pi.py 200
TestDFSIO用于测试HDFS的IO性能
cd /phd/bin/hadoop
\#测试写性能 往HDFS中写入10个100MB的文件
bin/hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.2.2-tests.jar
TestDFSIO -write -nrFiles 10 -size 100MB -resFile /tmp/TestDFSIOresults.log
\#测试读性能 HDFS中读取10个100MB的文件
bin/hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.2.2-tests.jar
TestDFSIO -read -nrFiles 10 -size 100MB -resFile /tmp/TestDFSIOresults.log
\#删除测试数据
bin/hadoop jar
share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.2.2-tests.jar
TestDFSIO -clean -resFile /tmp/TestDFSIOresults.log