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

    
        
        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
        
    

修改HDFS配置文件

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

 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

    
    
            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

五、部署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 编辑 添加以下内容
    
    
        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
配置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集群部署完成

你可能感兴趣的:(hadoop,zookeeper,spark)