研究一下HDFS的几个设计特点,可以给系统架构师们进行分布式计算框架设计提供一些启示:
1)Block的配置:
默认不配置。一个Block会有三份备份,一份放在NameNode指定的DataNode,另一份放在与指定DataNode非同一Rack上的DataNode,最后一份放在与指定DataNode同一Rack上的DataNode上。备份无非就是为了数据安全,考虑同一Rack的失败情况以及不同Rack之间数据拷贝性能问题就采用这种配置方式。
2)数据管道性写入:
当客户端要写入文件到DataNode上,首先客户端读取一个Block然后写到第一个DataNode上,然后由第一个DataNode传递到备份的DataNode上,一直到所有需要写入这个Block的NataNode都成功写入,客户端才会继续开始写下一个Block。
3)数据校验:
采用CRC32 作数据校验。在文件Block 写入的时候除了写入数据还会写入校验信息,在读取的时候需要校验后再读入。
4)健康监测:
心跳检测DataNode 的健康状况,如果发现问题就采取数据备份的方式来保证数据的安全性。
5)数据复制
如果DataNode 失败、需要平衡DataNode 的存储利用率和需要平衡DataNode 数据交互压力等情况。使用HDFS 的balancer(平衡器)命令,可以配置一个Threshold(阈值)来平衡每一个DataNode 磁盘利用率。
例如,设置了阈值为10那么执行balance(平衡器)命令的时候,首先统计所有DataNode的磁盘利用率的均值,然后判断如果某一个DataNode 的磁盘利用率超过这个均值阈值以上,那么将会把这个DataNode 的block 转移到磁盘利用率低的DataNode,这对于新节点的加入来说十分有用。
6)NameNod 是单点:
如果失败的话,任务处理信息将会纪录在本地文件系统和远端的文件系统中。
7)安全模式:
在分布式文件系统启动的时候,开始的时候会有安全模式,当分布式文件系统处于安全模式的情况下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。
安全模式主要是为了系统启动的时候检查各个DataNode 上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。
运行期通过命令也可以进入安全模式。在实践过程中,系统启动的时候去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
8)高效:
分布式文件系统的高效数据交互实现以及MapReduce 结合LocalData(本地数据)处理的模式,为高效处理海量的信息作了基础准备。
9)CPU 占用:
分布式计算程序的运行优先级非常低,一般不会对正常使用造成影响,但有部分大型软件中部分组件也可能运行于同等低优先级,这时情况下,可以手动暂停计算或是设置为不在使用计算机的时候进行计算。