目录
要点总结
- HDFS File只支持Append写,每个Block在DN节点上其实就是Linux的一个文件,在写满一个Block Size后,会创建新文件,继续写新文件,所以Block不宜太小,会导致文件数过多。
- Client在读写Block过程中,如果有Bad Block,Client和DN都会向NN上报,减轻NN负担。
- Standby NN通过HTTP协议上传下载NN的元数据文件FSImage文件,优点是大文件数据比TCP实现更简单,消耗更小,同时因为RPC则无法传递大数据量,所以选HTTP。
- Client写Block,Client与DN、DN与DN之间,会开启两个线程,两个socket,一个负责接收数据并写入下一个DN,一个负责接收DN的ack,两个线程专门服务一个写请求,保证吞吐率,主线程将数据写入dataqueue队列,开启新线程不断读取dataqueue,将数据分package进行检验(在TCP流中表现就是数据帧),往DN发送,同时将package放入到ackqueue,当收到ack后,将ackqueue的package移除
- Client读Block,先判断Block和Client是否同一个机器,是则直接读Linux文件,否则通过TCP流读数据,DN写出数据时,会通过java的NIO transferTo方式,直接将数据从磁盘读入->内核缓存->输出,直接在内核态将数据输出,避免数据经过用户态,提高效率
- NN保存有file和block映射信息,但是不保存Block与DN映射信息,在DN启动时,通过blockReport上报所有Block信息给NN,所以这里可见,DN是可以将整个目录拷贝迁移到其他服务器,然后重新启动DN,会扫描当前机器所有Block,再report给NN的。
- DN会定期report所有Block给NN,也会增量report Block给NN(report信息太频繁,可能导致NN负载过高),同时也会发送心跳包将DN的负载等信息report 给NN,然后从NN带回指令执行,NN与DN是主从关系,NN不会主动联系DN
- DN检查Block完整性,主要包括Block Scanner & VolumeScanner扫描block内容是否损坏(限流扫描非常慢),DirectoryScanner扫描内存的目录与磁盘目录是否一致,DiskChecker扫描磁盘是否正常