1HDFS概述
1.1HDFS背景及定义
产生背景:
分布式文件管理系统是一种系统来管理多台机器上的文件,而HDFS只是分布式文件管理系统中的一种。
定义
HDFS(Hadoop Distributed File System),是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
使用场景:适合一次写入,多次读出的场景,一个文件经过创建、写入和关闭之后就不需要改变
1.2优缺点
优点
1)高容错性:自动保存多个副本,某一副本丢失以后可以自动恢复
2)适合处理大数据:数据规模—能处理数据规模达到GB、TB甚至PB级数据
文件规模—能处理百万规模以上的文件数量
3)可构建在廉价机器上,通过多副本机制,提高可靠性
缺点
1)不适合低延时数据访问
2)无法高效对大量小文件进行存储
存储大量小文件的话,会占用NameNode大量内存来存文件目录和块信息
而且小文件存储的寻址时间会超过读取时间,违反HDFS的设计目标
3)不支持并发写入、文件修改
一个文件只能有一个写,不允许多个线程同时写
仅支持数据append(追加),不支持文件的随机修改
1.3HDFS组成架构
NameNode(nn):就是Master,是管理者
1)管理HDFS的名称空间;
2)配置副本策略;
3)管理数据块(Block)映射信息;
4)处理客户端读写请求。
DataNode(dn):Slave,nn下达命令,dn执行实际的操作
1)存储实际的数据块
2)执行数据块的读/写操作
Client:客户端
1)文件切分。文件上传HDFS时,Client将文件切分成一个一个的Block,然后进行上传
2)与NameNode交互,获取文件的位置信息
3)与DataNode交互,读取或写入数据
4)提供一些命令来管理HDFS,比如NameNode格式化
5)Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作
Secondary NameNode:并不是nn的热备,当nn挂掉时,并不能马上替换nn并提供服务
1)辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits,并推送给nn
2)紧急情况下可以辅助恢复nn
1.4HDFS文件块大小(面试重点)
HDFS的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x/3.x版本中是128M,1.x版本中是64M。
集群中的Block大小计算,如果寻址时间约为10ms,即查找到目标block的时间——则寻址时间为传输时间的1%时,则为最佳状态(专家),因此传输时间=10ms/0.01=1s——而目前磁盘的传输速率普遍为100MB/s——所以block大小=1s*100MB/s=100MB
问题:为什么块的大小不能设置太大也不能太小?
1)设置太小,会增加寻址时间,一直在定位块
2)设置太大,从磁盘传输数据的时间会明显大于寻址时间,导致处理变慢
所以HDFS块的大小设置主要取决于磁盘传输速率
2HDFS的Shell操作(开发重点)
2.1基本语法
hadoop fs 具体命令 或者 hdfs dfs 具体命令 两个完全相同
2.2命令大全
HDFS直接操作类
-
hadoop fs -ls:列出HDFS上的文件和目录。
- 可选参数:
-R
:递归列出子目录中的内容。-h
:以人类可读的格式显示文件大小。
- 可选参数:
-
hadoop fs -mkdir:在HDFS上创建目录。
- 可选参数:
-p
:递归创建目录,如果上级目录不存在则创建。
- 可选参数:
-
hadoop fs -put:将本地文件或目录复制到HDFS上。
- 可选参数:
-f
:覆盖已存在的目标文件或目录。-p
:保留本地文件或目录的修改和访问时间。
- 可选参数:
-
hadoop fs -get:将HDFS文件或目录复制到本地文件系统。
- 可选参数:
-p
:保留文件或目录的修改和访问时间。-ignorecrc
:忽略文件校验和检查。
- 可选参数:
-
hadoop fs -cat:将文件内容输出到stdout。可选参数:无。
- 标准输入(stdin):通常用于接收程序的输入数据,默认情况下,通常是键盘输入。
- 标准输出(stdout):通常用于向用户显示程序的输出信息,默认情况下,通常是显示在终端(命令行窗口)上。
- 标准错误(stderr):通常用于向用户显示程序的错误信息,默认情况下,也通常是显示在终端上。因此,当说某些内容输出到 "stdout" 时,意味着这些内容将被发送到标准输出流,通常会在终端或命令行窗口上显示给用户。
-
hadoop fs -rm:从HDFS中删除文件或目录。
- 可选参数:
-r
:递归删除目录及其内容。-skipTrash
:直接删除而不将文件移到回收站。
- 可选参数:
-
hadoop fs -mv:在HDFS上移动文件或目录。
- 可选参数:无。
-
hadoop fs -du:显示文件或目录的磁盘使用情况即统计文件夹的大小信息
- 可选参数:
-s
:递归显示子目录的磁盘使用情况。-h
:以人类可读的格式显示大小。
- 可选参数:
-
hadoop fs -chown:更改文件或目录的所有者。
- 可选参数:
-R
:递归更改所有者。
- 可选参数:
-
hadoop fs -chmod:更改文件或目录的权限。
- 可选参数:
-R
:递归更改权限。
- 可选参数:
-
hadoop fs -setrep:更改文件的副本数,这里设置的副本数只是记录在nn的元数据中,是否有这么多副本要看DataNode的数量。三台设备最多三个副本
- 可选参数:
-R
:递归更改副本数。
- 可选参数:
15.-cp:从HDFS的一个路径拷贝到HDFS另一个路径
16.-tail:显示一个文件的末尾1kb的数据
这些是常见的HDFS shell命令及其可选参数。可以通过在终端上键入hadoop fs -help
来获取更多详细信息和其他可用命令。
上传类
1)-moveFromLocal:从本地剪切粘贴到HDFS
2)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
3)-put:等同于-copyFromLocal,生产环境更习惯用put
4)-appendToFile:追加一个文件到已经存在的文件末尾
下载类
1)-copyToLocal: 从HDFS拷贝到本地
2)-get:等同于1),生产环境更习惯用get
3HDFS的API操作
HDFS(Hadoop Distributed File System)提供了一组API来与其交互,以便于在应用程序中访问、读取和写入数据。这些API可以通过Java编程语言调用,因为Hadoop是用Java编写的,同时也有其他编程语言的客户端库可用。
Hadoop FileSystem API:这是Hadoop提供的原生Java API,用于与HDFS交互。它包括了一系列类和方法,用于管理文件系统、读取文件、写入文件等操作。
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
// 创建一个FileSystem实例
FileSystem fs = FileSystem.get(configuration);
// 在HDFS上创建目录
fs.mkdirs(new Path("/user/mydirectory"));
// 从HDFS读取文件
InputStream in = fs.open(new Path("/path/to/file"));
// 读取文件内容
// 关闭输入流
// 将数据写入HDFS
OutputStream out = fs.create(new Path("/path/to/newfile"));
// 写入数据到文件
// 关闭输出流
3.1客户端准备
IDEA
3.2HDFS的API案例实操
包括文件上传、下载、更名和移动、删除文件和目录、文件详情查看、文件和文件夹判断,后补充
4HDFS的读写流程(面试重点)
4.1HDFS写数据流程
剖析文件写入
1)客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否已存在
2)NameNode返回是否可以上传
3)客户端请求第一个Block上传到哪几个DataNode服务器上
4)NameNode返回3个DataNode节点,dn1、dn2、dn3
5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成
6)dn1、dn2、dn3逐级应答客户端
7)客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个Packet会放入一个应答队列等待应答
这里的"应答队列"是指DataNode接收到数据包后向客户端发送的确认信息队列。当客户端将数据包发送给DataNode后,DataNode会对接收到的数据包进行确认,并将确认信息放入队列中。这样客户端就可以知道哪些数据包已经成功传输到DataNode了,哪些可能出现了问题需要重传。
这种机制对于数据传输的可靠性非常重要。客户端可以根据应答队列中的信息来判断数据包是否成功传输,如果有数据包未被确认,客户端可以选择重传或者采取其他措施来确保数据的完整性和可靠性。
8)当一个Block传输完成后,客户端再次请求NameNode上传第二个Block的服务器,重复3-7
网络拓扑-节点距离计算
写数据过程中,NameNode会选择距离待上传数据最近距离的DataNode接收数据。
节点距离:两个节点到达最近的共同祖先的距离总和
机架感知
1)官方说明
2)Hadoop3.1.3副本节点选择
4.2HDFS读数据流程
1)客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址
2)挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据
3)DataNode开始传输数据给客户端(从磁盘里读取数据输入流,以Packet为单位来做校验)
4)客户端以Packet为单位接收,现在本地缓存,然后写入目标文件
5NameNode和SecondaryNameNode
5.1NN和2NN工作机制
第一阶段:NameNode启动
1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2)客户端对元数据进行增删改的请求
3)NameNode记录操作日志,更新滚动日志
4)NameNode在内存中对元数据进行增删改
第二阶段:SecondaryNameNode工作
1)SecondaryNameNode询问NameNode是否需要CheckPoint,直接带回NameNode是否检查结果
2)SecondaryNameNode请求执行CheckPoint
3)NameNode滚动正在写的Edits日志
4)将滚动前的编辑日志和镜像文件拷贝到SecondaryNameNode
5)SecondaryNameNode加载编辑日志和镜像文件到内存,并合并
6)生成新的镜像文件fsimage.chkpoint
7)拷贝fsimage.chkpoint到NameNode
8)NameNode将fsimage.chkpoint重新命名为fsimage
5.2Fsimage和Edits解析
1)oiv查看Fsimage文件
2)oev查看Edits文件
因此,NameNode 在下次开机启动时合并哪些 Edits 主要是根据最近一个完整的检查点以及编辑日志的增量变化来确定的。
5.3CheckPoint时间设置
1)通常情况下,SecondaryNameNode每隔一小时执行一次
2)一分钟检查一次操作次数,当操作次数达到一百万时,2nn执行一次
6DataNode
6.1 DataNode工作机制
1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括的数据块长度,块数据的校验和以及时间戳
2)DataNode启动后向NameNode注册,通过后,周期性(6小时)地向NameNode上报所有的块信息
3)心跳是3s一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10min没有收到某个DataNode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器