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集群部署完成

相关推荐
费曼乐园23 分钟前
Kafka与ZooKeeper
zookeeper·kafka
重生之Java再爱我一次3 小时前
Hive部署
数据仓库·hive·hadoop
想做富婆3 小时前
大数据,Hadoop,HDFS的简单介绍
大数据·hadoop·分布式
WorkAgent4 小时前
windows下本地部署安装hadoop+scala+spark-【不需要虚拟机】
hadoop·spark·scala
ShareBeHappy_Qin6 小时前
ZooKeeper 中的 ZAB 一致性协议与 Zookeeper 设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色)
分布式·zookeeper·云原生
村口蹲点的阿三15 小时前
Spark SQL 中对 Map 类型的操作函数
javascript·数据库·hive·sql·spark
唯余木叶下弦声16 小时前
PySpark之金融数据分析(Spark RDD、SQL练习题)
大数据·python·sql·数据分析·spark·pyspark
重生之Java再爱我一次17 小时前
Hadoop集群搭建
大数据·hadoop·分布式
中东大鹅18 小时前
MongoDB的索引与聚合
数据库·hadoop·分布式·mongodb