一、HDFS文件块的大小
HDFS中的文件在物理上是分块存储(Block),块的大小可以通过参数配置,默认是128M。
HDFS文件块设置的太小会增加寻址时间;设置的太大会导致磁盘传输数据的时间远远大于定位块开始位置的时间;HDFS块大小的设置主要取决于磁盘的传输速率。
二、HDFS写数据流程
- 客户端通过
DFS
向NamNode
请求上传文件,NameNode
检查文件是否存在,文件的父目录是否存在。 NameNode
返回Cli可以上传。Cli
请求上传第一个数据块。NameNode
返回3个DataNode
节点:dn1,dn2,dn3
Cli
通过FSDataOutPutStream
(一个类)向dn1请求上传数据,dn1调用dn2,dn2调用dn3,建立通讯管道。- dn1,dn2,dn3逐级应答Cli。
- Cli开始向dn1上传第一个数据块
Block
,先从磁盘读取数据放到一个本地内存中缓存,然后以Package
为单位向dn1发送数据,dn1收到Package
后会传给dn2,dn2回传给dn3,dn1每传一个Package
,就会放入一个应答队列等待应答。 - 当一个Block传输完以后,Cli再次请求NameNode上传第二个数据块。
小朋友,你是否有很多问好?反正我是有的,先记下来吧 - 第6步的逐级应答是什么
正常情况下,这个应答会从管道的最后一个数据节点开始,往客户端方向发送,管道上的每一个节点都会等待这个应答,收到应答后,才会开始接受数据,也就是说,客户端会等待这个应答,然后才开始发送数据。 - 第7步中的应该队列是干嘛的?
DFSOutputStream
同时也维护着另一个中间队列——确认队列(ack queue)
,确认队列中的包只有在得到管道线中所有的datanode的确认以后才会被移出确认队列。
三、HDFS的读数据流程
Cli
通过DFS向NameNode
请求下载数据NameNode
查询元数据,返回数据所在的节点Cli
根据就近原则,选择一个DataNode
请求读取数据DataNode
传输数据给Cli
,并以Package
为单位进行校验Cli
以Package
为单位接受,先缓存在本地,然后写入目标文件
四、NameNode的工作机制以及SeconaryNameNode的工作机制
NameNode阶段
- 如果是第一次启动
NameNode
,则将其格式化,创建Fsimage
和Edits
文件;不过不是第一次,则直接加载两个文件。 Cli
对元数据进行增删改请求NameNode
记录操作日志,更新滚动日志。NameNode
对内存中的数据进行增删改。
SecondaryNameNode阶段
5. SNN
向NN
询问是否要进行checkPoint
6. SNN
请求执行checkPoint
7. NN
滚动正在写的Edits
日志
8. NN
将滚动前的Fsimage
和Edits
文件拷贝到SNN
中
9. SNN
加载镜像文件和编辑日志到内存,并进行合并
10. 生成新的镜像文件Fsimage_chkpoint
,并拷贝到NN
中
11. NN
将镜像文件重新命名为Fsimage
小朋友你是否又有问好了,这里为什么要有镜像文件和编辑日志,就需要你自己去查了,不再赘述。