HDFS
Hadoop Distribute File System, Hadoop分布式文件系统
特点
1,支持超大文件,一般来说Hadoop文件系统会存储TB或者PB级别的数据
2,检测和快速应对故障,这是HDFS文件系统的设计目标之一
3,流式数据访问,应用程序能以流的形式访问数据集
4,高容错性,数据自动保存多个副本,副本丢失后自动回复
5,不能低延迟数据访问,Hadoop针对海量数据的吞吐量做了优化,牺牲了获取数据的延迟
6,不适合存储大量小文件
7,简化的一致性模型,在HDFS中文件通常只支持一次写入多次读取
8,不支持超强的事务
技术结构
HDFS本身是一个典型的主从结构,主要进程:NameNode,从进程:DataNode
NameNode
管理元数据
HDFS中的元数据包含三十几个属性
1,上传的文件名及存储的虚拟路径
2,文件所属组
3,文件的权限,大小等等
每一条元数据都会被维系在内存以及磁盘中
1,维系在内存中目的是为了查询快
2,维系在磁盘上是为了保证数据的可靠性
在HDFS中和元数据相关的文件有两个
1,fsimage文件:元映像文件。该文件在磁盘上持久存储元数据
2,edits文件:操作文件。用于记录HDFS的写操作
HDFS写操作流程
1,当HDFS接收到写操作的时候,先将命令记录到edits_inprogress文件中,然后解析命令,更改元数据,返回ACK信号给客户端,表示写入成功,注意在这个过程中,fsimage文件没有变化。
2,当达到指定条件之后,edits_inprogress文件会产生滚动,生成一个edis文件,解析这个文件,并更新fsimage文件中的元数据。
3,生成新edis文件的同时还会产生一个新的edis_inprogress文件,后续的写操作记录在这个文件中。
edits_inprogress的滚动条件
1,空间:每隔1min扫描一次edits_inprogress文件,当文件中记录达到一百万条后会自动滚动生成一个edits文件
2,时间:每隔3600秒edits_inprogress会滚动产生一个edits文件
3,重启:当Name Node被重启的时候,会自动触发edits_inprogress文件的滚动
4,强制:通过命令hdfs dfsadmin -rollEdits强制滚动
注意:当NameNode第一次启动之后1min的时候edits_inprogress文件会滚动一次
管理DataNode
心跳机制管理DataNode
1,DateNode每3秒给Name Node发送心跳
2,如果NameNode超过10min30s没收到DataNode的心跳,就会认为DataNode已经lost
3,心跳信号包含clusterid集群编号,当前DataNode的状态
安全模式(safemode)
NameNode重启后会进入安全模式,此模式下只能读,不能写。合理时间内如果没有退出安全模式,说明数据产生了不可挽回的损失,此时要考虑强制退出安全模式。
在安全模式中
1,NameNode会触发edis_inprogress文件的滚动,更新fsimage并写入内存
2,Name Node会等待Data Node的心跳,如果内有收到,则这个DataNode已经lost,重新备份保证副本数量;如果收到了,则会进行checksum校验,校验失败视图恢复数据继续校验,成功后会退出安全模式
DataNode
1,DataNode是HDFS的从节点,用于存储数据,数据以Block形式落地到磁盘
2,DataNode的状态:预服役、服役、预退役、退役、丢失
3,DataNode通过心跳机制向Name Node注册管理信息
SecondaryNameNode
由于HDFS集群配置限制,Hadoop只支持两种结构:
1,1个NameNode+1个SecondaryName+n个DataNode
2,n个NameNode+n个DataNode
考虑到NameNode的核心地位,必须要对NameNode来进行备份,所以在集群中通常采用第二种结构,因此在集群中很少会见到SecondaryNameNode
HDFS相关流程
删除流程
1,客户端发起RPC请求到NameNode,请求删除指定文件。
2,Name Node收到请求会进行两次校验,校验是否有写入权限,是否有指定文件。
3,校验成功后,NameNode会将该操作记录在edits_inprogress中,更新内存中的元数据,然后给客户端一个ACK信号,表示删除成功。注意,此时文件并没有冲HDFS中真的删除,只是修改了元数据。
4,之后,NameNode等待DataNode的心跳,在心跳响应中要求DataNode删除对应的Block。
5,DataNode收到心跳响应后,才会去磁盘删除对应的Block以及校验和文件,此时数据才真正从 HDFS中删除。
写入流程
1,客户端向NameNode发送RPC请求,请求上传问价。
2,NameNode收到请求后,进行两次校验,校验是否有写入权限,校验是否有同名文件。
3,校验成功给客户端返回一个信号,表示润许写入。
4,客户端收到信号后,再次发送请求,获取第一个Block的存储位置。
5,Name Node收到请求后,会将Block的存储位置返回给客户端(默认是三个)。
6,客户端收到地址后,会选择一个比较近的节点请求建立管道以写入数据,第一个存储的节点收到请求后,会顺次请求下一个Block存储的节点,依次向后,知道最后一个节点请求应答成功 。
7,建立好管道后,客户端将当前的Block封包(packet)写入第一个节点,然后第一个副本所在节点依次传输给下一个节点,直到写入最后一个节点。
8,写完一个Block后,客户端会给Name Node再次发送请求,请求获取下一个Block的存储位置。
9直到最后一个Block写完,客户端会给NameNode发送一个结束信号,NameNode关闭文件,文件关闭后不能修改。
读取流程
1,客户端向NameNode发送RPC请求,请求下载指定文件。
2,Name Node收到请求后,会进行两次校验,校验是否有读取权限,校验是否有指定文件。
3,校验成功,返回客户端允许读取。
4,客户端再次发送请求,获取第一个Block的存储位置。
5,NameNode收到请求之后,会将Block的存储位置返回给客户端。
6,客户端收到请求后,会选择一个比较近的节点,读取Block。
7,读取完成后,客户端会进行checkSum的校验,如果校验失败,则客户端会从剩余地址中重新读取,如果校验成功,则客户端会给NameNode发送请求,继续读取下一个Block块。
8,当客户端读取完所有Block块后,会给NameNode发送结束信号,NameNode收到信号后会关闭文件。