3.1、核心概念

数据块: 每个磁盘都有默认数据大小,是磁盘进行读写的最小单位,HDFS 1.x 默认数据块大小为64M在HDFS 2.0 默认大小为128M。(当文件/数据小于一个快的大小时不会占据整个块空间。如:一个1M的文件存储在一个128M的快中时文件只会使用1M而不是128M).

NameNode:HDFS集群的管理节点,一个集群一般只会有一台活动的NameNode(存放元数据)。

NameNode功能:接受客户端的读写请求。(NameNode保存的Metadata文件/ownership/文件的permission,以及文件包含哪些Block,block保存在哪些DateNode的信息。在启动时会加载这些信息)。

DataNode:按照文件的大小分成若干个block进行存储。block的大小和副本数量是通过client端上传文件时设置的。(文件上传成功后副本数量可以修改,blockSize不可以修改,默认情况每个block都有三个副本)。

SecondaryNameNode:主要作用帮助NameNode合并edit操作,减少nameNode启动时间。

# 默认3600秒 按照配置文件中此项配置进行合并edit操作fs.checkpoint.period=3600 #根据配置文件设置的edits log的大小 进行合并edit操作fs.checkpoint.size=64M

元数据:元数据保存在NameNode的内存中,以便快速查询,主要包括fsimage和edits.

fsimage:元数据镜像文件(保存文件系统的目录树)edits:元数据操作日志(针对目录树的修改操作)被写入共享存储系统中。

3.2、HDFS执行过程

(1)客户端传入文件读写请求,名称节点(NameNode)接受客户端的读写服务请求。

(2)名称节点(NameNode)根据保存的Metadata元数据和镜像文件与数据节(DataNode)点进行协调,Secondary NameNode 进行写操作。

(3)同时DataNode之间进行数据复制。

注:如果要存储一个大文件,首先将文件进行分割成块,分别放到不同的节点,每一块文件都有3个副本备份。并且有一个专门记录文件块存放情况的元数据文件用来查询。




hdfs在hadoop2默认blocksize是128m hdfs默认block size的大小是_中block的概念

大数据



3.3、HDFS读文件流程

1、客户端通过调用FileSystem对象的open()方法打开读取文件,对于HDFS来说,这个对象是DistributedFileSystem的一个实例。

2、DistributedFileSystem通过RPC调用NameNode,确定开始快block的位置。

3、NameNode返回存有该块的DataNode地址,DataNode会根据他们与客户端的距离来排序,如果客户端本身就是DataNode,那么该客户端将会从包含有想要数据块副本的本地DataNode读取数据,DistributedFileSystem返回一个FSDataInputStream--->DFSInputStream 对象 该对象管理DataNode和NameNode的I/O。接着客户端反复调用read()方法。

4、当读取到块末尾时DFSInputStream 会关闭与该DataNode的连接,然后寻找下一个块最佳的DataNode.

5、客户端从流中读取数据时,是按照DFSInputStream与DataNode新建连接的顺序进行读取,也会询问NameNode检索下一个块的DataNode的位置。客户端读完完成会调用FSDataInputStream的close()。




hdfs在hadoop2默认blocksize是128m hdfs默认block size的大小是_客户端_02

读取操作



3.4、HDFS写文件流程

1、客户端调用DistributeFileSystem对象的create()方法新建文件。

2、DistributeFileSystem 经过RPC请求NameNode在文件系统的命名空间内创建一个新文件。

3、NameNode负责检查改文件是否已存在,客户端是否有创建文件的权限,如果检查通过则创建文件成功。如果不通过,返回客户端IOException异常。

4、DistributeFileSystem 向客户端返回一个FSDataOutputSream对象,客户端就可以写入数据了,FSDataOutputStream ---> DFSOutputStream。该对象负责处理DataNode和NameNode之间的通信。在客户端写入时DFSOutputStream将数据分成一个个包,并写入内部队列(write_queue)。

5、DataStream处理写入队列,将数据写入到合适的DataNode的block中。

6、DFSOutputStream也维护一个确认队列(ack_queue)收到DataNode确认信息后,该数据才会从确认队列中移除。

7、客户端完成数据写入后,对数据流进行close()。




hdfs在hadoop2默认blocksize是128m hdfs默认block size的大小是_数据_03

写入操作



3.5、Block的副本放置策略

HDFS系统的容错性要求数据需要自动保存多个副本,副本的放置策略为

第一份副本:放置在上传文件的DataNode上,如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。

第二份副本:放置在与第一份副本不同机架的DataNode上。

第三方副本:放置在与第二份副本相同机架上的节点DataNode.

更多副本:随机节点放置。




hdfs在hadoop2默认blocksize是128m hdfs默认block size的大小是_HDFS_04

block备份