Hadoop 3.3.5部署

前情提要

本次实验采用Ubuntu 24.04LTS,自行安装

Ubuntu 24.04.02 LTS 初始化安装 | 严千屹博客

本笔记分伪分布分布式两大块,但建议从头开始观看

文章所需资源可点击这里下载

  1. 伪分布主机拓扑
主机名 ip(NAT) 内存 硬盘
qianyios 192.168.48.128 7G 100G
  1. 分布式主机拓扑
机名 ip(NAT) 内存 硬盘
master 192.168.48.128 6G 100G
slave 192.168.48.129 6G 100G

基础初始化

简单部署一个单节点的hadoop,然后打快照,后续给伪分布和分布式做基础底座

由于本系统在Ubuntu 24.04.02 LTS 初始化安装 | 严千屹博客已经进行了设置阿里源和关闭防火墙,这里就不再赘述了

切换root用户

1
2
3
qianyios@qianyios:~$ su -  root
密码:
root@qianyios:~#

基础配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
cat >init.sh<<"EOF"
#!/bin/bash
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
systemctl restart ssh
# 添加 hosts
echo "192.168.48.128 qianyios" >> /etc/hosts
echo "已添加 hosts 条目。"

# 设置主机名
hostnamectl set-hostname qianyios
echo "主机名已设置为 qianyios。"

# 安装 sshpass
apt install -y sshpass || { echo "安装 sshpass 失败"; exit 1; }
echo "sshpass 安装完成。"

# 目标主机列表
hosts=("qianyios")
# 密码
password="123456"

# 生成 SSH 密钥对
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
echo "SSH 密钥对已生成。"

# 循环遍历目标主机
for host in "${hosts[@]}"
do
echo "正在为 $host 配置免密登录..."
sshpass -p "$password" ssh-copy-id -o StrictHostKeyChecking=no "$host" || { echo "复制公钥到 $host 失败"; exit 1; }
sshpass -p "$password" ssh -o StrictHostKeyChecking=no "$host" "echo '免密登录成功'" || { echo "验证免密登录失败"; exit 1; }
done
reboot
EOF
bash init.sh

测试免密登入

1
2
3
4
5
6
7
root@qianyios:~# ssh qianyios
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-17-generic x86_64)

......

Last login: Tue Feb 25 00:02:32 2025 from 127.0.0.1
root@qianyios:~#

下载所需资源并解压到/root/hadoop/下,如下图

image-20250225001010678

安装java环境和hadoop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cd /root/hadoop
mkdir /usr/lib/jvm
#安装java8
tar -xf /root/hadoop/jdk-8u371-linux-x64.tar.gz -C /usr/lib/jvm
echo "export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_371" >> /etc/profile
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile
source /etc/profile
java -version

#安装hadoop3.3.5
tar -zxf hadoop-3.3.5.tar.gz -C /usr/local
mv /usr/local/hadoop-3.3.5/ /usr/local/hadoop
echo "export HADOOP_HOME=/usr/local/hadoop" >> /etc/profile
echo "export PATH=\$HADOOP_HOME/bin/:\$HADOOP_HOME/sbin/:\$PATH" >> /etc/profile
source /etc/profile
hadoop version

成功图

image-20250225001421609

这时候关机

1
poweroff

打个快照,方便做分布式部署,如果你要做分布式的直接跳到4.分布式

image-20250225001553286

伪分布

开机吧!

编写配置文件

编写cort-site.yaml文件

修改下面hdfs://qianyios:9000中的qianyios为你的主机名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat > /usr/local/hadoop/etc/hadoop/core-site.xml<< "EOF"
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://qianyios:9000</value>
</property>
</configuration>

EOF

编写hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat >/usr/local/hadoop/etc/hadoop/hdfs-site.xml<<"EOF"
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
EOF

启动hdfs服务

hadoop初始化

1
hdfs namenode -format

这条命令只需要运行一次,以后都不要再运行了!!!!!!

这条命令只需要运行一次,以后都不要再运行了!!!!!!

这条命令只需要运行一次,以后都不要再运行了!!!!!!

image-20250225002137864

添加环境变量

1
2
3
4
5
6
echo "export HDFS_NAMENODE_USER=root" >> /etc/profile
echo "export HDFS_DATANODE_USER=root" >> /etc/profile
echo "export HDFS_SECONDARYNAMENODE_USER=root" >> /etc/profile
echo "export YARN_RESOURCEMANAGER_USER=root" >> /etc/profile
echo "export YARN_NODEMANAGER_USER=root" >> /etc/profile
source /etc/profile

修改hadoop配置文件

1
echo "export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_371" >> /usr/local/hadoop/etc/hadoop/hadoop-env.sh

启动hadoop

1
2
#启动服务
start-all.sh
1
2
#关闭服务
stop-all.sh

image-20250225002639543

localhost: Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.

  • 这是一个 SSH 的警告信息,表明 SSH 客户端首次连接到 localhost 时,将 localhost 的主机密钥(使用 ED25519 算法生成)添加到了 known_hosts 文件中。
  • 这是 SSH 的正常行为,用于防止中间人攻击。每次 SSH 客户端连接到一个新主机时,都会将主机的密钥记录下来。

启动historyserver服务

1
2
3
#启动hadoop
start-all.sh
mapred --daemon start historyserver

关闭用

1
mapred --daemon stop historyserver

正常启动hadoop你会看到如下服务

1
2
3
4
5
6
7
8
root@qianyios:~# jps
14050 NodeManager
10245 JobHistoryServer
13894 ResourceManager
13255 NameNode
13449 DataNode
13673 SecondaryNameNode
14606 Jps

访问网页ip:9870查看hdfs

image-20250225003504886

访问网页ip:8088查看hadoop

image-20250225003534036

至此伪分布hadoop就搞定了,这时候你要在你这里打上一个伪分布的快照

分布式

前情提要

机名 ip(NAT) 内存 硬盘
master 192.168.48.128 6G 100G
slave 192.168.48.129 6G 100G

由于前面不是做了一个hadoop的一个基础快照吗,这时候你就对那个基础快照进行完整克隆两个出来,分别命名为master和slave

image-20250225114203260

image-20250225114415054

这时候先开slave,master不要开

1
vim /etc/netplan/01-network-manager-all.yaml

ip改成192.168.48.129

1
2
3
4
5
6
7
8
9
10
11
12
13
# Let NetworkManager manage all devices on this system
network:
ethernets:
ens33:
addresses: [192.168.48.129/24]
dhcp4: false
nameservers:
addresses: [192.168.48.2, 114.114.114.114]
routes:
- to: default
via: 192.168.48.2
version: 2
renderer: NetworkManager

重启网卡

1
netplan apply

这时候再把master开机,接着就可以进行基础操作了

基础操作

以下我会提前告诉你哪些是哪个节点要操作的命令

操作节点:=master和slave=

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
cat >fbsnit.sh <<"EOF"
#!/bin/bash
if [ $# -eq 1 ];then
echo "设置主机名为:$1"
else
echo "使用方法:sh $0 主机名"
exit 2
fi
sudo sed -i '/qianyios/d' /etc/hosts
#这里你要改成你的ip
grep -q "^192\.168\.48\.128\s\+master" /etc/hosts || echo "192.168.48.128 master" >> /etc/hosts
grep -q "^192\.168\.48\.129\s\+slave" /etc/hosts || echo "192.168.48.129 slave" >> /etc/hosts
hostnamectl set-hostname $1
#设置免密
apt install -y sshpass || { echo "安装 sshpass 失败"; exit 1; }
echo "sshpass 安装完成。"

# 目标主机列表
hosts=("master" "slave")
# 密码
password="123456"

# 生成 SSH 密钥对
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
echo "SSH 密钥对已生成。"

# 循环遍历目标主机
for host in "${hosts[@]}"
do
echo "正在为 $host 配置免密登录..."
sshpass -p "$password" ssh-copy-id -o StrictHostKeyChecking=no "$host" || { echo "复制公钥到 $host 失败"; exit 1; }
sshpass -p "$password" ssh -o StrictHostKeyChecking=no "$host" "echo '免密登录成功'" || { echo "验证免密登录失败"; exit 1; }
done
reboot
EOF
1
2
#master执行这个
bash fbsnit.sh master
1
2
#slave执行这个
bash fbsnit.sh slave

修改配置文件

操作节点:master

1.修改workers文件

在Hadoop集群中,workers文件是一个非常重要的配置文件,它用于指定Hadoop集群中所有从节点(DataNode和TaskTracker/NodeManager)的主机名或IP地址

将slave修改成你自己的从节点的主机名

1
2
3
cat> /usr/local/hadoop/etc/hadoop/workers <<"EOF"
slave
EOF

2.修改core-site.xml

操作节点:master

将master修改成你自己的主节点的主机名

  • 作用:配置Hadoop的核心参数,主要涉及文件系统的访问和临时目录的设置。
    • fs.defaultFS:指定HDFS的默认访问路径,格式为hdfs://<namenode-host>:<port>。这是Hadoop客户端访问HDFS的入口。
    • hadoop.tmp.dir:指定Hadoop的临时目录,用于存储运行时的临时文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
cat> /usr/local/hadoop/etc/hadoop/core-site.xml<<"EOF"
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
</configuration>
EOF

3.修改hdfs-site.xml

操作节点:master

将master修改成你自己的主节点的主机名

  • 作用:配置HDFS(Hadoop Distributed File System)的高级参数。
    • dfs.namenode.secondary.http-address:指定Secondary NameNode的HTTP地址。
    • dfs.replication:设置HDFS数据块的副本数量,默认为3,这里设置为1(适合单节点测试环境)。
    • dfs.namenode.name.dir:指定NameNode存储元数据的目录。
    • dfs.datanode.data.dir:指定DataNode存储数据块的目录。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat> /usr/local/hadoop/etc/hadoop/hdfs-site.xml<<"EOF"
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>

EOF

4.修改mapred-site.xml配置文件

操作节点:master

将master修改成你自己的主节点的主机名

  • 作用:配置MapReduce作业的运行参数。
    • mapreduce.framework.name:指定MapReduce作业运行的框架(这里是YARN)。
    • mapreduce.jobhistory.addressmapreduce.jobhistory.webapp.address:指定MapReduce作业历史服务器的地址和Web界面地址。
    • 环境变量配置:设置MapReduce作业运行时的环境变量,例如HADOOP_MAPRED_HOME
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cat> /usr/local/hadoop/etc/hadoop/mapred-site.xml<<"EOF"
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/usr/local/hadoop</value>
</property>
</configuration>
EOF

5.修改yarn-site.xml文件

操作节点:master

将master修改成你自己的主节点的主机名

  • 作用:配置YARN(Yet Another Resource Negotiator)的参数。
    • yarn.resourcemanager.hostname:指定ResourceManager的主机名,用于资源管理和作业调度。
    • yarn.nodemanager.aux-services:启用MapReduce的Shuffle服务,这是MapReduce作业运行的必要配置。
1
2
3
4
5
6
7
8
9
10
11
12
cat> /usr/local/hadoop/etc/hadoop/yarn-site.xml<<"EOF"
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
EOF

将上述配置拷贝到slave

操作节点:master

1
2
3
4
5
6
7
cd /usr/local/hadoop/etc/hadoop/
scp core-site.xml slave:/usr/local/hadoop/etc/hadoop/
scp hdfs-site.xml slave:/usr/local/hadoop/etc/hadoop/
scp mapred-site.xml slave:/usr/local/hadoop/etc/hadoop/
scp workers slave:/usr/local/hadoop/etc/hadoop/
scp yarn-site.xml slave:/usr/local/hadoop/etc/hadoop/
cd

这里是不用输入密码,如果提示你要输入密码,说明你前面4.2的ssh免密没做好

修改环境变量拷贝到slave

操作节点:master

1
2
3
4
5
6
7
8
echo "export HDFS_NAMENODE_USER=root" >> /etc/profile
echo "export HDFS_DATANODE_USER=root" >> /etc/profile
echo "export HDFS_SECONDARYNAMENODE_USER=root" >> /etc/profile
echo "export YARN_RESOURCEMANAGER_USER=root" >> /etc/profile
echo "export YARN_NODEMANAGER_USER=root" >> /etc/profile
source /etc/profile
scp /etc/profile slave:/etc/profile
source /etc/profile

修改hadoop环境配置文件

操作节点:master

并将配置文件拷贝到slave

1
2
echo "export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_371" >> /usr/local/hadoop/etc/hadoop/hadoop-env.sh
scp /usr/local/hadoop/etc/hadoop/hadoop-env.sh slave:/usr/local/hadoop/etc/hadoop/hadoop-env.sh

集群启动

操作节点:master

master初始化

1
hdfs namenode -format

image-20250225125251009

启动hadoop

操作节点:master

1
2
#启动hadoop
start-all.sh
1
2
#关闭服务
stop-all.sh

启动的时候如果有这些没关系

image-20250225125953364

启动historyserver

操作节点:master

1
mapred --daemon start historyserver

关闭用

1
mapred --daemon stop historyserver

查看进程

两个节点说运行的服务如下

1
2
3
4
5
6
7
8
9
10
11
root@master:~# jps
31364 ResourceManager
31140 SecondaryNameNode
30856 NameNode
32282 Jps
28046 JobHistoryServer

root@slave:~# jps
6304 DataNode
6444 NodeManager
6605 Jps

访问hadoop页面

http://192.168.48.128:8088/

image-20250225130356821

http://192.168.48.128:9870/

image-20250225130422951

至此分布式hadoop集群构建成功

这时候就你要给你这两台机,打上hadoop集群部署成功的快照,以便你后期做项目不报错可以恢复

HBase

HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeeper 实现。HBase 良好的分布式架构设计为海量数据的快速存储、随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据容灾,是大数据领域中 Key-Value 数据结构存储最常用的数据库方案。

本实验部署在伪分布机子上

安装

1
2
3
4
5
6
7
tar -xf /root/hadoop/hbase-2.5.4-bin.tar.gz -C /usr/local/
mv /usr/local/hbase-2.5.4 /usr/local/hbase
echo "export HBASE_HOME=/usr/local/hbase" >> /etc/profile
echo "export PATH=\$PATH:\$HBASE_HOME/bin" >> /etc/profile
source /etc/profile
sed -i "s/CLASSPATH=\${CLASSPATH}:\$JAVA_HOME\/lib\/tools.jar/CLASSPATH=\${CLASSPATH}:\$JAVA_HOME\/lib\/tools.jar:\/usr\/local\/hbase\/lib\/*/g" /usr/local/hbase/bin/hbase
hbase version

image-20250228150312197

HBase配置

文件里的qianyios要改成你的主机名,运行 HDFS NameNode 的主机名。

hbase.cluster.distributed

  • 设置为 true 表示 HBase 以分布式模式运行。
  • 如果设置为 false,HBase 将以单机模式运行(通常用于测试)。

HBASE_MANAGES_ZK=tru

  • HBASE_MANAGES_ZK=true
    • 表示 HBase 将启动并管理自己的嵌入式 ZooKeeper 实例。
    • 这种模式通常用于单机环境或小型测试环境,简化了配置和管理。
  • HBASE_MANAGES_ZK=false
    • 表示 HBase 不会启动自己的 ZooKeeper 实例,而是依赖外部独立的 ZooKeeper 集群。
    • 这种模式适用于生产环境,推荐使用独立的 ZooKeeper 集群以提高稳定性和性能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo "export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_371" >> $HBASE_HOME/conf/hbase-env.sh
echo "export HBASE_CLASSPATH=/usr/local/hbase/conf" >> $HBASE_HOME/conf/hbase-env.sh
echo "export HBASE_MANAGES_ZK=true" >> $HBASE_HOME/conf/hbase-env.sh
echo "export HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP=true" >> $HBASE_HOME/conf/hbase-env.sh

cat >$HBASE_HOME/conf/hbase-site.xml<<"EOF"
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://qianyios:9000/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
</configuration>
EOF

启动hbase

1
2
start-all.sh 
start-hbase.sh

然后输入jps,有以下三个个就安装成功

image-20250228160532991

测试hbase

1
2
hbase shell
list

能运行没报错就行

image-20250228163520364

访问hbase网页

http://192.168.48.128:16010/

image-20250228163637109

关机备份打快照

关机顺序

1
2
3
stop-hbase.sh
stop-all.sh
poweroff

开机顺序

1
2
start-all.sh
start-hbase.sh

实例测试1

学号(S_No) 姓名(S_Name) 性别(S_Sex) 年龄(S_Age)
2015001 zhangsan male 23
2015002 Mary female 22
2015003 Lisi male 24

创建学生表

1
2
3
4
hbase shell
create 'student','no','name','sex','age'
#查看表结构
describe 'student'

image-20250228164331731

添加数据

s001为行键,行键可以自定义,但是要注意区别,按照前面的学生表,输入第一行s001的学生信息,我这里就简单输入一些信息,做例子用

1
2
3
4
5
#查看表的信息
scan 'student'
put 'student','s001','no','2015001'
put 'student','s001','name','zhangsan'
scan 'student'

image-20250228164715165

查看整行

1
get 'student','s001'

image-20250228164802747

查看单元格

1
get 'student','s001','name'

image-20250228164900943

实例测试2

这是一个订单表

image-20250228165126371

创建order表

创建一个order表,出现两列族userinfo,orderinfo

你看这次的行是1就和上个实例的s001,是不一样,都是可以自定义的

然后在列族下创建列userinfo:name,userinfo:age,orderinfo:id,orderinfo:money

在创建列的同时附带值

1
2
3
4
5
6
7
create 'order','userinfo','orderinfo'
list
put 'order','1','userinfo:name','sw'
put 'order','1','userinfo:age','24'
put 'order','1','orderinfo:id','23333'
put 'order','1','orderinfo:money','30'
scan 'order'

image-20250228165243544

修改数据

1
2
3
put 'order','1','userinfo:name','zhangxiaosan'
get 'order','1','userinfo:name'
scan 'order'

image-20250228170258943

时间戳

数据添加到HBase的时候都会被记录一个时间戳,这个时间戳被我们当做一个版本。

当修改某一条的时候,本质上是往里边新增一条数据,记录的版本加一。

image-20250228170428084

现在要把这条记录的值改为40,实际上就是多添加一条记录,在读的时候按照时间戳读最新的记录

image-20250228170509622

1
2
3
get 'order','1','orderinfo:money'
put 'order','1','orderinfo:money','40'
get 'order','1','orderinfo:money'

image-20250228170922948

删除数据

1
2
3
scan 'student'
delete 'student','s001','name'
get 'student','s001','name'

image-20250228171143117

删除表

1
2
3
disable 'student'
describe 'student'
drop 'student'

image-20250228171228570

Hive

hive 是一种底层封装了Hadoop 的数据仓库处理工具,使用类SQL 的hiveSQL 语言实现数据查询,所有hive 的数据都存储在Hadoop 兼容的文件系统、(例如,[Amazon S3](https://baike.baidu.com/item/Amazon S3/10809744)、HDFS)中。hive 在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS 中hive 设定的目录下,因此,hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的。

用户接口Client

用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 Cli,Cli启动的时候,会同时启动一个 hive 副本。Client 是 hive 的客户端,用户连接至 hive Server。在启动 Client 模式的时候,需要指出 hive Server 所在节点,并且在该节点启动 hive Server。 WUI 是通过浏览器访问 hive。

元数据存储 Metastore

hive 将元数据存储在数据库中,如 mysql、derby。hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

驱动器:Driver 解释器、编译器、优化器、执行器

解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。

Hadoop

hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(不包含 * 的查询,比如 select * from tbl 不会生成 MapReduce 任务)。

image-20250304164524876

image-20250304164530902

安装hive

qianyios:3306这里要改成你的主机名

root是数据库的root用户

qianyios666是数据库密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
tar -xf /root/hadoop/apache-hive-3.1.3-bin.tar.gz
mv apache-hive-3.1.3-bin /usr/local/hive
echo "export HIVE_HOME=/usr/local/hive" >> /etc/profile
echo "export PATH=\$HIVE_HOME/bin:\$PATH" >> /etc/profile
source /etc/profile
cat >/usr/local/hive/conf/hive-site.xml<<"EOF"
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://qianyios:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>qianyios666</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
</configuration>
EOF

安装mysql

1
2
3
4
5
apt remove mariadb* -y
apt install -y net-tools wget mysql-server
systemctl enable --now mysql
#mysql初始化
mysql_secure_installation
1
2
3
4
5
6
#输入no
Press y|Y for Yes, any other key for No: no
Remove anonymous users?: yes
Disallow root login remotely?: no
Remove test database and access to it?: yes
Reload privilege tables now?: yes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql -uroot
#创建用户 'root'@'localhost'
CREATE USER IF NOT EXISTS 'root'@'localhost' IDENTIFIED BY 'qianyios666';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
#将 'root'@'localhost' 的认证插件切换为 mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'qianyios666';
#创建用户 'root'@'qianyios'
CREATE USER IF NOT EXISTS 'root'@'qianyios' IDENTIFIED BY 'qianyios666';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'qianyios' WITH GRANT OPTION;
FLUSH PRIVILEGES;
create database hive;
exit
sudo sed -i 's/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo sed -i 's/^mysqlx-bind-address\s*=\s*127.0.0.1/mysqlx-bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
systemctl restart mysql

启动hive

1
2
3
4
5
6
7
8
9
10
11
cd
wget -P /root/hadoop/ https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.11.tar.gz
tar -xf /root/hadoop/mysql-connector-java-8.0.11.tar.gz
cp mysql-connector-java-8.0.11/mysql-connector-java-8.0.11.jar /usr/local/hive/lib/
mv /usr/local/hive/lib/guava-19.0.jar{,.bak}
cp /usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/hive/lib
start-all.sh
#hive初始化,这个命令只需要运行一次
schematool -dbType mysql -initSchema
#启动hive
hive

hive初始化有这个说明成功初始化如果失败,检查一下配置文件或者数据库

image-20250304193132330

image-20250304193255320

要退出就按两下ctrl+C

Hive数据类型

类型 描述 示例
TINYINT(tinyint) 一个字节(8位)有符号整数, -128~127 1
SMALLINT(smallint) 2字节(16位)有符号整数,-32768~32767 1
INT(int) 4字节(32位)有符号整数 1
BIGINT(bigint) 8字节(64位)有符号整数 1
FLOAT(float) 4字节(32位)单精度浮点数 1
DOUBLE(double) 8字节(64位)双精度浮点数 1
DECIMAL(decimal) 任意精度的带符号小数 1
BOOLEAN(boolean) true/false true/false
STRING(string) 字符串,变长 ‘a’,‘b’,‘1’
VARCHAR(varchar) 变长字符串 ‘a’
CHAR(char) 固定长度字符串 ‘a’
BINANY(binany) 字节数组 无法表示
TIMESTAMP(timestamp) 时间戳,纳秒精度 1.22327E+11
DATE(date) 日期 ‘2016-03-29’

hive的集合数据类型

类型 描述 示例
ARRAY 有序数组,字段的类型必须相同 Array(1,2)
MAP 一组无序的键值对,键的类型必须是原始数据类型,他的值可以是任何类型,同一个映射的键的类型必须相同,值得类型也必须相同 Map(‘a’,1)
STRUCT 一组命名的字段,字段类型可以不同 Struct(‘a’,1,2.0
UNION UNION则类似于C语言中的UNION结构,在给定的任何一个时间点,UNION类型可以保存指定数据类型中的任意一种

基本命令

以下在hive数据仓库了运行,输入以下命令进入,可能启动有点慢

1
hive

创建数据库和表

1
2
3
create database hive;
use hive;
create table usr(id int,name string,age int);

查看和描述数据库和表

1
2
3
4
5
show databases;
show tables;
USE hive;
describe database hive;
describe hive.usr;

image-20250304195510092

向表中装载数据

1
2
3
4
5
6
7
8
insert into usr values(1,'sina',20);

#从linux读取数据
[root@qianyios555 ~]# echo "2,zhangsan,22" >> /opt/data
#从hive导入数据
hive> use hive;
create table usr1(id int,name string,age int) row format delimited fields terminated by ",";
load data local inpath '/opt/data' overwrite into table usr1;

从hdfs中读取数据

1
2
3
4
5
6
#从linux读取数据
echo "3,lisi,25" > /opt/test.txt
hdfs dfs -put /opt/test.txt /
hive
use hive;
load data inpath 'hdfs://qianyios:9000/test.txt' overwrite into table usr1;

从别的表中读取数据

1
2
3
4
5
6
7
8
9
10
11
12
13
hive> select * from usr;
OK
1 sina 20

hive> select * from usr1;
OK
3 lisi 25
#读取usr1的id=3的数据到usr
insert overwrite table usr select * from usr1 where id=3;

hive> select * from usr;
OK
3 lisi 25

查询表中数据

1
select * from usr1;

Hive实验:词频统计

在linux上创建输入目录:/opt/input;

1
mkdir /opt/input

在以上输入目录中添加多个文本文件,其中文件中包含单词:姓名学号,例如:qianyios555;

1
2
3
echo "hello1 qianyios555" > /opt/input/text1.txt
echo "hello2 qianyios555" > /opt/input/text2.txt
echo "hello3 qianyios555" > /opt/input/text3.txt

在Hive中创建表“docs”,并把输入目录的文件数据加载到该表中;

1
2
3
4
5
hive
use hive;
create table docs(line string);
load data local inpath '/opt/input' overwrite into table docs;
select * from docs;

编写HiveQL语句对输入目录的文本进行词频统计,统计单词“姓名学号”出现的次数。

1
2
3
4
5
6
7
8
create table word_count as
select word,count(1) as count from
(select explode(split(line,' ')) as word from docs) w
group by word
order by word;

select * from word_count;
describe word_count;

image-20250304200653584

特别声明
千屹博客旗下的所有文章,是通过本人课堂学习和课外自学所精心整理的知识巨著
难免会有出错的地方
如果细心的你发现了小失误,可以在下方评论区告诉我,或者私信我!
非常感谢大家的热烈支持!