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

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