(一)HDFS
分布式文件系统,用于大数据的存储。具有高容错性、高可靠性、高可扩展型和高吞吐量等特征。
1. HDFS架构
HDFS是master/slave架构设计模式。一个HDFS集群有一个元数据节点(NameNode)和一些数据节点(DataNode)组成。NameNode是主节点,主要用来存储管理文件的元数据【元数据大小为150byte 即8条元数据为1K】(文件名称、大小、存放路径 )和处理来自客户端的请求。DataNode是从节点,用来管理对应节点的数据存储。即文件存储在DataNode上。
2. 主要组件
Block
HDFS中的数据是以数据块的形式存储的。默认大小为128M。(如果一个数据块小于128M,则按照具体大小存储。并不占用整个块空间)
NN
存储元数据信息和接收客户端请求。
元数据:文件名、文件大小、文件存储位置等。系统元数据保存在fsimage和edits中。
FsImae:系统映射文件,主要存储源数据信息。
Edits:操作日志文件。HDFS对文件的操作日志都保存在其中。
DN
按块存放数据。
周期性的向Name Node发送心跳,汇报数据存储情况
DN的工作机制
- 数据块在DN以文件的形式存储。包含两个文件,其中一个是文件本身,另外一个是文件的验证文件(长度,数据块、校验和、时间戳)
- DN启动后,向NN注册。周期性(1小时)的向NN汇报块情况。
- DN和NN之间有心跳机制(3S)。如果NN超过一段时间(10M)没有收到DN的心跳,则认为机器不可用。
SNN
为了解决系统启动时间长的问题。协助Name Node实现工作。
元数据存在内存中,可以快读相应请求。担心断电丢失,所以在磁盘中有备份文件。FsImage。
内存元数据修改,同步更新FsImage太慢(修改操作),引入Edits,只追加,效率很高。
SNN作用:系统启动流程。系统启动,Name Node会加载FSimage和Edits。得到完整的元数据信息之后,会写入FSimage中。如果系统两次启动时间较长,edits会比较大。合并fsimage和edits会比较耗时。启动时间较长。所以,secondNameNode就是协助NamaNode提前合并FsImage和Edits文件。
SNN工作流程:
- SNN求情NN是否需要checkPoint。返回是否需要的结果。
- SNN请求NN执行Checkpoint
- NN滚动正在写的Edits日志
- 通过Http get 方法将镜像文集FsImage和编译日志Edits拷贝到SNN。
- SNN加载镜像文件和日志文件到内存并合并。生成fsImage.chkpoint
- 通过Http post 将FsImage.chkPoint 发送到NN。NN重命名为FsImage并覆盖原有的文件。
触发Second Name Node一般是时间出发或者是Edits条数量到达阈值触发。
3. 文件的读写流程
(1) 读文件流程
- 客户端向NameNode发读文件请求。C->NN
- NameNode返回元数据列表(文件分多个Block,每个Block对应一个文件列表)
- 遍历每个Block,根据Block的元数据列表,选择最近节点发送的DataNode请求。建立连接。
- 获得数据后,关闭和DataNode的连接。处理下一个Block节点的下载。
- 关闭任务。
(2) 写文件流程
- 客户端向NamaNode发送写文件请求。C->NN
- NameNode验证权限,文件是否存在等。返回是否可以上传。
- 客户端循环处理每一块Block,向NN发送请求。获得当前Block的元数据列表。[ds1、ds2、ds3]
- 对当前Block,选择最近的DataNode ds1,使用FSDataOutPutStream建立连接,写入数据。
- 备份机制负责将写入的数据一步备份到其它节点上ds1 数据写入ds2,ds2数据写入 ds3。
- 完成所有Block写入后,关闭任务。
4. 知识点
(1) 网络拓扑:节点的计算
节点的距离:两个节点到达最近的共同祖先之和。
(2) HADOOP副本节点选择
第一个副本,如果客户端在节点上,就是当前节点,如果客户端不在节点上,第一个副本随意选择。
第二个副本是和第一个副本在同一机架,不同节点上。
第三个副本是和前两个不同机架,节点随机。