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个副本备份。并且有一个专门记录文件块存放情况的元数据文件用来查询。
大数据
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()。
读取操作
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()。
写入操作
3.5、Block的副本放置策略
HDFS系统的容错性要求数据需要自动保存多个副本,副本的放置策略为
第一份副本:放置在上传文件的DataNode上,如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二份副本:放置在与第一份副本不同机架的DataNode上。
第三方副本:放置在与第二份副本相同机架上的节点DataNode.
更多副本:随机节点放置。
block备份