介绍了HDFS读写数据、NameNode和SecondaryNameNode、DataNode和NameNode的交互
HDFS写数据
流程图
具体步骤
- 客户端调用DS模块向NameNode请求上传文件。
- NameNode会检查目标文件和父目录是否已存在,再返回是否可以上传
- 假设文件为200M,客户端请求上传第一个 Block ,希望得到DataNode服务器位置。
- NameNode返回3个DataNode节点,分别为dn1、dn2、dn3,用它们存储数据。
- 客户端通过FSDataOutputStream模块请求dn1建立上传数据通道,dn1收到请求会继续请求dn2,然后dn2请求dn3,直到将这个通信管道建立完成。
- dn3、dn2、dn1逐级应答客户端。
- 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。(类似队列,以Packet为单位)
- 当一个Block(0-128M)传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)。
- 向NameNode汇报上传完毕。
注意事项
- DataNode位置选择,以默认3副本为例:第一个副本是最近的一般是它自己;第二个副本选择同一机架(同一路由)的不同节点;第三个副本是另一机架的随机节点。
- 数据传递以包为单位,第一个节点收到一个包,就把包传递给下一个DataNode。并不是等数据传完,再传递。
HDFS读数据
流程图
具体步骤
- 客户端调用DS模块向NameNode请求下载文件。
- NameNode会检查目标文件是否存在,再通过查询元数据,返回文件块所在的DataNode地址。
- 客户端通过FSDataInputStream模块向dn1(就近挑选)请求读取 Block1。
- DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。客户端以Packet为单位接收,先在本地缓存,然后写入目标文件。
- 当一个Block(0-128M)传输完成之后,客户端再次请求下载Block2。(重复执行2-4步)。
- 向NameNode汇报下载完毕。
注意事项
- 如果块的第一个副本请求失败,会向第二个副本请求,依次类推。
NameNode和SecondaryNameNode
流程图
具体步骤
第一阶段:NameNode
- 第一次启动NameNode(格式化)后,会创建Fsimage(镜像文件)和Edits(编辑日志)文件。以后启动,会直接加载镜像文件和编辑日志到内存,此时会进行合并操作。
- 假设此时客户端提出了增删改的请求。
- NameNode记录之前的编辑日志(edits_n),更新新日志到滚动日志(edits_inprogress_n)中。
- 日志记录完毕后,NameNode在内存中对数据进行增删改。
第二阶段:SecondaryNameNode
- Secondary NameNode向NameNode询问是否需要CheckPoint。
- 如果需要,Secondary NameNode请求执行CheckPoint。
- NameNode滚动日志。
- 将滚动前的编辑日志(edits_001)和镜像文件(fsimage)拷贝到Secondary NameNode。
- Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
- 合并后,生成新的镜像文件fsimage.chkpoint。
- 拷贝fsimage.chkpoint到NameNode。
- NameNode将fsimage.chkpoint重新命名成fsimage。
注意事项
- Fsimage 和 Edits文件?
fsimage是NameNode内存中元数据序列化后形成的文件。Edits中记录客户端更新元数据信息的每一步操作。每次执行增删改时,先改日志再改文件。好处是:如果保证中途gg,可以保证操作不丢失,便于复原。
- 为啥要Secondary NameNode?
首先要知道只有NameNode重启时,edit.log才会合并到fsimage文件中,所以运行时间久了就会有3个问题:edis.log文件会变的很大;NameNode下次重启会花费很长时间;fsimage文件文件很旧,如果中途挂掉就很睿智。
为了解决上述问题,SecondaryNameNode诞生,每隔一定时间辅助合并NameNode的edit.log到fsimage文件中。从上述流程图就可以发现,它做的就是这个。
- 什么时候执行CheckPoint?
(1) 用户定时 (2)edit.log 满了
- Secondary NameNode是热备份吗?
不是,可以发现Secondary NameNode合并的是滚动前的edis,它总是比NameNode的编辑日志少一点。
DataNode和NameNode
流程图
具体步骤
- DataNode启动后向NameNode注册。
- NameNode告知注册成功。
- DataNode周期性(1小时)的向NameNode上报所有的块信息。
- DataNode每3秒发送一次心跳,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。
- 超过10分钟没有收到心跳,表示该节点不可用。
注意事项
- 一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度、校验和 以及时间戳。
- 节点增加:新节点配置好后,自动向NameNode注册的。
- 节点退役:NameNode可以通过白名单指定需要的节点;通过黑名单指定不要的节点。