Hadoop 高可用集群完全分布式安装教程一篇就够用(zookeeper、spark、hbase、mysql、hive)
写在之前,Hadoop完全分布式集群资源配置规划情况
一、全局基本配置
1、更改静态网络
命令如下:
# 检查虚拟机是否能够ping通www.baidu.com
service network restart # 尝试重启网络服务
# 修改网络服务为静态网络 指定路由以及DNS服务器
vim /etc/sysconfig/network-scripts/ifcfg-ens33
文件内容如下:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO="static"
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=c494a46e-a55b-431a-9b5e-b2bbdc767606
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.201.201# 虚拟机对应的ip地址
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.201.2# 网关地址
DNS1=114.114.114.114 # DNS服务器地址
然后重启网络:
service network restart
再次测试 网络是否能够正常联通
ping www.baidu.com
2、关闭防火墙
#关闭防火墙
systemctl stop firewalld
#禁用防火墙
systemctl disable firewalld
#查看防火墙状态
systemctl status firewalld
3、配置主机名(方便后期Hadoop集群服务)
#给3台虚拟机设置主机名分别为hadoop01、hadoop02和hadoop03。
#在第一台机器操作
hostnamectl set-hostname hadoop01
#在第二台机器操作
hostnamectl set-hostname hadoop02
#在第三台机器操作
hostnamectl set-hostname hadoop03
设置完毕后在ssh工具处刷新即可
4、编辑hosts头文件(Linux)
vi /etc/hosts # 编辑hosts文件
# 在最后一行添加
192.168.201.201 hadoop01
192.168.201.202 hadoop02
192.168.201.203 hadoop03
5、编辑hosts头文件(windows)
# 在Windows中打开C:\Windows\System32\drivers\etc路径,在hosts文件中添加如下内容:
192.168.201.201 hadoop01
192.168.201.202 hadoop02
192.168.201.203 hadoop03
6、ssh免密登录
# 每一个机器都需要这样操作
ssh-keygen -b 1024 -t rsa
cd .ssh
ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03
7、编写集群分发脚本
# 需要在用户目录下新建一个bin文件夹,然后存放集群分发脚本xsync
# 为什么要新建bin文件夹的原因 执行 echo $PATH 查看系统环境路径 能够全局执行
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
mkdir /root/bin
vim xsync
chmod 777 xsync
# 如果报错
# bash: rsync: command not found
# rsync: connection unexpectedly closed (0 bytes received so far) [sender]
# rsync error: remote command not found (code 127) at io.c(226) [sender=3.1.2]
# 下载 rsync 即可 因为作者使用的从机使用的是最小化安装版本 因此需要额外安装rsync
yum -y install rsync
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop01 hadoop02 hadoop03
do
echo -e "\n==================== $host ===================="
#3. 遍历所有目录,逐个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exist!
fi
done
done
echo -e "\n"
8、编写集群查看jps进行脚本
cd ~/bin
vim jpsall
#!/bin/bash
for host in hadoop01 hadoop02 hadoop03
do
echo -e "\n=============== $host ==============="
ssh $host "export JAVA_HOME=/opt/module/jdk1.8.0_391 && export PATH=\$JAVA_HOME/bin:\$PATH && jps"
done
echo -e "\n"
# 保存 给文件赋予执行权限
chmod 777 jpsall
二、jdk安装配置
# 解压
tar -zxvf jdk-8u391-linux-x64.tar.gz -C /opt/module/
# 设置环境变量
vim /etc/profile
#在末尾追加环境变量
export JAVA_HOME=/opt/module/jdk1.8.0_391
export PATH=$JAVA_HOME/bin:$PATH
# 使用集群分发命令 将 环境变量 分发至其他从机
xsync /etc/profile
# 激活环境变量
source /etc/profile
[root@hadoop03 module]# java -version
java version "1.8.0_391"
Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)
三、zookeeper安装配置
zookeeper集群 搭建
# 解压
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /opt/module/
cd /opt/module/
mv apache-zookeeper-3.7.1-bin/ zookeeper-3.7.1
cd zookeeper-3.7.1/conf/
#zk配置文件是 zoo.cfg ,创建并配置
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
# 修改
dataDir=/opt/module/zookeeper-3.7.1/data
# 添加 对应主机名的id识别全局端口
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
cd ..
# 创建存放数据的文件夹
mkdir data
# 创建myid编号
echo 1 > data/myid
# 配置zookeeper环境变量
vim /etc/profile
export ZOOKEEPER_HOME=/opt/module/zookeeper-3.7.1
export PATH=$PATH:$ZOOKEEPER_HOME/bin
# 使用集群分发命令 将 环境变量 分发至其他从机
xsync /etc/profile
# 激活环境变量
source /etc/profile
# 使用集群分发命令 将 zookeeper 分发至其他从机
xsync /opt/module/zookeeper-3.7.1
# 分别修改 hadoop02 和 hadoop03 的 myid 编号
[root@hadoop02 module]# echo 2 > /opt/module/zookeeper-3.7.1/data/myid
[root@hadoop03 module]# echo 3 > /opt/module/zookeeper-3.7.1/data/myid
#所有节点启动,需要在每个节点执行
zkServer.sh start
zookeeper集群 启动命令
# 编写脚本对zookeeper集群实现批量启动,停止,重启
# 在 用户目录下的 bin 文件下 创建集群启动文件
cd /root/bin/
vim zkserver
#!/bin/bash
echo "$1 zkServer ..."
for i in {hadoop02,hadoop01,hadoop03}
do
ssh $i "source /etc/profile && zkServer.sh $1"
done
# 给文件赋予权限
chmod 777 zkserver
zookeeper集群 状态检查命令
# 通过编写脚本实现批量检查
vim zkstatus
#!/bin/bash
for host in {hadoop02,hadoop01,hadoop03}
do
status=$(ssh $host 'source /etc/profile && zkServer.sh status 2>&1 | grep Mode')
if [[ $status == "Mode: follower" ]];then
echo "$host是从节点"
elif [[ $status == "Mode: leader" ]];then
echo "$host是主节点"
else
echo "未查询到$host节点zookeeper状态,请检查服务"
fi
done
# 给文件赋予权限
chmod 777 zkstatus
四、hadoop搭建集群
主机环境配置
cd /opt/software/
tar -zxvf hadoop-3.3.5.tar.gz -C /opt/module/
# 配置 hadoop 环境变量
vim /etc/profile
export HADOOP_HOME=/opt/module/hadoop-3.3.5
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# 激活环境变量
source /etc/profile
[root@hadoop01 software]# hadoop version
Hadoop 3.3.5
Source code repository https://github.com/apache/hadoop.git -r 706d88266abcee09ed78fbaa0ad5f74d818ab0e9
Compiled by stevel on 2023-03-15T15:56Z
Compiled with protoc 3.7.1
From source with checksum 6bbd9afcf4838a0eb12a5f189e9bd7
编辑hadoop hdfs核心配置文件
编辑主机workers文件
vim workers
#填入从机名
hadoop01
hadoop02
hadoop03
修改core-site.xml文件
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>/data/hadoop/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<!--HDFS连接zookeeper集群的地址和端口-->
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<!--设置重连次数,默认10次-->
<value>100</value>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<!--设置客户端在重试建立服务器连接之前等待的毫秒数,默认1000-->
<value>10000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<!--设置在读写数据时的缓存大小,这个缓存区的大小应该是硬件页面大小的倍数(在 Intel x86 上是 4096),它决定了在读写操作中缓冲了多少数据。较大的缓存可以提供更高的数据传输>
,但这也意味着更大的内存消耗和延迟.默认情况下,io.file.buffer.size 的值为 4096,但是建议将其设置为65536(64k),也可以设置更高,比如131702等-->
<value>65536</value>
</property>
</configuration>
配置hdfs-site.xml文件
vim hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<!--定义hdfs集群id号,需要和core-site.xml中的fs.defaultFS保持一致-->
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<!--定义hdfs集群中的namenode的id号-->
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<!--nn1的RPC通信地址-->
<value>hadoop01:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<!--nn1的http通信地址-->
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/hdfs/namenode</value>
<description>namenode上存储hdfs命名空间元数据</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/hdfs/datanode</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>
<!--用于启用或禁用 HDFS ACL(简单权限)。当 dfs.permissions.enabled 设置为 false 时,任何用户都可以在 HDFS 中的任何位置创建或删除文件或目录。将此属性设置为 false 后,您
可以访问所有其他 Hadoop 服务,例如 Hive、HBase 等-->
<value>false</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
<!--用于设置 DataNode 在进行文件传输时的最大线程数. 如果集群中有某台 DataNode 主机的这个值比其他主机的大,那么出现的问题是,这台主机上存储的数据相对别的主机比较多,导致
数据分布不均匀的问题,即使 balance 仍然会不均匀-->
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<!-- HDFS集群中两个namenode切换状态时的隔离方法 -->
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<!-- HDFS集群中两个namenode切换状态时的隔离方法的密钥 -->
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<!-- 故障自动转移,HA的HDFS集群自动切换namenode的开关-->
<value>true</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<value>qjournal://hadoop01:8485;hadoop02:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<!-- journalnode集群中用于保存edits文件的目录 -->
<value>/data/hadoop/hdfs/ha/jn</value>
</property>
</configuration>
修改hadoop-env.sh文件
vim hadoop-env.sh
#修改JAVA_HOME的路径
export JAVA_HOME=/opt/module/jdk1.8.0_391
设置hdfs集群启动时,允许root用户启动
vim /etc/profile
#设置hdfs集群启动时,允许root用户启动
HDFS_NAMENODE_USER=root
export HDFS_NAMENODE_USER
HDFS_DATANODE_USER=root
export HDFS_DATANODE_USER
HDFS_JOURNALNODE_USER=root
export HDFS_JOURNALNODE_USER
HDFS_ZKFC_USER=root
export HDFS_ZKFC_USER
# 激活环境变量
source /etc/profile
启动hadoop hdfs系统
# 使用集群分发命令 将 hadoop 以及 环境变量 分发至其他从机
xsync /opt/module/hadoop-3.3.5
xsync /etc/profile
# 激活环境变量
source /etc/profile
#启动JN,格式化之前要优先启动JN,现在是两个nn,要通过JN传递数据。
[root@hadoop01 ~]# hdfs --daemon start journalnode
[root@hadoop02 ~]# hdfs --daemon start journalnode
# 由于没有事先创建logs文件夹,因此会自动创建
# WARNING: /opt/module/hadoop-3.3.5/logs does not exist. Creating.
# 格式化NN,将hadoop01作为主节点
[root@hadoop01 ~]# hdfs namenode -format
# 格式化NameNode会在指定的NameNode数据目录中创建一个名为current的子目录,用于存储NameNode的元数据和命名空间信息
[root@hadoop01 ~]# ll /data/hadoop/hdfs/namenode/
total 0
drwx------. 2 root root 112 Nov 28 04:26 current
# hadoop02上的nn作为主备,在hadoop02执行拷贝元数据之前,需要先启动hadoop01上的namanode
[root@hadoop01 ~]# hdfs --daemon start namenode
# 拷贝元数据,在Hadoop HDFS中初始化一个备用的NameNode节点。当主要的NameNode节点出现故障时,备用的NameNode节点就可以快速启动并接管服务,而无需重新加载整个文件系统的元数据,提供高可用性。
# 注意在hadoop02上执行
[root@hadoop02 ~]# hdfs namenode -bootstrapStandby
在hadoop02上,执行元数据复制
# 启动hadoop02上的namenode
[root@hadoop02 ~]# 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的主备节点切换的可靠性和高可用性。
[root@hadoop01 ~]# hdfs zkfc -formatZK
# 注意 执行上述步骤前,需要先开启zookeeper集群服务!!!
# 启动zk客户端
[root@hadoop01 ~]# zkCli.sh
# 可以通过ls查看目录结构
[zk: localhost:2181(CONNECTED) 5] ls /
[hadoop-ha, zookeeper]
# quit 退出客户端
# 启动 datanode 或者使用下面用集群命令 start-dfs.sh 一键启动所有服务
[root@hadoop01 ~]# hdfs --daemon start datanode
# 注意:以后启动 hdfs 就只需要先启动 zookeeper,然后执行 start-dfs.sh 就可以了
# 启动 zookeeper 只需要 执行 zkserver start 即可
[root@hadoop01 ~]# start-dfs.sh
Starting namenodes on [hadoop01 hadoop02]
Last login: Tue Nov 28 11:16:37 CST 2023 from 192.168.201.1 on pts/0
Starting datanodes
Last login: Tue Nov 28 11:17:31 CST 2023 on pts/0
Starting journal nodes [hadoop02 hadoop01]
Last login: Tue Nov 28 11:17:34 CST 2023 on pts/0
Starting ZK Failover Controllers on NN hosts [hadoop01 hadoop02]
Last login: Tue Nov 28 11:18:02 CST 2023 on pts/0
# 验证高可用
[root@hadoop01 ~]# hdfs haadmin -getServiceState nn1
active
[root@hadoop01 ~]# hdfs haadmin -getServiceState nn2
standby
# 如果两台都是standby,可以通过 hdfs haadmin -transitionToActive --forcemanual nn1 命令强制将nn1转换为为active
# 访问页面验证
# 到浏览器访问,hadoop01:50070 (192.168.201.201:50070) 和 (hadoop01:50070) 192.168.201.202:50070 验证
# 如果出现主从节点状态不正常的情况,执行以下命令
[root@hadoop01 ~]# hdfs haadmin -failover nn2 nn1
Failover to NameNode at hadoop01/192.168.201.201:9000 successful
编辑hadoop yarn核心配置文件
编辑mapred-site.xml文件
[root@hadoop01 ~]# cd /opt/module/hadoop-3.3.5/etc/hadoop/
vim mapred-site.xml
# 添加以下配置
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>指定mapreduce使用yarn框架</description>
</property>
</configuration>
编辑yarn-site.xml文件
vim yarn-site.xml
<configuration>
# 这里是在文件包着的里面写入内容 !!!
<!-- Site specific YARN configuration properties -->
<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>hadoop01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop02</value>
</property>
<!-- 指定 rm 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop02:8032</value>
</property>
<!-- 指定 AM 向 rm 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop02:8030</value>
</property>
<!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop02:8031</value>
</property>
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03: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>
设置yarn集群启动时,允许root用户启动
vim /etc/profile
#允许root用户启动yarn集群服务
YARN_RESOURCEMANAGER_USER=root
export YARN_RESOURCEMANAGER_USER
YARN_NODEMANAGER_USER=root
export YARN_NODEMANAGER_USER
# 激活环境变量
source /etc/profile
# 集群分发 修改后的hadoop文件
xsync hadoop-3.3.5/
# 集群分发 环境变量
xsync /etc/profile
[root@hadoop01 ~]# start-yarn.sh
Starting resourcemanagers on [ hadoop01 hadoop02]
Last login: Tue Nov 28 13:42:30 CST 2023 on pts/0
Starting nodemanagers
Last login: Tue Nov 28 13:45:56 CST 2023 on pts/0
[root@hadoop01 ~]# jps
20018 DataNode
19443 NodeManager
20501 DFSZKFailoverController
20294 JournalNode
19865 NameNode
19274 ResourceManager
18798 QuorumPeerMain
20814 Jps
# 产生这样的原因 可能是一开始 启动zookeeper服务时导致,hadoop01不是主节点(已修改)
[root@hadoop01 module]# yarn rmadmin -getServiceState rm1
standby
[root@hadoop01 module]# yarn rmadmin -getServiceState rm2
active
#如果某些原因yarn没有启动成功,可以单独启动
yarn-daemon.sh start resourcemanager
集群启动 推荐方式 (分步启动 可能导致主节点出现问题)
# 先启动 zookeeper 同步服务
zkserver start
# 然后直接启动hadoop集群
start-all.sh
[root@hadoop01 ~]# zkserver start
start zkServer ...
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@hadoop01 ~]# start-all.sh
Starting namenodes on [hadoop01 hadoop02]
Last login: Tue Nov 28 14:45:58 CST 2023 from 192.168.201.1 on pts/0
Starting datanodes
Last login: Tue Nov 28 14:47:02 CST 2023 on pts/0
Starting journal nodes [hadoop02 hadoop01]
Last login: Tue Nov 28 14:47:05 CST 2023 on pts/0
Starting ZK Failover Controllers on NN hosts [hadoop01 hadoop02]
Last login: Tue Nov 28 14:47:11 CST 2023 on pts/0
Starting resourcemanagers on [ hadoop01 hadoop02]
Last login: Tue Nov 28 14:47:16 CST 2023 on pts/0
Starting nodemanagers
Last login: Tue Nov 28 14:47:23 CST 2023 on pts/0
[root@hadoop01 ~]# jps
3779 ResourceManager
4195 Jps
3941 NodeManager
2390 QuorumPeerMain
2663 NameNode
3113 JournalNode
2827 DataNode
3340 DFSZKFailoverController
启动查看命令 : hadoop01:8088 hadoop01:50070
至此hadoop ha 高可用集群已搭建完毕,可以尝试进行中断任一节点的服务,然后刷新web浏览器,即可查看状态进行切换为active状态,检测完后可以重新开启
kill -9 2663 (namenode 节点对应的 进程id)
# 在浏览器上多刷新几次 并且打开 hadoop02:50070 查看状态
# 重新开启 namenode 节点
hdfs --daemon start namenode
hadoop01:50070
hadoop02:50070
hadoop01:8088 (输入hadoop02:8088 时,会切换至hadoop01:8088)
因为 ha 机制 同时刻 只允许一个 yarn 服务状态为active ,否则会出现 脑裂 (split-brain)
五、spark集群搭建
主机环境配置
cd /opt/software/
tar -zxvf spark-3.2.4-bin-hadoop3.2-scala2.13.tgz -C /opt/module/
cd /opt/module
mv spark-3.2.4-bin-hadoop3.2-scala2.13/ spark-3.2.4/
# 配置 spark 环境变量
vim /etc/profile
export SPARK_HOME=/opt/module/spark-3.2.4
export PATH=$PATH:$SPARK_HOME/bin
# 激活环境变量
source /etc/profile
配置spark 核心文件
编辑 spark-env.sh 文件
cd /opt/module/spark-3.2.4/conf/
mv spark-env.sh.template spark-env.sh
vim spark-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_391
export HADOOP_CONF_DIR=/opt/module/hadoop-3.3.5/etc/hadoop/
export YARN_CONF_DIR=/opt/module/hadoop-3.3.5/etc/hadoop/
export SPARK_MASTER_IP=hadoop01
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=hadoop01:2181,hadoop02:2181,hadoop03:2181 -Dspark.deploy.zookeeper.dir=/opt/module/zookeeper-3.7.1"
编辑 workers 文件
mv workers.template workers
vim workers
# 修改为以下内容
hadoop01
hadoop02
hadoop03
spark 集群 测试
启动 spark 测试
# 将 hadoop 相关配置文件 复制到 spark
cd /opt/module/hadoop-3.3.5/etc/hadoop
cp core-site.xml hdfs-site.xml /opt/module/spark-3.2.4/conf/
# 同步 spark 文件目录
xsync /opt/module/spark-3.2.4
# 同步 环境变量
xsync /etc/profile
#在 hadoop02 上配置备用 master 节点
[root@hadoop02 ~]# vim /opt/module/spark-3.2.4/conf/spark-env.sh
#将 export SPARK_MASTER_IP=hadoop01 改为
export SPARK_MASTER_IP=hadoop02
# 没有 vim 编辑器 需要使用 yum 下载
yum install -y vim
#由于启动命令和hadoop下的命令文件名一样,我们需要cd到spark目录下执行
[root@hadoop01 ~]# cd /opt/module/spark-3.2.4/sbin
[root@hadoop01 sbin]# ./start-all.sh
[root@hadoop01 sbin]# jps
3779 ResourceManager
3941 NodeManager
2390 QuorumPeerMain
7078 Worker
2663 NameNode
6952 Master
3113 JournalNode
2827 DataNode
3340 DFSZKFailoverController
7245 Jps
# 在 hadoop02 上 开启 备用 Master 节点
[root@hadoop02 ~]# cd /opt/module/spark-3.2.4/sbin
[root@hadoop02 sbin]# ./start-master.sh
#jps查看hadoop01 和 hadoop02 上都有Master,hadoop03节点有Worker
浏览器访问 hadoop01:8090 可以看到上面状态 Status: ALIVE
浏览器访问 hadoop02:8090 可以看到上面状态 Status: STANDBY
中断 master 切换测试
# 强制中断 Master 服务
[root@hadoop01 sbin]# jps
3779 ResourceManager
3941 NodeManager
7445 Jps
2390 QuorumPeerMain
7078 Worker
2663 NameNode
6952 Master
3113 JournalNode
2827 DataNode
3340 DFSZKFailoverController
[root@hadoop01 sbin]# kill -9 6952
刷新页面,hadoop01:8090 已经访问不到了,我们在访问 hadoop02:8090时,多刷新几次,可以看到 master 已经切换到hadoop02
# 在 hadoop01 上 重新启动 Master 服务
./start-master.sh
# 然后 重新执行 开启 hadoop02 上的 备用 Master 进程
# 此时 发现 hadoop01 上的 状态回到了 active 状态, 而 hadoop02 为 standby 状态
启动 spark 计算服务测试
# 使用 spark 计算 pi
[root@hadoop01 sbin]# spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster /opt/module/spark-3.2.4/examples/jars/spark-examples_2.13-3.2.4.jar
- 代码解释:
- spark-submit: 是用于提交 Spark 应用程序的命令行工具。
- –class org.apache.spark.examples.SparkPi: 指定要运行的 Spark 应用程序的主类,这里是 SparkPi 示例应用程序。这是一个计算 π 值的简单 Spark 应用程序。
- –master yarn: 指定 Spark 应用程序运行的主节点(master)。在这里,yarn 表示使用 YARN 作为集群管理器。
- –deploy-mode cluster: 指定 Spark 应用程序的部署模式,cluster 表示在集群上运行。在这种模式下,驱动程序(Driver)会在集群中的某个节点上启动,而不是在提交命令的本地机器上启动。
- /opt/module/spark-3.2.4/examples/jars/spark-examples_2.13-3.2.4.jar : 这是 Spark 应用程序的 JAR 文件的路径,其中包含了 Spark 应用程序的代码和依赖。在这里,SparkPi 示例的 JAR 文件路径。
- 完整解释是 使用 spark-submit 提交一个 Spark 应用程序,这个应用程序的主类是 org.apache.spark.examples.SparkPi,在 YARN 集群上以 cluster 模式运行,其代码和依赖位于 /opt/module/spark-3.2.4/examples/jars/spark-examples_2.13-3.2.4.jar 这个 JAR 文件中。
# 可以在 hadoop01:8088 上查看 运行状态 以及 日志信息 等
配置 yarn 历史服务器
配置hadoop mapred-site.xml
cd /opt/module/hadoop-3.3.5/etc/hadoop/
vim mapred-site.xml
# 添加以下配置项
<!--Spark on Yarn-->
<property>
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
配置hadoop yarn-site.xml
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://hadoop01:19888/jobhistory/logs/</value>
</property>
<!-- 配置日志过期时间,单位秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
同步文件到其他主机 以及 spark 配置中
# 同步至其他主机的 hadoop 文件目录中
[root@hadoop01 hadoop]# xsync mapred-site.xml yarn-site.xml
# 复制文件 并 同步至 其他主机的 spark 文件目录中
[root@hadoop01 hadoop]# cp mapred-site.xml yarn-site.xml /opt/module/spark-3.2.4/conf/
[root@hadoop01 hadoop]# xsync /opt/module/spark-3.2.4/conf/
配置 spark 历史服务器
配置 spark spark-defaults.conf文件
cd /opt/module/spark-3.2.4/conf/
[root@hadoop01 conf]# mv spark-defaults.conf.template spark-defaults.conf
vim spark-defaults.conf
# 添加或者放开注释并修改
spark.eventLog.enabled true
spark.eventLog.compress true
spark.eventLog.dir hdfs://mycluster/spark-logs
spark.yarn.historyServer.address hadoop01:18080,hadoop02:18080
spark.history.ui.port 18080
spark.history.fs.logDirectory hdfs://mycluster/spark-logs
spark.history.retainedApplications 30
- 文件说明:
- spark.eventLog.enabled 设置为 true 表示启用Spark事件日志记录功能。
- spark.eventLog.compress 指定Spark事件日志是否需要进行压缩
- spark.eventLog.dir 指定了事件日志的存储路径
- spark.yarn.historyServer.address 指定了YARN历史服务器的地址
- spark.history.ui.port 指定了Spark历史服务器UI的端口号
- spark.history.fs.logDirectory 指定了历史记录文件在文件系统中的存储路径
- spark.history.retainedApplications 指定了历史服务器要保留的应用程序数量,设置为 30,表示历史服务器将保留最近提交的30个应用程序的历史记录。
同步文件到其他主机
# 同步至 其他主机的 spark 文件目录中
[root@hadoop01 conf]# xsync spark-defaults.conf
# 删除 其他主机的 spark-defaults.conf文件
[root@hadoop02 ~]# rm -rf /opt/module/spark-3.2.4/conf/spark-defaults.conf.template
重新开启集群测试
#创建时间日志的存储路径,需要在启动历史服务器之前创建,不然报错找不到路径或文件
[root@hadoop01 sbin]# hdfs dfs -mkdir /spark-logs
# hadoop01 上执行
zkserver start
start-all.sh
mapred --daemon start historyserver
$SPARK_HOME/sbin/start-all.sh
$SPARK_HOME/sbin/start-history-server.sh
# hadoop02 上执行
$SPARK_HOME/sbin/start-master.sh
$SPARK_HOME/sbin/start-history-server.sh
hadoop01:18080
hadoop01:19888 (logs 日志 在 hadoop01:8088 页面点击 logs 跳转)
hadoop01:19888
六、hbase集群搭建
主机环境配置
cd /opt/software/
tar -zxvf hbase-2.4.17-bin.tar.gz -C /opt/module/
cd /opt/module/
# 配置 hbase 环境变量
vim /etc/profile
# HBase环境变量
export HBASE_HOME=/opt/module/hbase-2.4.17
export PATH=$PATH:$HBASE_HOME/bin
# 激活环境变量
source /etc/profile
配置hbase 核心文件
配置hbase-env.sh 文件
cd /opt/module/hbase-2.4.17/conf/
vim hbase-env.sh
# 修改以下内容
export JAVA_HOME=/opt/module/jdk1.8.0_391
#保存pid文件
export HBASE_PID_DIR=/opt/module/hbase-2.4.17/pids
#禁用HBase自带的Zookeeper,因为我们是使用独立的Zookeeper
export HBASE_MANAGES_ZK=false
配置hbase-site.xml 文件
vim hbase-site.xml
# 将原有的配置信息 进行删除 添加以下配置项
<!-- 设置HRegionServers共享目录 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
<!-- 启用分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定Zookeeper集群位置 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!-- 指定独立Zookeeper安装路径 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/module/zookeeper-3.7.1/data</value>
</property>
<!-- 指定ZooKeeper集群端口 -->
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.tmp.dir</name>
<value>/opt/module/hbase-2.4.17/tmp</value>
</property>
<!--HBase将按照正常的写入路径进行处理与检查-->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
配置regionservers 文件
vim regionservers
# 修改为 以下信息
hadoop01
hadoop02
hadoop03
复制配置文件
# 复制 hadoop 配置到 hbase 目录下
cd /opt/module/hadoop-3.3.5/etc/hadoop/
cp core-site.xml hdfs-site.xml /opt/module/hbase-2.4.17/conf/
# 将 hbase 文件 同步到其他主机
cd /opt/module
xsync hbase-2.4.17/
xsync /etc/profile
# 分别在 hadoop02 和 hadoop03 上 执行以下代码 激活环境变量
source /etc/profile
启动hbase集群
# 查看那个是主节点 (hadoop01 还是 hadoop02) 然后执行 集群启动命令
[root@hadoop01 module]# hdfs haadmin -getServiceState nn1
active
[root@hadoop01 module]# start-hbase.sh
# 然后在另外一个备份节点上执行
hbase-daemon.sh start master
查看集群web界面 : master : hadoop01:60010 backup master **** : hadoop02:60010
简单测试shell 命令
# 任意节点进行
[root@hadoop03 bin]# hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.3.5/share/hadoop/common/lib/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/module/hbase-2.4.17/lib/client-facing-thirdparty/slf4j-reload4j-1.7.33.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
For Reference, please visit: http://hbase.apache.org/2.0/book.html#shell
Version 2.4.17, r7fd096f39b4284da9a71da3ce67c48d259ffa79a, Fri Mar 31 18:10:45 UTC 2023
Took 0.0027 seconds
hbase:001:0> version # 输入 version
2.4.17, r7fd096f39b4284da9a71da3ce67c48d259ffa79a, Fri Mar 31 18:10:45 UTC 2023
Took 0.0004 seconds
# exit 退出
# 由于本笔记目的是为了进行项目配置,暂不涉及更多的集群
七、mysql数据库集群搭建
卸载系统自带的mariadb
# 查看并卸载系统的mariadb软件
[root@hadoop01 ~]# rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
# 卸载mariadb
[root@hadoop01 ~]# rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
# 因为centos7内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb
# 查询还有没有 mariadb 和 mysql
[root@hadoop01 ~]# rpm -qa | grep mariadb
[root@hadoop01 ~]# rpm -qa | grep mysql
# 创建mysql用户并禁止登录 (系统用户 不会生成 home 目录等 其他文件信息)
# 该用户将拥有系统权限,但不会有与家目录相关的文件和配置。 MySQL 的运行文件、日志文件等通常会有专门的目录,并不依赖于 MySQL 用户的家目录。
[root@hadoop01 ~]# useradd mysql -s /sbin/nologin
# 通常用于系统上运行服务的用户,这些用户的目的是为了执行服务而不是人为的交互。例如,MySQL 服务通常以一个专门的用户(例如 mysql)的身份运行,这个用户的 shell 被设置为 /sbin/nologin,以防止不必要的登录。这样可以增加系统的安全性,因为攻击者无法直接通过登录该用户来执行交互式命令。
安装mysql
# 解压
[root@hadoop01 ~]# tar -zxvf /opt/software/mysql-5.7.35-el7-x86_64.tar.gz -C /opt/module/
[root@hadoop01 ~]# cd /opt/module/
[root@hadoop01 module]# mv mysql-5.7.35-el7-x86_64/ mysql-5.7.35
# 创建mysql数据目录以及配置目录
[root@hadoop01 module]# mkdir mysql-5.7.35/{data,conf,logs,binlog}
# 添加系统环境变量
vim /etc/profile
# mysql 环境变量
export MYSQL_HOME=/opt/module/mysql-5.7.35
export PATH=$PATH:$MYSQL_HOME/bin
配置mysql
# 创建mysql配置文件
[root@hadoop01 module]# cd mysql-5.7.35/conf/
[root@hadoop01 conf]# vim my.cnf (不能改成别的名字)
# 客户端配置,包括客户端连接mysql服务器的相关配置
[client]
port = 3306
socket = /opt/module/mysql-5.7.35/mysqld.sock
default-character-set = utf8mb4
# MySQL命令行客户端的配置
[mysql]
# 指定MySQL命令行提示符的格式。
prompt="\u@mysqldb \R:\m:\s [\d]> "
# 禁用自动补全功能
no-auto-rehash
# 指定MySQL命令行客户端的默认字符集
default-character-set = utf8mb4
# MySQL服务器的配置
[mysqld]
# 指定MySQL服务器运行的用户 (一般设置为mysql,需要提前创建mysql用户)
user = mysql
# 指定MySQL服务器监听的端口号
port = 3306
socket = /opt/module/mysql-5.7.35/mysqld.sock
# 禁用DNS反向解析
skip-name-resolve
# 设置字符编码
character-set-server = utf8
collation-server = utf8_general_ci
# 设置默认时区
default-time_zone='+8:00'
# 指定MySQL服务器的唯一标识
server-id = 1
# Directory
# 安装目录
basedir = /opt/module/mysql-5.7.35/
# 数据存储目录
datadir = /opt/module/mysql-5.7.35/data
# 安全文件目录
secure_file_priv = /opt/module/mysql-5.7.35/data
# PID文件的路径
pid-file = /opt/module/mysql-5.7.35/mysql.pid
# MySQL服务器的最大连接数
max_connections = 1024
# 最大连接错误数
max_connect_errors = 100
# 连接超时时间
wait_timeout = 100
# 最大允许数据包大小
max_allowed_packet = 128M
# 表缓存数量
table_open_cache = 2048
# 连接请求队列长度
back_log = 600
# 指定MySQL服务器的默认存储引擎
default-storage-engine = innodb
# 允许二进制日志中包含函数创建语句
log_bin_trust_function_creators = 1
# Log
# 关闭通用查询日志
general_log=off
general_log_file = /opt/module/mysql-5.7.35/logs/mysql.log
#错误日志的路径
log-error = /opt/module/mysql-5.7.35/logs/error.log
# binlog
#指定二进制日志的路径和格式
log-bin = /opt/module/mysql-5.7.35/binlog/mysql-binlog
binlog_format=mixed
# slowlog慢查询日志
slow_query_log = 1
slow_query_log_file = /opt/module/mysql-5.7.35/logs/slow.log
long_query_time = 2
log_output = FILE
log_queries_not_using_indexes = 0
# global_buffers
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2
key_buffer_size = 64M
innodb_log_file_size = 512M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_data_file_path = ibdata1:20M:autoextend
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
[mysqldump]
# 指定mysqldump工具使用快速导出模式
quick
# 指定mysqldump工具允许的最大数据包大小为32M
max_allowed_packet = 32M
初始化mysql 并启动
# 创建链接
[root@hadoop01 conf]# ln my.cnf /etc/my.cnf
# 这通常用于将配置文件从一个位置链接到另一个位置,以方便访问或者使不同的程序或用户能够共享同一份配置文件。
# 将mysql-5.7.35文件下的文件归属设置为mysql用户
[root@hadoop01 conf]# chown -R mysql:mysql /opt/module/mysql-5.7.35/
# 初始化 MySQL 数据库
[root@hadoop01 conf]# cd ..
[root@hadoop01 mysql-5.7.35]# ./bin/mysqld --initialize --user=mysql --datadir=/opt/module/mysql-5.7.35/data/ --basedir=/opt/module/mysql-5.7.35/
# --initialize : 这个选项告诉 MySQL 初始化数据库。在首次启动 MySQL 服务器之前,你需要执行这个操作来创建数据库的初始结构,包括系统表和权限表。
# 配置 mysql 快捷启动
[root@hadoop01 mysql-5.7.35]# cp support-files/mysql.server /etc/init.d/mysqld
[root@hadoop01 mysql-5.7.35]# chmod 777 /etc/init.d/mysqld
# 启动 mysql
[root@hadoop01 mysql-5.7.35]# /etc/init.d/mysqld start
Starting MySQL.... SUCCESS!
# 查看 mysql 进程
[root@hadoop01 mysql-5.7.35]# ss -ntulp | grep mysql
tcp LISTEN 0 128 [::]:3306 [::]:* users:(("mysqld",pid=5419,fd=30))
设置mysql 开机自启
# 设置mysql开机自启
chkconfig --level 35 mysqld on
# 表示在运行级别 3 和 5 下启用 mysqld 服务,意味着 MySQL 服务将在系统启动时自动启动
[root@hadoop01 mysql-5.7.35]# chkconfig --list mysqld
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use
'systemctl list-dependencies [target]'.
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# MySQL 服务在运行级别 2、3、4、5 下是启用的,而在运行级别 0 和 6 下是禁用的。这意味着 MySQL 服务会在系统启动时自动启动,并在进入多用户模式(运行级别 2、3、4、5)时保持启用。
chmod 777 /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --list mysqld
[root@hadoop01 mysql-5.7.35]# service mysqld status
SUCCESS! MySQL running (5419)
[root@hadoop01 mysql-5.7.35]# reboot
[root@hadoop01 ~]# ss -ntulp | grep mysql
tcp LISTEN 0 128 [::]:3306 [::]:* users:(("mysqld",pid=2133,fd=32))
创建hive使用的相关用户并授权
[root@hadoop01 ~]# grep password /opt/module/mysql-5.7.35/logs/error.log
2023-12-02T10:46:22.116862Z 1 [Note] A temporary password is generated for root@localhost: 1WuYfoDmvc-L
[root@hadoop01 ~]# mysqladmin -uroot -p'1WuYfoDmvc-L' password 123456
# 出现警告不用管 (因为密码使用了明文)
# 登录 mysql 客户端
[root@hadoop01 ~]# mysql -uroot -p123456
# 添加远程访问权限
root@mysqldb 19:13: [(none)]> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
# 创建hive数据库并授权
root@mysqldb 19:14: [(none)]> create database hive;
root@mysqldb 19:15: [(none)]> create user "hive"@"%" identified by "123456";
root@mysqldb 19:16: [(none)]> grant all privileges on hive.* to "hive"@"%";
root@mysqldb 19:16: [(none)]> flush privileges;
# 创建一个名为 "hive" 的数据库,创建一个用户名为 "hive",允许从任何主机(%表示通配符,表示来自任何主机)连接的用户,并授予该用户对 "hive" 数据库的所有权限
# 输入exit 退出即可
八、hive集群搭建
首先需要hadoop 用户代理服务 core-site.xml
# 需要将集群都关闭!!! 再进行!!!
# 修改 hadoop 配置文件复制到 hive 中
[root@hadoop01 ~]# cd /opt/module/hadoop-3.3.5/etc/hadoop/
[root@hadoop01 hadoop]# vim core-site.xml
# 添加以下配置项:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
#hadoop.proxyuser.xxx.hosts和hadoop.proxyuser.xxx.groups,其中xxx为启动HiveServer2的用户
cp core-site.xml hdfs-site.xml /opt/module/hive-3.1.3/conf/
cd
主机环境配置
[root@hadoop01 ~]# tar -zxvf /opt/software/apache-hive-3.1.3-bin.tar.gz -C /opt/module/
[root@hadoop01 ~]# cd /opt/module/
[root@hadoop01 module]# mv apache-hive-3.1.3-bin/ hive-3.1.3/
# 配置 hbase 环境变量
vim /etc/profile
# hive环境变量
export HIVE_HOME=/opt/module/hive-3.1.3
export PATH=$PATH:$HIVE_HOME/bin
# 激活环境变量
source /etc/profile
配置hive 核心文件
cd hive-3.1.3/conf/
# 配置hive日志文件
cp hive-log4j2.properties.template hive-log4j2.properties
[root@hadoop01 conf]# vim hive-log4j2.properties
# 修改 日志 存放位置
# 修改配置项: property.hive.log.dir = ${sys:java.io.tmpdir}/${sys:user.name}
# 修改为 property.hive.log.dir = /opt/module/hive-3.1.3/logs
# 解决 hive 控制台输出大量日志信息 解决方法
[root@hadoop01 conf]# vim log4j.properties
# 插入以下内容即可
log4j.rootLogger=WARN,CA
log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
[root@hadoop01 conf]# cp hive-env.sh.template hive-env.sh
[root@hadoop01 conf]# vim hive-env.sh
# 修改配置项如下
HADOOP_HOME=/opt/module/hadoop-3.3.5
export HIVE_CONF_DIR=/opt/module/hive-3.1.3/conf
export HIVE_AUX_JARS_PATH=/opt/module/hive-3.1.3/lib
export JAVA_HOME=/opt/module/jdk1.8.0_391
配置hive-site.xml 文件 (metastore 和 hiveserver2)
# 需要开启 hadoop 集群 和 zookeeper集群
[root@hadoop01 conf]# hadoop fs -ls /user
Found 1 items
drwxr-xr-x - root supergroup 0 2023-12-01 12:59 /user/root
[root@hadoop01 conf]# hdfs dfs -mkdir -p /user/hive/{warehouse,tmp,logs}
[root@hadoop01 conf]# hdfs dfs -chmod -R 777 /user/hive/
[root@hadoop01 conf]# vim hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--指定Hive元数据存储在本地 -->
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<!--Hive作业的HDFS根目录位置 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/user/hive/tmp</value>
</property>
<!--Hive作业的HDFS根目录创建和写权限 -->
<property>
<name>hive.scratch.dir.permission</name>
<value>777</value>
</property>
<!--指定Hive元数据存放在HDFS上的位置 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!--连接数据库地址,名称 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<!--连接数据库驱动 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--连接数据库用户名称 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<!--连接数据库用户密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- 指定metastore连接地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop01:9083,thrift://hadoop02:9083</value>
</property>
<!--启用Hive Server2的动态服务发现支持-->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
<description>当启用时,Hive Server 2会注册到ZooKeeper,并通过ZooKeeper进行服务发现。这可以支持Hive Server 2的高可用和负载均衡配置</description>
</property>
<!--启用Hive Server2的主备模式,并通过ZooKeeper选举一个活动实例来提供服务-->
<property>
<name>hive.server2.active.passive.ha.enable</name>
<value>true</value>
</property>
<!--指定在ZooKeeper中用于Hive Server2的命名空间-->
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>
<property>
<name>hive.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
<!--指定Hive Server2的Thrift服务监听的端口号-->
<property>
<name>hive.server2.thrift.port</name>
<value>10001</value>
</property>
<!--指定Hive Server2的Thrift服务绑定的主机名或IP地址-->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop02</value>
</property>
<property>
<name>hive.querylog.location</name>
<value>/user/hive/logs</value>
</property>
<!-- 显示表的列名 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 显示数据库名称 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>
初始化mysql
# 将下载 mysql 驱动包到 hive 的 lib 目录下
[root@hadoop01 conf]# cp /opt/software/mysql-connector-java-5.1.49.jar /opt/module/hive-3.1.3/lib/
# 删除 hive 下的 log4j-slf4j-impl-2.17.1.jar,会与hadoop下的 slf4j-reload4j-1.7.36.jar 冲突
[root@hadoop01 conf]# rm -rf ../lib/log4j-slf4j-impl-2.17.1.jar
[root@hadoop01 conf]# rm -rf /opt/module/hive-3.1.3/lib/guava-19.0.jar
[root@hadoop01 conf]# cp /opt/module/hadoop-3.3.5/share/hadoop/common/lib/guava-27.0-jre.jar /opt/module/hive-3.1.3/lib/
# 将 hive 文件 同步到其他主机
cd /opt/module
[root@hadoop01 module]# xsync hive-3.1.3/
[root@hadoop01 module]# xsync /etc/profile
# 分别在 hadoop02 和 hadoop03 上 执行以下代码 激活环境变量
# 在 hadoop02 和 hadoop03 上 建议先删除 关于 mysql 的环境变量
source /etc/profile
# 在初始化 mysql 之前 要在hadoop03 上 修改 hive-site.xml文件
# 在 hadoop02 上不用修改,因为使用的是同一份配置,即hadoop01 和 hadoop02 是一样的
# 在 hadoop03 上修改
<!--指定Hive Server2的Thrift服务绑定的主机名或IP地址-->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop03</value>
</property>
[root@hadoop01 module]# schematool -dbType mysql -initSchema
Metastore connection URL: jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: hive
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql
Initialization script completed
schemaTool completed
# 初始化成功
在数据库管理工具中,可以进行查看虚拟机中的mysql数据库中的hive库 这里我使用的是 datagrip
初始化报错解决方法
# 如果按照我实现的顺序进行,一般不会出现问题
[root@hadoop01 module]# schematool -dbType mysql -initSchema
Metastore connection URL: jdbc:derby:;databaseName=metastore_db;create=true
Metastore Connection Driver : org.apache.derby.jdbc.EmbeddedDriver
Metastore connection User: APP
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql
Error: Syntax error: Encountered "<EOF>" at line 1, column 64. (state=42X01,code=30000)
org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!
Underlying cause: java.io.IOException : Schema script failed, errorcode 2
Use --verbose for detailed stacktrace.
*** schemaTool failed ***
# 初始化失败了,通过查询 原因是 hive 中的 lib 文件里面 关于 guava-19.0.jar 版本为 19 而在 hadoop 中的版本为 27 guava-27.0-jre.jar
# 解决方法:
[root@hadoop01 module]# rm -rf /opt/module/hive-3.1.3/lib/guava-19.0.jar
[root@hadoop01 module]# cp /opt/module/hadoop-3.3.5/share/hadoop/common/lib/guava-27.0-jre.jar /opt/module/hive-3.1.3/lib/
# 重新执行格式化
[root@hadoop01 module]# schematool -dbType mysql -initSchema
Metastore connection URL: jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true&useSSL=false
Metastore Connection Driver : com.mysql.jdbc.Driver
Metastore connection User: hive
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.mysql.sql
Error: Table 'CTLGS' already exists (state=42S01,code=1050)
org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!
Underlying cause: java.io.IOException : Schema script failed, errorcode 2
Use --verbose for detailed stacktrace.
*** schemaTool failed ***
# 需要连接数据库,将hive 中的所有表进行删除
启动metastore
[root@hadoop02 ~]# nohup hive --service metastore >> /opt/module/hive-3.1.3/logs/metastore.log 2>&1 &
[root@hadoop02 ~]# mkdir /opt/module/hive-3.1.3/logs
[root@hadoop02 ~]# nohup hive --service metastore >> /opt/module/hive-3.1.3/logs/metastore.log 2>&1 &
[1] 3695
#查看启动的服务,验证
[root@hadoop02 hive-3.1.3]# ss -ntulp | grep 3695
tcp LISTEN 0 50 [::]:9083 [::]:* users:(("java",pid=3695,fd=630))
启动hiveserver2
[root@hadoop02 ~]# nohup hive --service hiveserver2 >> /opt/module/hive-3.1.3/logs/hiveserver2.log 2>&1 &
[root@hadoop03 ~]# mkdir /opt/module/hive-3.1.3/logs
[root@hadoop03 ~]# nohup hive --service hiveserver2 >> /opt/module/hive-3.1.3/logs/hiveserver2.log 2>&1 &
[1] 2141
#查看启动的服务,验证
[root@hadoop03 hadoop]# ss -ntulp | grep 2141
tcp LISTEN 0 50 [::]:10001 [::]:* users:(("java",pid=2141,fd=627))
tcp LISTEN 0 50 [::]:10002 [::]:* users:(("java",pid=2141,fd=632))
hive启动测试
在浏览器上输入 hadoop02:10002或者hadoop03:10002
# 在本次 hive 集群搭建的过程中,我将 hadoop03 当作客户机来使用
# 连接测试
[root@hadoop03 hadoop]# beeline -u jdbc:hive2://hadoop02:10001
Connecting to jdbc:hive2://hadoop02:10001
2023-12-03 23:06:53,137 INFO jdbc.Utils: Supplied authorities: hadoop02:10001
2023-12-03 23:06:53,139 INFO jdbc.Utils: Resolved authority: hadoop02:10001
Connected to: Apache Hive (version 3.1.3)
Driver: Hive JDBC (version 2.3.9)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 2.3.9 by Apache Hive
0: jdbc:hive2://hadoop02:10001> Closing: 0: jdbc:hive2://hadoop02:10001
[root@hadoop03 hadoop]# beeline -u jdbc:hive2://hadoop03:10001
Connecting to jdbc:hive2://hadoop03:10001
2023-12-03 23:08:10,208 INFO jdbc.Utils: Supplied authorities: hadoop03:10001
2023-12-03 23:08:10,209 INFO jdbc.Utils: Resolved authority: hadoop03:10001
Connected to: Apache Hive (version 3.1.3)
Driver: Hive JDBC (version 2.3.9)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 2.3.9 by Apache Hive
0: jdbc:hive2://hadoop03:10001> Closing: 0: jdbc:hive2://hadoop03:10001
hive数据库创建测试并查看hiveserver2状态
[root@hadoop03 hadoop]# beeline
Beeline version 2.3.9 by Apache Hive
beeline> !connect jdbc:hive2://hadoop02:10001
Connecting to jdbc:hive2://hadoop02:10001
Enter username for jdbc:hive2://hadoop02:10001: hive
Enter password for jdbc:hive2://hadoop02:10001:
2023-12-03 23:46:57,731 INFO jdbc.Utils: Supplied authorities: hadoop02:10001
2023-12-03 23:46:57,732 INFO jdbc.Utils: Resolved authority: hadoop02:10001
Connected to: Apache Hive (version 3.1.3)
Driver: Hive JDBC (version 2.3.9)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop02:10001> create database if not exists mytestdb;
No rows affected (0.1 seconds)
0: jdbc:hive2://hadoop02:10001> use mytestdb;
No rows affected (0.059 seconds)
0: jdbc:hive2://hadoop02:10001> show tables;
+--------------+
| tab_name |
+--------------+
| mytesttable |
+--------------+
1 row selected (0.127 seconds)
0: jdbc:hive2://hadoop02:10001> describe database mytestdb;
+-----------+----------+---------------------------------------------------+-------------+-------------+-------------+
| db_name | comment | location | owner_name | owner_type | parameters |
+-----------+----------+---------------------------------------------------+-------------+-------------+-------------+
| mytestdb | | hdfs://mycluster/user/hive/warehouse/mytestdb.db | anonymous | USER | |
+-----------+----------+---------------------------------------------------+-------------+-------------+-------------+
1 row selected (0.068 seconds)
0: jdbc:hive2://hadoop02:10001> CREATE EXTERNAL TABLE IF NOT EXISTS mytesttable (
. . . . . . . . . . . . . . . > name string,
. . . . . . . . . . . . . . . > age string,
. . . . . . . . . . . . . . . > workplace ARRAY<STRING>
. . . . . . . . . . . . . . . > )
. . . . . . . . . . . . . . . > COMMENT 'This is an text table';
No rows affected (0.074 seconds)
0: jdbc:hive2://hadoop02:10001> show tables;
+--------------+
| tab_name |
+--------------+
| mytesttable |
+--------------+
1 row selected (0.091 seconds)
0: jdbc:hive2://hadoop02:10001> desc mytesttable;
+------------+----------------+----------+
| col_name | data_type | comment |
+------------+----------------+----------+
| name | string | |
| age | string | |
| workplace | array<string> | |
+------------+----------------+----------+
3 rows selected (0.136 seconds)
0: jdbc:hive2://hadoop02:10001> Closing: 0: jdbc:hive2://hadoop02:10001
可以查看,我们创建数据库的过程中,所使用的语句信息会同时保存到hdfs中,并且使用mapreduce的形式运行
另附上述软件下载地址
# jdk https://www.oracle.com/java/technologies/downloads/#sjre8-windows 然后选择最新的linux jdk下载就好 不过需要注册oracle账号进行下载
# hadoop https://archive.apache.org/dist/hadoop/common/hadoop-3.3.5/hadoop-3.3.5.tar.gz
# hbase https://dlcdn.apache.org/hbase/2.4.17/hbase-2.4.17-bin.tar.gz
# hive https://dlcdn.apache.org/hive/hive-3.1.3/apache-hive-3.1.3-bin.tar.gz
# kafka https://archive.apache.org/dist/kafka/3.4.0/kafka_2.12-3.4.0.tgz
# spark https://archive.apache.org/dist/spark/spark-3.2.4/spark-3.2.4-bin-hadoop3.2-scala2.13.tgz
# flink https://archive.apache.org/dist/flink/flink-1.16.1/flink-1.16.1-bin-scala_2.12.tgz
# flink-share https://repo.maven.apache.org/maven2/org/apache/flink/flink-shaded-hadoop-2-uber/2.8.3-10.0/flink-shaded-hadoop-2-uber-2.8.3-10.0.jar
# mysql https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.35-el7-x86_64.tar.gz
# mysql-jdbc https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-5.1.49.jar
# 软件打包链接
链接:https://pan.baidu.com/s/19cmBl9fpf7-7luxtBhMUJw?pwd=bkth
提取码:bkth