Zookeeper+Hadoop+Spark+Flink+Kafka+Hbase+Hive

说明

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 |

二、系统配置

2.1配置hostname、ip

hostnamectl set-hostname node1

hostnamectl set-hostname node2

hostnamectl set-hostname node3

2.2编辑hosts

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

2.3优化ssh连接

优化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

2.4配置时间同步

#以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

2.5关闭防火墙和selinux

#永久关闭防火墙
[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

2.6修改文件打开限制

[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

2.7JDK环境

本次安装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

2.8创建大数据用户

创建用户

adduser bigdata

设置密码

passwd bigdata

2.9配置免密登录

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

三、部署zookeeper集群

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

配置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

配置zk环境变量

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集群

介绍:

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

创建hadoop需要用到的目录

#所有节点执行,不然启动服务会报错,可以根据自己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
<configuration>
    <property>
        <!--配置默认的文件系统-->
        <name>fs.defaultFS</name>
        <!--用的是HDFS作为文件系统,还要指定HDFS放在哪台主机上运行,9000默认端口号,如果配置了HA,fs.defaultFs的值应该是nameservice的名称,如hdfs-site.xml文件中dfs.nameservices的值为mycluster,此处填写hdfs://mycluster-->
        <value>hdfs://mycluster</value>
    </property>

    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/bigdata/data/hadoop/tmp</value>
    </property>
    
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>
        <!--HDFS连接zookeeper集群的地址和端口-->
    </property>
    <property>
        <name>ipc.client.connect.max.retries</name>
        <value>100</value>
        <!--设置重连次数,默认10次-->
    </property>
    
    <property>
  	    <name>ipc.client.connect.retry.interval</name>
  	    <value>10000</value>
        <!--设置客户端在重试建立服务器连接之前等待的毫秒数,默认1000-->
    </property>
    
    <property>
        <name>io.file.buffer.size</name>
        <value>65536</value>
        <!--设置在读写数据时的缓存大小,这个缓存区的大小应该是硬件页面大小的倍数(在 Intel x86 上是 4096),它决定了在读写操作中缓冲了多少数据。较大的缓存可以提供更高的数据传输,但这也意味着更大的内存消耗和延迟.默认情况下,io.file.buffer.size 的值为 4096,但是建议将其设置为65536(64k),也可以设置更高,比如131702等-->
    </property>
</configuration>

修改HDFS配置文件

#多master高可用配置,所有节点配置一样
#HA中的NameNode最少要有2个,也可以配置更多。建议不要超过5个,最好是3个,因为更多的NameNode意味着更多的通讯开销。
#fencing 和 edits 在实验中,如果你不想配置,可以去掉

[bigdata@node1 hadoop]$ vim hdfs-site.xml

<configuration>
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
        <!--定义hdfs集群id号,需要和core-site.xml中的fs.defaultFS保持一致-->
    </property>    
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
        <!--定义hdfs集群中的namenode的id号-->
    </property>
    
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>node1:9000</value>
        <!--nn1的RPC通信地址-->
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>node1:50070</value>
        <!--nn1的http通信地址-->
    </property> 
        <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>node2:9000</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>node2:50070</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/bigdata/data/hadoop/hdfs/name</value>
        <description>namenode上存储hdfs命名空间元数据 </description>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/home/bigdata/data/hadoop/hdfs/data</value>
        <description>datanode上数据块的物理存储位置</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
        <description>副本个数,默认是3,应小于datanode数量</description>
    
    </property>
    <!--如果想让solr索引存放到hdfs中,则还须添加下面2个属性-->
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
        <!--用于启用或禁用 HDFS ACL(简单权限)。当 dfs.permissions.enabled 设置为 false 时,任何用户都可以在 HDFS 中的任何位置创建或删除文件或目录。将此属性设置为 false 后,您可以访问所有其他 Hadoop 服务,例如 Hive、HBase 等-->
    </property>
    
    <property>
        <name>dfs.datanode.max.transfer.threads</name>
        <value>4096</value>
        <!--用于设置 DataNode 在进行文件传输时的最大线程数. 如果集群中有某台 DataNode 主机的这个值比其他主机的大,那么出现的问题是,这台主机上存储的数据相对别的主机比较多,导致数据分布不均匀的问题,即使 balance 仍然会不均匀-->
    </property>
       
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
        <!-- HDFS集群中两个namenode切换状态时的隔离方法 -->
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/bigdata/.ssh/id_rsa</value>
        <!-- HDFS集群中两个namenode切换状态时的隔离方法的密钥 -->
    </property>
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
        <!-- 故障自动转移,HA的HDFS集群自动切换namenode的开关-->
    </property>
    
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node1:8485;node2:8485/mycluster</value>
        <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/home/bigdata/data/hadoop/hdfs/ha/jn</value>
        <!-- journalnode集群中用于保存edits文件的目录 -->
    </property>
    
    <property>
        <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        <!-- 定义HDFS的客户端连接HDFS集群时返回active namenode地址 -->
    </property>
    
</configuration>

hadoop-env.sh配置

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

同步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 验证

配置yarn和MapReduce

修改mapred-site.xml

[bigdata@node1 hadoop]$ pwd
/home/bigdata/hadoop/etc/hadoop
[bigdata@node1 hadoop]$ vim mapred-site.xml

<configuration>    
    <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
            <description>指定mapreduce使用yarn框架</description>
    </property>
</configuration>

修改yarn-site.xml

[bigdata@node1 hadoop]$ vim yarn-site.xml

<configuration> 
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
    <description>是否开启高可用</description>
  </property>
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yrc</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>node1</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>node2</value>
  </property>
   
  <!-- 指定 rm 的内部通信地址 --> 
  <property> 
    <name>yarn.resourcemanager.address.rm1</name>  
    <value>node1:8032</value> 
  </property>  
  <property> 
    <name>yarn.resourcemanager.address.rm2</name>  
    <value>node2:8032</value> 
  </property> 

  <!-- 指定 AM 向 rm 申请资源的地址 -->  
  <property> 
    <name>yarn.resourcemanager.scheduler.address.rm1</name>  
    <value>node1:8030</value> 
  </property>    
  <property> 
    <name>yarn.resourcemanager.scheduler.address.rm2</name>  
    <value>node2:8030</value> 
  </property>

  <!-- 指定供 NM 连接的地址 -->  
  <property> 
    <name>yarn.resourcemanager.resource-tracker.address.rm1</name>  
    <value>node1:8031</value> 
  </property>  
  <property> 
    <name>yarn.resourcemanager.resource-tracker.address.rm2</name>  
    <value>node2:8031</value> 
  </property>    
  
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>node1:2181,node2:2181,node3: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>  
  <!-- 环境变量的继承 -->  
  <property> 
    <name>yarn.nodemanager.env-whitelist</name>  
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLAS SPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> 
  </property>  
</configuration>

同步配置文件到其他节点

[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

五、部署Spark集群

集群节点规划,双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

配置spark文件

[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

复制hadoop配置到spark配置目录下

[bigdata@node1 conf]$ cd /home/bigdata/hadoop/etc/hadoop/
[bigdata@node1 hadoop]$ cp core-site.xml hdfs-site.xml /home/bigdata/spark/conf/

将spark文件分发到其他节点

[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

启动spark

#由于启动命令和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

查看yarn

浏览器访问 http://192.168.1.5:8088

可以看到执行的任务,第一次失败,第二次成功

配置历史服务器

配置yarn历史服务器
#修改Hdfs配置
[bigdata@node1 ~]$ cd /home/bigdata/hadoop/etc/hadoop/
# vim mapred-site.xml 编辑 添加以下内容
    <!--Spark on Yarn-->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>node1:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>node1:19888</value>
    </property>

#修改yarn配置文件
# vim yarn-site.xml 编辑添加以下内容
  <!--Spark on Yarn-->
  <!-- 是否开启聚合日志 -->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <!-- 配置日志服务器的地址 -->
  <property>
    <name>yarn.log.server.url</name>
    <value>http://node1:19888/jobhistory/logs/</value>
  </property>
  <!-- 配置日志过期时间,单位秒 -->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>86400</value>
  </property>

#同步配置到其他节点以及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
配置spark历史服务器
#修改配置文件
[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集群部署完成

相关推荐
Data跳动9 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
lucky_syq11 小时前
流式处理,为什么Flink比Spark Streaming好?
大数据·flink·spark
清平乐的技术专栏11 小时前
Hive SQL 查询所有函数
hive·hadoop·sql
节点。csn13 小时前
Hadoop yarn安装
大数据·hadoop·分布式
不惑_13 小时前
小白入门 · 腾讯云轻量服务器部署 Hadoop 3.3.6
服务器·hadoop·腾讯云
csding1113 小时前
写入hive metastore报问题Permission denied: user=hadoop,inode=“/user/hive”
数据仓库·hive·hadoop
NiNg_1_23414 小时前
基于Hadoop的数据清洗
大数据·hadoop·分布式
goTsHgo15 小时前
在 Spark 上实现 Graph Embedding
大数据·spark·embedding
程序猿小柒16 小时前
【Spark】Spark SQL执行计划-精简版
大数据·sql·spark
隔着天花板看星星16 小时前
Spark-Streaming集成Kafka
大数据·分布式·中间件·spark·kafka