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