![](https://csdnimg.cn/release/download_crawler_static/87369534/bg4.jpg)
最后再说一下 HDFS 的几个设计特点(对于框架设计值得借鉴):
1. Block 的放置:默认不配置。一个 Block 会有三份备份,一份放在 NameNode 指定的
DataNode,另一份放在与指定 DataNode 非同一 Rack 上的 DataNode,最后一份放在与
指定 DataNode 同一 Rack 上的 DataNode 上。备份无非就是为了数据安全,考虑同一 Rack
的失败情况以及不同 Rack 之间数据拷贝性能问题就采用这种配置方式。
2. 心跳检测 DataNode 的健康状况,如果发现问题就采取数据备份的方式来保证数据的安
全性。
3. 数据复制(场景为 DataNode 失败、需要平衡 DataNode 的存储利用率和需要平衡
DataNode 数据交互压力等情况):这里先说一下,使用 HDFS 的 balancer 命令,可以
配置一个 Threshold 来平衡每一个 DataNode 磁盘利用率。例如设置了 Threshold 为
10%,那么执行 balancer 命令的时候,首先统计所有 DataNode 的磁盘利用率的均值,
然后判断如果某一个 DataNode 的磁盘利用率超过这个均值 Threshold 以上,那么将会
把这个 DataNode 的 block 转移到磁盘利用率低的 DataNode,这对于新节点的加入来说
十分有用。
4. 数据交验:采用 CRC32 作数据交验。在文件 Block 写入的时候除了写入数据还会写入交
验信息,在读取的时候需要交验后再读入。
5. NameNode 是单点:如果失败的话,任务处理信息将会纪录在本地文件系统和远端的文
件系统中。
6. 数据管道性的写入:当客户端要写入文件到 DataNode 上,首先客户端读取一个 Block
然后写到第一个 DataNode 上,然后由第一个 DataNode 传递到备份的 DataNode 上,
一直到所有需要写入这个 Block 的 NataNode 都成功写入,客户端才会继续开始写下一
个 Block。
7. 安全模式:在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系
统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式
结束。安全模式主要是为了系统启动的时候检查各个 DataNode 上数据块的有效性,同
时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在
实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,
只需要等待一会儿即可。
下面综合 MapReduce 和 HDFS 来看 Hadoop 的结构: