1. 为什么需要分布式存储
① 数据量太大,单机存储能力有上限,需要靠数量来解决问题
② 数量的提升带来的是网络传输,磁盘读写、CPU、内存等各方面的综合提升,分布式组合在一起可以达到1+1>2的效果
2. 分布式的基础架构分析
① 去中心化模式:没有明确中心,大家协调工作
② 中心化模式:有明确的中心,基于中心节点分配工作(Hadoop)
3. HDFS的基础架构
- NameNode:主角色,管理HDFS集群和DataNode角色
- DataNode:从角色,负责数据的存储
- SecondaryNameNode:辅助角色,协助NameNode整理元数据
4. HDFS集群环境部署
4.1 VMware虚拟机中部署
4.1.1 集群规划
Hadoop HDFS 的角色
- NameNode
- DataNode
- SecondaryNameNode
节点服务
- node1:NameNode、DataNode、SecondaryNameNode
- node2:DataNode
- node3:DataNode
4.1.2 上传解压
- 上传Hadoop安装包到node1节点中
- 解压安装包到/export/server/中
tar -zxvf hadoop-3.3.6.tar.gz -C /export/server/
- 构建软链接
cd /export/server
ln -s /export/server/hadoop-3.3.6 hadoop
- 进入hadoop安装包内
cd hadoop
4.1.3 Hadoop安装包目录结构
-
bin:存放Hadoop的各类程序
-
etc:存放Hadoop的配置文件
-
sbin:管理员程序
-
lib:存放Linux系统的动态链接库(.so文件)
-
libexec:存放配置Hadoop系统的脚本文件(.sh和.cmd)
4.1.4 修改配置文件
配置HDFS集群,我们主要涉及如下文件的修改
- 配置workers文件
cd etc/hadoop #进入配置文件目录
vim workers # 编辑workers文件
# 填入如下内容
node1
node2
node3
- 配置hadoop-env.sh文件
# 填入如下内容
export JAVA_HOME=/export/server/jdk
export HADOOP_HOME=/export/server/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
- 配置core-site.xml文件
# 在文件内部填入如下内容
<configuration>
<property>
<name>fs.defaultFS</name> # HDFS文件系统的网络通讯路径
<value>hdfs://node1:8020</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value> # io操作文件缓冲区大小
</property>
</configuration>
-
hdfs://node1:8020为整个HDFS内部的通讯地址,应用协议为hdfs://(Hadoop内置协议)
-
表明DataNode将和node1的8020端口通讯,node1是NameNode所在机器
-
此配置固定了node1必须启动NameNode进程
- 配置hdfs-site.xml文件
# 在文件内部填入如下内容
<configuration>
<property>
<name>dfs.datanode.data.dir.perm</name> # hdfs文件系统,默认创建的文件权限设置
<value>700</value>
</property>
<property>
<name>dfs.namenode.name.dir</name> # NameNode元数据的存储位置
<value>/data/nn</value>
</property>
<property>
<name>dfs.namenode.hosts</name> # NameNode允许哪几个节点的DataNode连接(即允许加入集群)
<value>node1,node2,node3</value>
</property>
<property>
<name>dfs.blocksize</name> # hdfs默认块大小
<value>268435456</value>
</property>
<property>
<name>dfs.namenode.handler.count</name> # namenode处理的并发线程数
<value>100</value>
</property>
<property>
<name>dfs.datanode.data.dir</name> # 从节点DataNode的数据存储目录
<value>/data/dn</value>
</property>
</configuration>
4.1.5 准备数据目录
- 在node1节点:
mkdir -p /data/nn
mkdir /data/dn
- 在node2,node3节点:
mkdir -p /data/dn
4.1.6 分发Hadoop文件夹
- 分发
# 在node1执行如下命令
cd /export/server
scp -r hadoop-3.3.6 node2:`pwd`/
scp -r hadoop-3.3.6 node3:`pwd`/
- 在node2执行,为hadoop配置软链接
# 在node2执行如下命令
ln -s /export/server/hadoop-3.3.6 /export/server/hadoop
- 在node3执行,为hadoop配置软链接
# 在node3执行如下命令
ln -s /export/server/hadoop-3.3.6 /export/server/hadoop
4.1.7 配置环境变量
- vim /etc/profile
# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
- 在node2和node3配置同样的环境变量
4.1.8 格式化整个文件系统
- 格式化namenode
# 确保以hadoop用户执行
su - hadoop
# 格式化namenode
hadoop namenode -format
- 启动
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh
# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh
5. HDFS的Shell操作
5.1 进程启停管理
5.1.1 一键启停脚本
- 一键启动HDFS集群
$HADOOP_HOME/sbin/start-dfs.sh
执行原理:
- 在执行此脚本的机器上,启动SecondaryNameNode
- 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,启动NameNode
- 读取workers内容,确认DataNode所在机器,启动全部DataNode
- 一键关闭HDFS集群
$HADOOP_HOME/sbin/stop-dfs.sh
执行原理:
- 在执行此脚本的机器上,关闭SecondaryNameNode
- 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,关闭NameNode
- 读取workers内容,确认DataNode所在机器,关闭全部NameNode
5.1.2 单进程启停
单独控制所在机器的进程的启停
- $HADOOP_HOME/sbin/hadoop-daemon.sh
hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)
- $HADOOP_HOME/bin/hdfs
hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)
5.2 文件系统操作命令
- 创建文件夹
hadoop fs -mkdir [-p] <path>
hdfs dfs -mkdir [-p] <path>
- -p:沿着路径创建父目录
- 查看指定目录下内容
hadoop fs -ls [-h] [-R] [<path> ....]
hdfs dfs -ls [-h] [-R] [<path> ....]
- -h:人性化显示文件size
- -R:递归查看指定目录及其子目录
- 上传文件到HDFS指定目录下
hadoop fs -put [-f] [-p] <localsrc> <dst>
hdfs dfs -put [-f] [-p] <localsrc> <dst>
- -f:覆盖目标文件
- -p:保留访问和修改时间,所有权和权限
- localsrc:本地文件系统
- dst:目标文件系统(HDFS)
- 查看HDFS文件内容
hadoop fs -cat <src> ....| more
hdfs dfs -cat <src> ....| more
- 下载HDFS文件
hadoop fs -get [-f] [-p] <src>....<localdst>
hdfs dfs -get [-f] [-p] <src>....<localdst>
- -f:覆盖目标文件
- -p:保留访问和修改时间
- 拷贝HDFS文件
hadoop fs -cp [-f] <src>....<dst>
hdfs dfs -cp [-f] <src>....<dst>
- -f:覆盖目标文件
- 追加数据到HDFS文件中
hadoop fs -appendToFile <localsrc>....<dst>
hdfs dfs -appendToFile <localsrc>....<dst>
- HDFS数据移动操作
hadoop fs -mv <src>....<dst>
hdfs dfs -mv <src>....<dst>
- HDFS数据删除操作
hadoop fs -rm -f [-skipTrash] [URl..]
hdfs dfs -rm -f [-skipTrash] [URl..]
- -skipTrash跳过回收站,直接删除
5.3 HDFS权限
略
5.4 HDFS 客户端
略
6. HDFS的存储原理
6.1 存储原理
略
6.2 fsck命令
6.2.1 HDFS副本块数量的配置
- 在hdfs-site.xml中配置:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
- 或者
hadoop fs -D dfs.replication=2 -put test.txt /tmp/
6.2.2 fsck命令检查文件的副本数
hdfs fsck path [-files [-blocks [-locations]]]
6.2.3 block配置
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
<description>设置HDFS块大小,单位是b</description>
</property>
6.3 NameNode元数据
略
6.4 HDFS数据的读写流程
6.4.1 数据写入流程
- 客户端向NameNode发起请求
- NameNode审核权限、剩余空间后,满足条件允许写入,并告知客户端写入的DataNode地址
- 客户端向指定的DataNode发送数据包
- 被写入数据的DataNode同时完成数据副本的复制工作,将其接收的数据分发给其它DataNode
- 如上图,DataNode1复制给DataNode2,然后基于DataNode2复制给Datanode3和DataNode4
- 写入完成客户端通知NameNode,NameNode做元数据记录工作
6.4.2 数据读取流程
- 客户端向NameNode申请读取某文件
- NameNode判断客户端权限等细节后,允许读取,并返回此文件的block列表
- 客户端拿到block列表后自行寻找DataNode读取即可