HDFS定义:
HDFS(Hadoop Distributed File System),是一个分布式文件系统,用于存储文件,由多服务器联合起来实现,各节点实现不同的工作任务。
HDFS优点:
- 高容错性 — 数据多副本保存,某一个副本丢失可自动恢复。
- 数据处理能力强 — 能够处理TB,以及PB级别数据量,能处理百万规模以上的文件数量。
HDFS缺点:
- 不能实现低延时 — 不适合低延时数据访问,具有一定延时性。
- 不适合小文件存储 —大量小文件会占用nameNode大量内存来存储文件元数据和块信息;小文件寻址时间超过文件读取传输时间,不符合设计理念。
- 不支持并发写入 — 一个文件只能有一个写入线程,不能多线程同时写入。
- 不支持数据修改 — 只支持数据追加,不支持修改。
HDFS文件块:
在HDFS上存储的文件,物理上是分块(block)存储的,块的大小是可以通过参数(dfs.blocksize)配置。hadoop 2.x版本默认块大小是128M,1.x老版本默认块大小是64M。
块的大小主要取决于磁盘读数据性能。HDFS系统理想读数据:寻址时间 / 数据传输时间 = 1%,当前磁盘传输速率百M每秒,而数据块大小为128M,当传输时间大于1秒,所以HDFS无法做到毫秒级别低延迟。
HDFS组成和职责:
HDFS组成及功能:
hdfs由 NameNode、DataNode、Client 、Secondary NameNode四个部分组成,它们互相协调工作。
- NameNode: ------ master角色,管理协调。
1)hdfs命名空间管理;
2)配置副本策略;
3)管理数据块映射信息;
4)处理客户端读写请求。 - DataNode:------ Slave角色,接收NN命令,执行具体操作。
1)实际存储数据块;
2)数据块读\写操作 - Client:------ 客户端。
1)文件切分,文件上传hdfs之前,根据配置切分文件;
2)与NameNode交互,获取文件存储的节点信息;
3)与DataNode交互,数据的读写;
4)Client通过一些命令来管理HDFS,如NameNode的格式化、 对HDFS增删改查; - Secondary NameNode:------ 不是NameNode的热备,不会接替NameNode的工作。
1)辅助NameNode的工作,分担工作压力,比如定时合并FSimage和Edits,推送给NameNode;
2)NameNode出现故障时,可辅助NameNode恢复数据。
HDFS上传文件流程:
- 客户端通过Distributed FileSystem 模块向NameNode请求上传文件,NameNode检查文件合法性;
- NameNode响应是否可上传;
- 客户端切分文件并请求第一个Block数据上传节点;
- NameNode返回数据库上传的地址信息;
- 客户端通过FSDataOutputStream就近原则请求第一个DataNode节点建立通道,第一个DataNode节点向第二个DataNode节点请求,第二个DataNode向第三个DataNode请求;
- 第三个DataNode向第二个DataNode应答,第二个DataNode向第一个DataNode应答,第一个DataNode向客户端应答;
- 客户端以Packet为单位向第一个DataNode上传数据,第一个DataNode复制数据向第二个DataNode传输,第二个DataNode复制数据向第三个DataNode传输,然后反向应答;
- 当一个Block上传完成后,客户端向NameNode请求上传第二个Block,直到所有数据库上传完成。
一个数据块在DataNode是以文件的形式存储在磁盘上,数据块包含两个文件:一是数据库本身,一是数据库元数据(数据块长度、数据块的校验和、时间戳)
HDFS读文件流程
- 客户端通过DistributeFileSystem 向NameNode请求下载文件;
- NameNode查询元数据,返回对应数据块所在的DataNode节点;
- 客户端就近原则请求DataNode 下载第一个Block数据块;
- 该DataNode以packet为单位向客户端传输数据块;
- 客户端接收到一定量数据后,从缓存把数据刷到目标文件。
HDFS沟通机制
- DataNode启动后向NameNode注册;
- NameNode返回注册成功应答;
- DataNode向NameNode上报数据块信息,以后每小时上报一次;
- DataNode向NameNode发送心跳;
- NameNode返回心跳应答,带有对该DataNode操作命令;
- 超过10分钟没收到DataNode心跳,则认为该DataNode不可用。
集群启动时,先进入安全模式,等每个数据块至少一个副本元数据上报到NameNode,退出安全模式,在安全模式下DataNode上数据是只读。
Secondary NameNode 与NameNode 工作机制:
NameNode内部工作:
- 当NameNode是第一次启动的时,先进行格式化,然后创建Fsimage和Edits文件;
- 如果NameNode不是第一次启动,直接加载Fsimage和Edits文件到内存;
- 客户端发送请求NameNode增删改元数据时,追加操作信息到Edits文件,NameNode在内存中修改元数据。
Secondary NameNode辅助NameNode工作:
- Secondary NameNode咨询NameNode是否需要CheckPoint操作,返回结果应答。(一个小时咨询一次)
- Secondary NameNode 向 NameNode 请求执行CheckPoint;(NameNode 中edits文件达到阈值)
- 滚动正在追加的edits文件;
- 将滚动前的edits 和fsimage文件复制到Secondary NameNode内存中;
- Secondary NameNode 通知日志操作合并成新的fsimage.chkpoint;
- 将新合成的edits.chkpoint 复制到NameNode;
- NameNode将fsimage.chkpoint改名称fsimage,代替之前的fsimage。