Zookeeper+Hadoop+Spark+Flink+Kafka+Hbase+Hive 完全分布式高可用集群搭建
下载
https://archive.apache.org/dist/
我最终选择 Zookeeper3.7.1 +Hadoop3.3.5 + Spark-3.2.4 + Flink-1.16.1 + Kafka2.12-3.4.0 + HBase2.4.17 + Hive3.1.3 +JDK1.8.0_391
IP规划
IP | hostname |
192.168.1.5 | node1 |
192.168.1.6 | node2 |
192.168.1.7 | node3 |
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
vim /etc/hosts
[root@node1 ~]# cat >> /etc/hosts << EOF
192.168.1.5 node1
192.168.1.6 node2
192.168.1.7 node3
EOF
[root@node1 ~]# for i in {5,6,7}
do
scp /etc/hosts 192.168.1.$i:/etc/hosts
done
优化ssh连接
#优化ssh连接速度
vim /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no
#或者写成
sed -i 's/#UseDNS\ yes/UseDNS\ no/g; s/GSSAPIAuthentication\ yes/GSSAPIAuthentication\ no/g' /etc/ssh/sshd_config
systemctl restart sshd
#以node1为服务端
[root@node1 ~]# yum install chrony -y
[root@node1 ~]# grep -vE '^#|^$' /etc/chrony.conf
pool ntp.aliyun iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.0.0/24
local stratum 10
logdir /var/log/chrony
[root@node1 ~]# systemctl enable --now chronyd
[root@node1 ~]# chronyc sources -v
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 7 0 +54ms[ +69ms] +/- 193ms
#其他节点为客户端
#node2配置
[root@node2 ~]# yum install chrony -y
[root@node2 ~]# grep -vE '^#|^$' /etc/chrony.conf
pool 192.168.1.11 iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
[root@node2 ~]# systemctl enable --now chronyd
#验证
[root@node2 ~]# chronyc sources -v
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? node1 0 6 0 - +0ns[ +0ns] +/- 0ns
#node3配置
[root@node3 ~]# yum install chrony -y
[root@node3 ~]# scp 192.168.1.12:/etc/chrony.conf /etc/chrony.conf
[root@node3 ~]# systemctl enable --now chronyd
#验证
[root@node3 ~]# chronyc sources -v
210 Number of sources = 1
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? node1 0 6 0 - +0ns[ +0ns] +/- 0ns
#永久关闭防火墙
[root@node1 ~]#for i in {5,6,7}
do
ssh 192.168.1.$i "systemctl disable --now firewalld"
done
#永久关闭selinux
[root@node1 ~]# for i in {5,6,7}
do
ssh 192.168.1.$i "setenforce 0 && sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config"
done
[root@node1 ~]# vim /etc/security/limits.conf
#End of file
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
[root@node1 ~]# for i in {node2,node3}
do
scp /etc/security/limits.conf $i:/etc/security/limits.conf
done
本次安装hadoop3.3.5,根据官网描述Apache Hadoop 3.3.5需要Java 8以上或Java 11才能运行,这里建议使用Java 8;查看habase与jdk对应版本,根据官方描述,建议安装使用 JDK8
上传jdk-8u391-linux-x64.tar.gz
解压
tar -zxvf jdk-8u391-linux-x64.tar.gz -C /usr/local
配置java环境变量
[root@node1 ~]# cat >> .bash_profile << 'EOF'
#Java环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_391
export PATH=$PATH:$JAVA_HOME/bin
EOF
#让配置环境变量生效
[root@node1 ~]# source .bash_profile
#其他节点重复上述步骤安装,或者直接发送过去
[root@node1 ~]# for i in {node2,node3}
do
scp -r /usr/local/jdk1.8.0_391/ $i:/usr/local/
scp /root/.bash_profile $i:/root/
done
创建用户
adduser bigdata
设置密码
passwd bigdata
node1节点操作
切换用户
su bigdata
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
for i in {5,6,7}
do
ssh-copy-id 192.168.1.$i
done
node1服务
su bigdata
下载上传apache-zookeeper-3.7.1-bin.tar.gz 到bigdata用户
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz
mv apache-zookeeper-3.7.1-bin zookeeper
cd zookeeper/conf/
cp zoo_sample.cfg zoo.cfg
#修改完如下
[bigdata@node1 conf]# grep -Ev '^#|^$' zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/bigdata/zookeeper/data
clientPort=2181
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
说明:Zookeeper 集群中有三种角色:Leader、Follower 和 Observer。在一个 Zookeeper 集群中,同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。Zookeeper 的配置很简单,每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样 ,Observer 角色是在 Zookeeper 集群中的一种特殊角色,它的作用是在集群中提供一个只读服务,不参与 Leader 选举,不参与写操作,只是接收 Leader 发送的数据变更通知,并将这些变更通知转发给客户端
设置myid
cd ..
mkdir data
echo 1>data/myid
bigdata@node1 zookeeper]# cd
[bigdata@node1 ~]# cat >> .bash_profile << 'EOF'
#zookeeper环境变量
export ZOOKEEPER_HOME=/home/bigdata/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin
EOF
[root@node1 ~]# source .bash_profile
#将zookeeper文件夹发送到其他节点
[bigdata@node1 ~]$ for i in {node2,node3}
do
scp -r ~/zookeeper $i:~/
scp ~/.bash_profile $i:~/
done
#修改其他节点的myid
[bigdata@node2 ~]$ echo 2 > ~/zookeeper/data/myid
[bigdata@node3 ~]$ echo 3 > ~/zookeeper/data/myid
#所有节点启动,需要在每个节点执行
zkServer.sh start
#编写脚本对zookeeper集群实现批量启动,停止,重启
[bigdata@node1 ~]$ cat > zkserver_manage_all.sh << 'EOF'
#!/bin/bash
echo "$1 zkServer ..."
for i in node1 node2 node3
do
ssh $i "source ~/.bash_profile && zkServer.sh $1"
done
EOF
#添加可执行权限
[bigdata@node1 ~]$ chmod +x zkserver_manage_all.sh
#启动
[bigdata@node1 ~]$ ./zkserver_manage_all.sh start
#停止
[bigdata@node1 ~]$ ./zkserver_manage_all.sh stop
#重启
[bigdata@node1 ~]$ ./zkserver_manage_all.sh restart
[bigdata@node1 ~]$ mv zkserver_manage_all.sh ~/zookeeper/bin/
#查看服务状态,只能查看执行节点的zookeeper状态
zkServer.sh status
#通过编写脚本实现批量检查
[bigdata@node1 ~]$ cat > zkstatus_all.sh << 'EOF'
#!/bin/bash
for node in {node1,node2,node3}
do
status=$(ssh $node 'source ~/.bash_profile && zkServer.sh status 2>&1 | grep Mode')
if [[ $status == "Mode: follower" ]];then
echo "$node是从节点"
elif [[ $status == "Mode: leader" ]];then
echo "$node是主节点"
else
echo "未查询到$node节点zookeeper状态,请检查服务"
fi
done
EOF
#添加执行权限
[bigdata@node1 ~]$ chmod +x zkstatus_all.sh
#通过脚本查看主从
[bigdata@node1 ~]$ ./zkstatus_all.sh
node1是从节点
node2是主节点
node3是从节点
介绍:
Hadoop 是一个开源的分布式计算平台,其中包含了一个分布式文件系统 HDFS。在 HDFS 中,NameNode 和 DataNode 是两个重要的组件。NameNode 是 HDFS 的主服务器,负责管理文件系统的命名空间和客户端对文件的访问。DataNode 是存储实际数据块的服务器,负责存储和检索数据块。
具体来说,NameNode 负责维护整个文件系统的目录树和文件元数据信息,包括文件名、文件属性、文件块列表等。它还负责处理客户端的读写请求,并将这些请求转发给相应的 DataNode。DataNode 负责存储和检索数据块,并向 NameNode 定期汇报自己所持有的数据块列表。
NameNode 和 DataNode 的主要区别在于它们所管理的信息不同。NameNode 管理文件系统的元数据信息,而 DataNode 管理实际的数据块。
本次安装的Hadoop集群为3个节点,两个namenode,三个datanode,规划如下:
IP | 节点 | NameNode | DataNode |
192.168.1.5 | node1 | Y | Y |
192.168.1.6 | node2 | Y | Y |
192.168.1.7 | node3 | N | Y |
下载上传hadoop-3.3.5.tar.gz
#解压缩
[bigdata@node1 ~]$ tar -xf hadoop-3.3.5.tar.gz -C /home/bigdata/
[bigdata@node1 ~]$ mv ~/hadoop-3.3.5/ ~/hadoop
#配置hadoop环境变量
[bigdata@node1 ~]$ cat >> /root/.bash_profile << 'EOF'
#Hadoop环境变量
export HADOOP_HOME=/home/bigdata/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
EOF
[bigdata@node1 ~]$ source ~/.bash_profile
#验证
[bigdata@node1 ~]$ hadoop version
Hadoop 3.3.5
Source code repository https://github/apache/hadoop.git -r 706d88266abcee09ed78fbaa0ad5f74d818ab0e9
Compiled by stevel on 2023-03-15T15:56Z
Compiled with protoc 3.7.1
From source with checksum 6bbd9afcf4838a0eb12a5f189e9bd7
This command was run using /opt/bigdata/hadoop-3.3.5/share/hadoop/common/hadoop-common-3.3.5.jar
#所有节点执行,不然启动服务会报错,可以根据自己hdfs-site.xml文件自行配置
[bigdata@node1 ~]$ mkdir -p /home/bigdata/data/hadoop/tmp
[bigdata@node1 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/name
[bigdata@node1 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/data
[bigdata@node1 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/ha/jn
[bigdata@node2 ~]$ mkdir -p /home/bigdata/data/hadoop/tmp
[bigdata@node2 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/name
[bigdata@node2 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/data
[bigdata@node2 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/ha/jn
[bigdata@node3 ~]$ mkdir -p /home/bigdata/data/hadoop/tmp
[bigdata@node3 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/name
[bigdata@node3 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/data
[bigdata@node3 ~]$ mkdir -p /home/bigdata/data/hadoop/hdfs/ha/jn
#一次执行方式
mkdir -p /home/bigdata/data/hadoop/tmp && mkdir -p /home/bigdata/data/hadoop/hdfs/name && mkdir -p /home/bigdata/data/hadoop/hdfs/data && mkdir -p /home/bigdata/data/hadoop/hdfs/ha/jn
workers
文件是用来指定Hadoop集群中所有的工作节点(即DataNode和NodeManager节点)的配置文件
[bigdata@node1 ~]$ cd /home/bigdata/hadoop/etc/hadoop/
[bigdata@node1 hadoop]$ cat > workers << 'EOF'
node1
node2
node3
EOF
#三个节点配置一样
[bigdata@node1 hadoop]$ vim core-site.xml
fs.defaultFS
hdfs://mycluster
hadoop.tmp.dir
/home/bigdata/data/hadoop/tmp
ha.zookeeper.quorum
node1:2181,node2:2181,node3:2181
ipc.client.connect.max.retries
100
ipc.client.connect.retry.interval
10000
io.file.buffer.size
65536
#多master高可用配置,所有节点配置一样
#HA中的NameNode最少要有2个,也可以配置更多。建议不要超过5个,最好是3个,因为更多的NameNode意味着更多的通讯开销。
#fencing 和 edits 在实验中,如果你不想配置,可以去掉
[bigdata@node1 hadoop]$ vim hdfs-site.xml
dfs.nameservices
mycluster
dfs.ha.namenodes.mycluster
nn1,nn2
dfs.namenode.rpc-address.mycluster.nn1
node1:9000
dfs.namenode.http-address.mycluster.nn1
node1:50070
dfs.namenode.rpc-address.mycluster.nn2
node2:9000
dfs.namenode.http-address.mycluster.nn2
node2:50070
dfs.namenode.name.dir
/home/bigdata/data/hadoop/hdfs/name
namenode上存储hdfs命名空间元数据
dfs.datanode.data.dir
/home/bigdata/data/hadoop/hdfs/data
datanode上数据块的物理存储位置
dfs.replication
3
副本个数,默认是3,应小于datanode数量
dfs.webhdfs.enabled
true
dfs.permissions.enabled
false
dfs.datanode.max.transfer.threads
4096
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/home/bigdata/.ssh/id_rsa
dfs.ha.automatic-failover.enabled
true
dfs.namenode.shared.edits.dir
qjournal://node1:8485;node2:8485/mycluster
dfs.journalnode.edits.dir
/home/bigdata/data/hadoop/hdfs/ha/jn
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_391
export HADOOP_HOME=/home/bigdata/hadoop
export HADOOP_CONF_DIR=/home/bigdata/hadoop/etc/hadoop
export YARN_CONF_DIR=/home/bigdata/hadoop/etc/hadoop
for i in {node2,node3}
do
scp -r ~/hadoop $i:~/
scp ~/.bash_profile $i:~/
done
#启动JN,格式化之前要优先启动JN,现在是两个nn,要通过JN传递数据。
[bigdata@node1 ~]$ hdfs --daemon start journalnode
[bigdata@node2 ~]$ hdfs --daemon start journalnode
#格式化NN,将node1作为主节点
[bigdata@node1 ~]$ hdfs namenode -format
#格式化NameNode会在指定的NameNode数据目录中创建一个名为current的子目录,用于存储NameNode的元数据和命名空间信息
[bigdata@node1 ~]$ ll /home/bigdata/data/hadoop/hdfs/name/
总用量 0
drwx------ 2 bigdata bigdata 112 7月 21 21:51 current
#node2上的nn作为主备,在node2执行拷贝元数据之前,需要先启动node1上的namanode
[bigdata@node1 ~]$ hdfs --daemon start namenode
#拷贝元数据,在Hadoop HDFS中初始化一个备用的NameNode节点。当主要的NameNode节点出现故障时,备用的NameNode节点就可以快速启动并接管服务,而无需重新加载整个文件系统的元数据,提供高可用性。注意在node2上执行
[bigdata@node2 ~]$ hdfs namenode -bootstrapStandby
#启动node2上的namenode
[bigdata@node2 ~]$ hdfs --daemon start namenode
#格式化zk,用于监控和管理Hadoop HDFS中的主备NameNode节点切换的组件。此命令会创建一个ZooKeeper目录结构,并将初始的主备NameNode节点信息存储在ZooKeeper中。这样,ZKFC就可以使用ZooKeeper来进行主备节点的管理和切换。
#在设置Hadoop HDFS的高可用性环境时,需要先使用hdfs namenode -bootstrapStandby命令初始化备用的NameNode节点,然后使用hdfs zkfc -formatZK 命令初始化ZKFC。这两个命令的组合可以确保Hadoop HDFS的主备节点切换的可靠性和高可用性。
[bigdata@node1 ~]$ hdfs zkfc -formatZK
#启动zk客户端
zkCli.sh #可以通过ls查看目录结构
[zk: localhost:2181(CONNECTED) 0] ls /
[hadoop-ha, zookeeper]
#启动datanode,或者下面用集群命令 start-dfs.sh 一键启动所有服务
hdfs --daemon start datanode
#注意:以后启动hdfs就只需要先启动zookeeper,然后执行start-dfs.sh就可以了
[bigdata@node1 hadoop]$ stop-dfs.sh
Stopping namenodes on [node1 node2]
Stopping datanodes
Stopping journal nodes [node2 node1]
Stopping ZK Failover Controllers on NN hosts [node1 node2]
#启动所有节点
[bigdata@node1 hadoop]$ start-dfs.sh
Starting namenodes on [node1 node2]
Starting datanodes
node3: WARNING: /home/bigdata/hadoop/logs does not exist. Creating.
Starting journal nodes [node2 node1]
Starting ZK Failover Controllers on NN hosts [node1 node2]
#验证高可用
[bigdata@node1 hadoop]$ hdfs haadmin -getServiceState nn1
active
[bigdata@node1 hadoop]$ hdfs haadmin -getServiceState nn2
standby
#如果两台都是standby,可以通过 hdfs haadmin -transitionToActive --forcemanual nn1 命令强制将nn1转换为为active
#访问页面验证
到浏览器访问,192.168.1.5:50070 和 192.168.1.6:50070 验证
修改mapred-site.xml
[bigdata@node1 hadoop]$ pwd
/home/bigdata/hadoop/etc/hadoop
[bigdata@node1 hadoop]$ vim mapred-site.xml
mapreduce.framework.name
yarn
指定mapreduce使用yarn框架
修改yarn-site.xml
[bigdata@node1 hadoop]$ vim yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.ha.enabled
true
是否开启高可用
yarn.resourcemanager.cluster-id
yrc
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
node1
yarn.resourcemanager.hostname.rm2
node2
yarn.resourcemanager.address.rm1
node1:8032
yarn.resourcemanager.address.rm2
node2:8032
yarn.resourcemanager.scheduler.address.rm1
node1:8030
yarn.resourcemanager.scheduler.address.rm2
node2:8030
yarn.resourcemanager.resource-tracker.address.rm1
node1:8031
yarn.resourcemanager.resource-tracker.address.rm2
node2:8031
yarn.resourcemanager.zk-address
node1:2181,node2:2181,node3:2181
yarn.resourcemanager.recovery.enabled
true
yarn.resourcemanager.store.class
org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
yarn.nodemanager.env-whitelist
JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
同步配置文件到其他节点
[bigdata@node1 hadoop]$ for i in {node2,node3}
do
scp mapred-site.xml yarn-site.xml $i:~/hadoop/etc/hadoop/
done
启动yarn服务
#启动服务
[bigdata@node1 hadoop]$ start-yarn.sh
Starting resourcemanagers on [ node1 node2]
Starting nodemanagers
#查看resourcemanagers主从
[bigdata@node1 hadoop]$ yarn rmadmin -getServiceState rm1
active
[bigdata@node1 hadoop]$ yarn rmadmin -getServiceState rm2
standby
#如果某些原因yarn没有启动成功,可以单独启动
yarn-daemon.sh start resourcemanager
浏览器访问 192.168.1.5:8088
浏览器访问 192.168.1.6:8088
可以看到自动跳转到http://node1:8088/cluster,前提需要在电脑的hosts里配置上如下信息,不然ip变成node1时访问会失败
#配置电脑文件路径
C:\Windows\System32\drivers\etc\hosts
192.168.1.5 node1
192.168.1.6 node2
#访问hdfs目录,查看是否正常
[bigdata@node3 ~]$ hdfs dfs -ls /
#hdfs相关命令
hdfs dfsadmin -report #获取HDFS集群的详细报告信息:数据节点状态,容量和使用情况,块数量,网络拓扑信息
hdfs dfsadmin -safemode get #查看hdfs是否为安全模式
hdfs haadmin -getServiceState nn1 #nn1 为配置文件中设置的namenode的id
hdfs haadmin -getServiceState nn2
#hdfs相关命令
hdfs dfs -mkdir -p /a/b/c
hdfs dfs -ls /a/b/
touch mytest.txt
hdfs dfs -put mytest.txt /a/b/c
hdfs dfs -get /a/b/c/mytest.txt
hdfs dfs -cp /a/b/c/mytest.txt /home/
hdfs dfs -cat /a/b/c/mytest.txt
hdfs dfs -mv /a/b/c/mytest.txt /a/
hdfs dfs -du [-s] [-h] /a
hdfs dfs -rm /a/mytest.txt
hdfs dfs -chown oldsixl /a/b/c
hdfs dfs -chomd 777 /a/b/c
集群节点规划,双master实现高可用,所有节点也可以同时配置成master和worker
节点 | 角色 |
node1 | master |
node2 | Master,slave |
node3 | slave |
上传 spark-3.2.4-bin-hadoop3.2-scala2.13.tgz
解压 tar -zxvf spark-3.2.4-bin-hadoop3.2-scala2.13.tgz -C /home/bigdata/
mv spark-3.2.4-bin-hadoop3.2-scala2.13 spark
[bigdata@node1 ~]$ cat >> .bash_profile << 'EOF'
#Spark环境变量
export SPARK_HOME=/home/bigdata/spark
export PATH=$PATH:$SPARK_HOME/bin
EOF
[bigdata@node1 ~]$ cd /home/bigdata/spark/conf/
[bigdata@node1 conf]$ cp spark-env.sh.template spark-env.sh
#修改spark-env.sh
[bigdata@node1 conf]$ grep -v ^# spark-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_391/
export HADOOP_CONF_DIR=/home/bigdata/hadoop/etc/hadoop/
export YARN_CONF_DIR=/home/bigdata/hadoop/etc/hadoop/
export SPARK_MASTER_IP=node1
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8090
export SPARK_WORKER_WEBUI_PORT=8091
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181 -Dspark.deploy.zookeeper.dir=/home/bigdata/zookeeper"
说明:
JAVA_HOEM:设置Java安装目录的路径
HADOOP_CONF_DIR:设置Hadoop的配置目录路径
YARN_CONF_DIR:设置YARN的配置目录路径,YARN是Hadoop的资源管理器
SPARK_MASTER_IP:设置Spark主节点的IP地址或主机名。Spark主节点负责协调集群中的各个工作节点。
SPARK_MASTER_PORT:设置Spark主节点的端口号。通过该端口,工作节点可以与Spark主节点进行通信。
SPARK_MASTER_WEBUI_PORT:设置Spark主节点的Web界面端口号。可以通过该端口访问Spark主节点的Web界面。
SPARK_WORKER_WEBUI_PORT:设置Spark工作节点的Web界面端口号。可以通过该端口访问Spark工作节点的Web界面。
[bigdata@node1 conf]$ cp workers.template workers
#修改workers文件
[bigdata@node1 conf]$ cat > workers << EOF
node2
node3
EOF
[bigdata@node1 conf]$ cd /home/bigdata/hadoop/etc/hadoop/
[bigdata@node1 hadoop]$ cp core-site.xml hdfs-site.xml /home/bigdata/spark/conf/
[bigdata@node1 hadoop]$ for i in {node2,node3}
do
scp -r /home/bigdata/spark $i:/home/bigdata/
scp ~/.bash_profile $i:~/
done
#在node2上配置备用master节点
[bigdata@node2 ~]$ vim /home/bigdata/spark/conf/spark-env.sh
#将 export SPARK_MASTER_IP=node1 改为
export SPARK_MASTER_IP=node2
#由于启动命令和hadoop下的命令文件名一样,我们需要cd到spark目录下执行
[bigdata@node1 hadoop]$ cd /home/bigdata/spark/sbin/
[bigdata@node1 sbin]$ ./start-all.sh
#启动备master
[bigdata@node2 ~]$ cd /home/bigdata/spark/sbin
[bigdata@node2 sbin]$ ./start-master.sh
#jps查看主节点都有Master,node3节点有Worker
页面访问查看主备
浏览器访问 192.168.1.5:8090 可以看到上面状态 Status: ALIVE
浏览器访问 192.168.1.6:8090 可以看到上面状态 Status: STANDBY
可以看到两个master,node1节点alive为主,node2节点standby为备用master
我们关闭node1上的master
[bigdata@node1 sbin]$ jps
5265 DFSZKFailoverController
4835 DataNode
2133 QuorumPeerMain
4693 NameNode
6901 Master
5079 JournalNode
6167 ResourceManager
7191 Jps
6319 NodeManager
[bigdata@node1 sbin]$ kill -9 6901
刷新页面,192.168.1.5:8090 已经访问不到了,我们在访问node2,多刷新几次,可以看到master已经切换到node2
再次启动node1上的master,关闭node2 可以看到,master切换回了node1,状态为alive
[bigdata@node1 sbin]$ spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster /home/bigdata/spark/examples/jars/spark-examples_2.13-3.2.4.jar
#再次测试,没有报错了
[bigdata@node1 sbin]$ spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster /home/bigdata/spark/examples/jars/spark-examples_2.13-3.2.4.jar
client token: N/A
diagnostics: N/A
ApplicationMaster host: node2
ApplicationMaster RPC port: 39869
queue: default
start time: 1704966405185
final status: SUCCEEDED
tracking URL: http://node1:8088/proxy/application_1704964396313_0001/
user: bigdata
浏览器访问 http://192.168.1.5:8088
可以看到执行的任务,第一次失败,第二次成功
#修改Hdfs配置
[bigdata@node1 ~]$ cd /home/bigdata/hadoop/etc/hadoop/
# vim mapred-site.xml 编辑 添加以下内容
mapreduce.jobhistory.address
node1:10020
mapreduce.jobhistory.webapp.address
node1:19888
#修改yarn配置文件
# vim yarn-site.xml 编辑添加以下内容
yarn.log-aggregation-enable
true
yarn.log.server.url
http://node1:19888/jobhistory/logs/
yarn.log-aggregation.retain-seconds
86400
#同步配置到其他节点以及saprk目录下
[bigdata@node1 ~]$ cd /home/bigdata/hadoop/etc/hadoop/
[bigdata@node1 hadoop]$ for i in {node1,node2,node3}
do
scp mapred-site.xml yarn-site.xml $i:/home/bigdata/hadoop/etc/hadoop/
scp mapred-site.xml yarn-site.xml $i:/home/bigdata/spark/conf/
done
#修改配置文件
[bigdata@node1 sbin]$ cd ../conf/
[bigdata@node1 conf]$ cp spark-defaults.conf.template spark-defaults.conf
[bigdata@node1 conf]$ vim spark-defaults.conf
#添加或者放开注释并修改
spark.eventLog.enabled true
spark.eventLogpress true
spark.eventLog.dir hdfs://mycluster/spark-logs
spark.yarn.historyServer.address node1:18080,node2:18080
spark.history.ui.port 18080
spark.history.fs.logDirectory hdfs://mycluster/spark-logs
spark.history.retainedApplications 30
#说明:
spark.eventLog.enabled 设置为 true 表示启用Spark事件日志记录功能。
spark.eventLogpress 指定Spark事件日志是否需要进行压缩
spark.eventLog.dir 指定了事件日志的存储路径
spark.yarn.historyServer.address 指定了YARN历史服务器的地址
spark.history.ui.port 指定了Spark历史服务器UI的端口号
spark.history.fs.logDirectory 指定了历史记录文件在文件系统中的存储路径
spark.history.retainedApplications 指定了历史服务器要保留的应用程序数量,设置为 30,表示历史服务器将保留最近提交的30个应用程序的历史记录。
#同步上述文件至其他节点
[bigdata@node1 conf]$ scp spark-defaults.conf node2:/home/bigdata/spark/conf/
[bigdata@node1 conf]$ scp spark-defaults.conf node3:/home/bigdata/spark/conf/
#创建时间日志的存储路径,需要在启动历史服务器之前创建,不然报错找不到路径或文件
[bigdata@node1 conf]$ hdfs dfs -mkdir /spark-logs
#重启hdfs,yarn,spark
#停止spark服务
[bigdata@node1 ~]$ $SPARK_HOME/sbin/stop-all.sh
#停止yarn,hdfs
[bigdata@node1 ~]$ $HADOOP_HOME/sbin/stop-all.sh
#启动hadoop服务
[bigdata@node1 ~]$ which start-all.sh
/home/bigdata/hadoop/sbin/start-all.sh
[bigdata@node1 ~]$ start-all.sh
#启动yarn历史服务器
[bigdata@node1 ~]$ mapred --daemon start historyserver
#启动spark
[bigdata@node1 ~]$ $SPARK_HOME/sbin/start-all.sh
#启动spark历史服务器
[bigdata@node1 ~]$ $SPARK_HOME/sbin/start-history-server.sh
[bigdata@node2 ~]$ $SPARK_HOME/sbin/start-history-server.sh
#停止spark历史服务器
# $SPARK_HOME/sbin/stop-history-server.sh
浏览器访问查看
配置 C:\Windows\System32\drivers\etc\hosts 添加
192.168.1.5 node1
192.168.1.6 node2
192.168.1.7 node3
访问 http://192.168.1.5:19888
访问 http://192.168.1.6:18080
查看日志
至此,spark集群部署完成