注:EditLog和Edits是同一个东西。Edits是EditLog的文件名,它存储了EditLog的内容。
🕘 2.2 HDFS文件读写原理
🕤 2.2.1 HDFS写文件流程
以300MB大小的1.txt文件为例,介绍HDFS写文件流程
- 客户端发起上传1.txt文件到指定目录的请求,通过RPC(远程过程调用)与NameNode建立通讯。
- NameNode检查元数据文件的系统目录树,即检查客户端是否有上传文件的权限,以及文件是否存在等。若系统目录树的父目录不存在该文件相关信息,返回客户端可以上传文件。
- 客户端根据分块策略对文件1.txt进行切分,形成3个Block,分别是blk1、blk2和blk3。
- 客户端向NameNode请求上传第一个Block,即blk1,以及数据块副本的数量。
- NameNode根据副本机制和机架感知向客户端返回可上传blk1的DataNode列表。
- 客户端从NameNode接收到blk1上传的DataNode列表,并与虚拟机建立管道(Pipeline)。
- Hadoop3向Hadoop2汇报管道建立成功,Hadoop2与Hadoop1汇报管道建立成功;Hadoop1与客户端汇报管道建立成功,客户端与所有DataNode列表中的所有DataNode都建立了管道。
- 客户端开始传输blk1,传输过程是以流式写入的方式实现。
1)将blk1写入到内存中进行缓存。
2)将blk1按照packet(默认为64K)为单位进行划分。
3)将第一个packet通过管道发送给Hadoop1。
4)Hadoop1接收完第一个packet之后,客户端会将第二个packet发送给Hadoop1,同时Hadoop1通过Pipeline将第一个packet发送给Hadoop2。
5)Hadoop2接收完第一个packet之后,Hadoop1会将第二个packet发送给Hadoop2,同时Hadoop2通过Pipeline将第一个packet发送给Hadoop3。
6)依次类推直至blk1上传完成。 - Hadoop3向Hadoop2发送blk1写入完成的信息,Hadoop2向Hadoop1发送blk1写入完成的信息,最后,Hadoop1向客户端发送blk1写入完成的信息。
注意:客户端成功上传blk1后,重复第4~9步的流程,依次上传blk2和blk3,最终完成1.txt文件的上传。
练习题:客户端上传文件的时候哪项是正确的?(多选)
A、数据经过 NameNode 传递给 DataNode
B、客户端端将文件切分为多个Block,依次上传
C、客户端只上传数据到一台 DataNode,然后由 NameNode 负责 Block 复制工作
D、客户端发起文件上传请求,通过RPC与NameNode建立通讯。
答案:BD
🕤 2.2.2 HDFS读文件流程
以300MB大小的1.txt文件为例,介绍HDFS读文件流程
- 客户端发起读取1.txt文件的请求,通过RPC与NameNode建立通讯。
- NameNode检查元数据文件的系统目录树,即检查客户端是否有读取文件的权限,以及文件是否存在等。
- 客户端按照就近原则从NameNode返回的Block列表读取Block。
- 客户端将读取所有的Block按照顺序进行合并,最终形成1.txt文件,需要注意的是,如果文件过大导致NameNode无法一次性文件的所有Block列表返回客户端时,会分批次将Block列表返回客户端。
🕒 3. HDFS的Shell操作
HDFS Shell类似于Linu