1 HDFS数据块复制时的目的节点的选择原则?
1 和客户端在同一节点或者同一个机架
2 选择其他机架
3 和第二个一样的机架但是不用的节点上
2 HDFS删除一个文件的过程源码?
1 客户端通过RPC,执行ClientProtocol.delete()发送删除请求
2 Namenode获得删除数据块的信息,执行底层的方法,删除所有数据块和对应的租约信息(先删除数据库信息和meta信息,删除之后执行数据节点中的数据块删除)
注意:
HDFS中的数据删除并不是直接删除,而是先放到类似于回收站的地方(trash),可供恢复。
当达到生命期限后(6小时),将彻底删除,并由Namenode修改相关的元数据信息
可以清空trash:bin/hadoop dfs expunge
3 删除一个数据块的原因?
数据块损坏、多余数据块、无效数据块等
Datanode会异步单独开启线程删除磁盘数据
4 NameNode的租约管理器?
租约是名字节点给与租约持有者(Client)的,在一定时间内的权限(写文件)。客户端需要不断的更新租约信息。
每一个打开的文件在租约管理器中都会有一条记录,所以已经打开的文件不能再被其他客户端打开,关闭文件时需要释放租约,每一条租约记录包括客户端信息,租约最新更新时间,打开的文件。
租约管理器会定时检查租约,对于长时间没有进行租约更新的文件,名字节点会进行租约恢复(租约恢复时针对已经打开的文件),关闭文件。
租约管理器中有两个租约过期时间:
- 软超时时间(1分钟)
- 硬超时时间(一小时),不可配置。
在超过了硬超时时间后会触发,租约恢复。
1)租约恢复过程:
总:选择恢复主节点,修改恢复文件的租约信息,收集参与租约恢复数据块的信息,找到最优的一个数据块取其长度,申请新的数据块版本号,然后同步数据块的版本号和长度,上报结果给Namenode并进行数据块信息的更新。
1)选择恢复主节点
首先在正常工作的数据流管道成员中选择一个作为恢复的主节点,其他节点作为参与节点,并将这些信息加入到主数据节点描述符中,等待该数据节点的心跳上报;
2)修改恢复文件的租约信息
名字节点触发的租约恢复会修改恢复文件的租约信息,他们的租约持有者统一改为NN_Recovery ;
3)租约恢复收集数据块信息
主数据节点收到指令后开始租约恢复,首先联系各个参与节点,开始租约恢复收集数据块信息.
4)找最小值数据块为恢复后的长度
根据收集到的数据块信息,找到最小值的教据块作为数据块恢复后的长度。
5)申请新数据块版本号
主数据节点向名字节点重新申请数据块版本号
6)同步长度和版本号
将长度和版本号同步到各个节点,同步结束后这些数据块拥有相同的大小和新的版本号。更新主要是利用DataNode上的FSDataSet.updata()方法进行更新
7)将恢复的结果上报给namenode.
8)Namenode更新块映射信息等
名字节点更新blockMap以及DataNodedescriptor中的信息等
2)租约检测
第1步,获取最老的已过期的租约。
第2步,得到此租约中保存的文件Id。
第3步,关闭这些文件Id对应的文件,并将这些文件Id从此租约中移除。
第4步,如果此租约中已经没有打开的文件Id,则将此租约从系统中进行移除。
5 在向HDFS中写数据的时候,当写入某个副本的时候出错怎么处理?
1、使用数据队列和确认队列来保证,无论那个节点故障了,都不会发生数据的丢失
2、使用租约恢复:
正常的数据节点辉被赋予一个新的版本号(租约信息中的时间戳版本),当故障恢复后发现版本信息不对,故障节点就会本删除
在当前正常的数据节点根据租约信息找到一个主DataNode,并与其他节点通信,选择虽小的数据块大小的DataNode,与其他节点进行同步,之后重新建立管道
3、NameNode的副本机制,在管线中删除故障节点,带文件关闭后,namenode发现副本不会,自然会进行复制副本。