【大数据哔哔集20210122】面试官问我HDFS丢不丢数据?我啪就把这个文章甩到他脸上
点击上方蓝色字体,选择“设为星标”
回复”资源“获取更多惊喜
数据一致性
SecondaryNameNode 通知NameNode切换edits文件
SecondaryNameNode 从NameNode获得fsimage和edits(通过http)
SecondaryNameNode 将fsimage载入内存,然后开始合并edits。同样合并edits操作是需要满足一定条件才进行的,有两个条件:1)fs.checkpoint.period指定两次checkpoint的最大时间间隔,默认3600秒 2)fs.checkpoint.size规定edits文件的最大值,一旦超过这个值(默认大小是64M)则强制checkpoint,不管是否到达最大时间间隔。)
SecondaryNameNode 将新的fsimage发回给NameNode
NameNode用新的fsimage替换旧的fsimage
FileSystem fs = new RawLocalFileSystem();
fs.initialize(null, conf);
HA高可用
NameNode启动后会进入一个称为安全模式的特殊状态。处于安全模式的NameNode对于客户端来说是只读的。NameNode从所有的DataNode接收心跳信号和块状态报告(blockreport)。
每个数据块都有一个指定的最小副本数(dfs.replication.min),当NameNode检测确认某个数据块的副本数目达到这个最小值,那么该数据块就会被认为是副本安全(safely replicated)的。
在一定百分比(这个参数配置于dfs.safemode.threshold.pct,默认值是99.9%)的数据块被NameNode检测确认是安全之后,再过若干时间后(这个参数配置于dfs.safemode.extension,默认值是30秒),NameNode将退出安全模式状态。接下来NameNode会确定还有哪些数据块的副本没有达到指定数目,并将这些数据块复制到其他DataNode上。
HDFS会对写入的所有数据计算校验和(checksum),并在读取数据时验证。Datanode在收到客户端的数据或者复制其他Datanode的数据时,在验证数据后会存储校验和。正在写数据的客户端将数据及其校验和发送到由一系列Datanode组成的管线,管线中的最后一个Datanode负责验证校验和。如果Datanode检测到错误,客户端便会收到一个ChecksumException
客户端从Datanode读取数据时,也会验证校验和,将它们与Datanode中存储的校验和进行比较。每个Datanode均持久保存一个用于验证的校验和日志,所以它知道每个数据块的最后一次验证时间。客户端成功验证一个数据块后,会通知这个Datanode更新次日志
此外,每个Datanode也会在一个后台运行一个称为DataBlockScanner的进程定期验证存储在这个Datanode上的所有数据块。检测到错误后,Namenode将这个已损坏的数据块标记为已损坏,之后从其他Datanode复制此数据的副本,最后使得数据的副本达到指定数目
容错机制
DFSInputStream 会去尝试连接列表里的下一个 DataNode ,同时记录下这个异常节点
DFSInputStream 也会对获取到的数据核查 checknums 。如果损坏的 block 被发现了,DFSInputStream 就试图从另一个拥有备份的 DataNode 中去读取备份块中的数据
最后异常数据的同步工作也是由 NameNode 来安排完成
【大数据哔哔集20210121】SparkSQL优化策略小盘点