2. 通知 DataNode 相互复制 Block。
3. DataNode 开始直接相互复制。
最后再说一下 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 的结构: