什么是HDFS,如何理解?

本文章的主题如下:

●概念
●优缺点
●组件成员和职责
●工作原理(读写流程、元数据管理机制)
●实现高可靠性的策略机制

一、概念

HDFS是高容错、高可靠性、高可扩展性、高吞吐率分布式文件存储系统。

二、HDFS的优缺点

优点:
	1.高容错性:数据自动保存多个副本,副本丢失,可自动恢复
	2.适合大数据处理
	3.流失数据访问:一次写入,多次读取
	4.低成本
缺点:
	1.不适合做低延迟访问:无法做到毫秒级别的访问
	2.无法对大量小文件进行存储:
		A)小文件过多,会过多占用namenode的内存,并浪费block。
		B)文件过小,寻道时间大于数据读写时间,这不符合HDFS的设计
	3.无法并发写入和随机修改:HDFS设计理念就是一次写入多次读取

三、HDFS组件成员及对应职责

HDFS组件成员有:Client客户端 、NameNode主节点、DataNode从节点 和SecondaryNameode。

Client(客户端):
				1.负责文件的切片,文件上传到HDFS的时候会把文件切分成一个个BLOCK进行上传存储 
				2.与NameNode进行交互,获得文件的存储位置,检查是否存在重复文件等
				3.与DataNode进行交互,写入真实的数据,以及读取数据
				4.提供了一些HDFS的访问命令,以及API操作

NameNode(主节点):
				1.管理HDFS的命名空间(维护目录树结构)。
				2.管理数据块的映射信息(管理元数据信息) 
				3.配置副本策略 
				4.处理客户端的请求
DataNode(从节点):
				1.存储真正的数据(按照块进行存储)
				2.执行数据块的读写操作 
				3.定时向NameNode进行汇报(心跳机制) 
SecondaryNameode:
				作为NameNode的辅助节点,帮助NameNode合并FSImage与Edits文件,由 于SecondaryNameNode 的元数据不能与NameNode的元数据保持实时同步,所以不能作为 NameNode的热备节点。
补充:
	元数据信息分为元数据和元数据文件。
	1.元数据(存在内存中)包括:
		A)文件和目录自身的属性信息(文件名、目录名、文件大小、创建时间、修改时间)
		B)文件内容存储相关信息(分block信息、副本个数、每个副本所在datanode节点的位置信息等等)
		C)HDFS中的所有datanode列表信息(用于管理datanode)
	
	2.元数据文件(存到磁盘持久化)包括:
		A)FSImage镜像文件:存放Hadoop文件系统中的所有目录和文件元数据信息,但不包含文件block位置信息。因为block信息只存储在内存中。
		B)Edits编辑日志文件:存放Hadoop文件系统所有更改操作(如:文件创建、删除或修改)的日志
		C)fstime文件:存放最近一次Checkpoint时间
		D)version文件:是标志性文件,最后被创建,它的存在表名前三个元数据文件以及创建成功。

四、HDFS工作原理

(1)HDFS读写流程
HDFS读流程

hdfs 副本集 hdfs数据块多副本存储优点_HDFS

读流程描述:
1. 客户端通过RPC调用DistributedFileSystem(分布式文件系统)的FileSystem对象的open()方法与Namenode交互。

2. DistributedFileSystem会给Namenode发送请求。

3. Namenode接收请求并处理请求:
	A)会先检查文件是否在Namenode维护的统一命名空间(即目录树结构)中,如果不存在文件,则返回检查结果给客户端,显示No such file or directory。
	B)如果文件存在,则会获取文件元数据信息(包括:block(分块)信息、副本个数、副本所在Datanode位置信息等),然后返回文件元数据信息给客户端。

4.客户端收到元数据信息后,会通过RPC调用FSDataInputStream(输入流)的read()方法与Datanode交互。

5.根据网络集群拓扑排序各个Datanode与客户端的网络距离,然后选取一个网络距离最近的Datanode,(因为Datanode会按照block存储文件的真实数据)依次请求读取Datanode的每个数据块。

6.客户端会先确认每个数据块的校验和,如果损坏,会记录故障Datanode,然后选取另外的Datanode请求,保证重复尝试故障Datanode(体现了HDFS的高可靠性)。

7.每次读取到一个Datanode的数据块的末端时,客户端会调用FSDataInputStream(输入流)的close()方法关闭与datanode间的联系,然后为下一个块找到最佳的datanode。

8.直到读取完文件分布在Datanode列表的所有数据块,打印数据信息在客户端显示。
HDFS写流程

hdfs 副本集 hdfs数据块多副本存储优点_hdfs 副本集_02

写流程描述
1.客户端通过RPC调用DistributedFileSystem(分布式文件系统)的create()方法与Namenode交互。

2.DistributedFileSystem会给Namenode发送请求。

3.Namenode会执行各种检查(如:文件名是否已存在、是否有权限去写、内存是否装得下这个文件)以确保客户端可以在Namenode维护的统一命名空间(即目录树结构)下创建这个文件。
	A)如果检查通过,就会生成一个新的文件记录。
	B)如果检查不通过,就会向客户端抛出一个IOException异常。
	
4.返回检查通过的信息给客户端后,客户端通过RPC调用FSDataOuputStream(输出流)的write()方法去维护Namenode和Datanode之间的通信。

5.客户端开始写入数据(流式写入):
	A)写入时先分块(block),比如上传200M的文件,分为block1(128M)和block2(72M)。因为hadoop2.x版本后的块默认大小为128M。
	200M文件 -->block1(128M)
				block2(72M)
	B)分块后,会给每个数据块根据Datanode列表位置信息创建副本,默认创建三个副本,Hadoop中的节点会根据机架感知原理,在尽可能提高效率以及保持容错性的基础上分配副本存放的位置。
	如配置了master,slave1,slave2三台集群。
	Datanode(master)节点1放在机架1,并在节点1上创建副本1,Datanode(slave1)节点2放在机架2,并在节点2上创建副本2,Datanode(slave2)节点3放在机架2或放在除了机架1和机架2的其他机架上,并在节点3上创建副本3。

机架1

机架2

机架3

namenode(master)

datanode2(slave1)副本2

datanode3(slave2)副本3

datanode1(master)副本1

datanode3(slave2)副本3

6.获取了块信息和节点列表信息后。要写入的数据会被分成若干个包(package),每个包的大小默认为64KB,这些包会形成一个数据队列,随着数据流流动写入每个块block中的Datanode节点列表存放的副本中,
Datanode列表会形成一个管线Pipeline,以管线的这种方式去对每个package的数据进行写入。每个块block写完后,会向Namenode报告,然后Namenode会根据分块信息将接下来的数据data写入下一个块block中,例如这里block1写完了就会创建block2,将数据写入block2。

7.所有block写完数据后,客户端会调用FSDataOutputStream流的close()方法关闭流。

8.客户端通过FSDataOutputStream向namenode发送数据写完的报告。
(2)HDFS元数据管理
NameNode、SecondaryNamenode工作机制

hdfs 副本集 hdfs数据块多副本存储优点_hdfs_03

NameNode、SecondaryNamenode工作机制过程描述:
第一阶段 Namenode启动
	1)第一次格式化namenode后,会创建edits和fsimage文件。如果不是第一次启动,会直接加载编辑日志和镜像文件到内存。
	2)客户端对元数据进行增删改的请求。
	3)Namenode记录操作日志,更新滚动日志。
	4)Namenode在内存中对数据进行增删改查。

第二阶段 SecondaryNamenode工作
	1)询问namenode是否需要checkpoint,直接返回namenode是否检查结果
	2)请求执行checkpoint
	3)当namenode滚动正在写的eidts日志,SN将滚动前的编辑日志和镜像文件拷贝到SN
	4)SN加载编辑日志和镜像到内存并合并
	5)生成新的镜像文件fsimage.chkpoint
	6)将fsimage.chkpoint拷贝到namenode
	7)Namenode将fsimage.chkpoint重新命名成fsimage

补充:
	checkpoint的触发条件:
	时间:默认每小时一次
	事物数量:默认是1000000次
DataNode工作机制(差不多是心跳机制)

hdfs 副本集 hdfs数据块多副本存储优点_HDFS_04

DataNode工作机制过程描述:
1)一个数据块在 datanode 上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2) DataNode 启动后向 namenode 注册, 通过后,周期性(1 小时) 的向 namenode 上报所有的块信息。
3) 心跳是每 3 秒一次,心跳返回结果带有 namenode 给该 datanode 的命令如复制块数据到另一台机器,或删除某个数据块。 如果超过 10 分钟没有收到某个 datanode 的心跳,则认为该节点不可用。