1.副本选择
HDFS会尽量使用离程序最近的副本来满足用户请求,这样可以减少总带宽消耗和读延时。如果在读取程序的同一个机架有一个副本,那么就使用这个副本;如果HDFS机群跨了多个数据中心,那么读取程序将优先考虑本地数据中心的副本。
2.负载均衡
HDFS的架构支持数据均衡策略。如果某个DataNode的剩余磁盘空间下降到一定程度,按照均衡策略,系统会自动把数据从这个DataNode移动到其他节点。当出现对某个文件有很高的需求时,系统可能会启动一个计划创建该文件的新副本,并重新平衡集群中的其他数据。目前这些均衡策略还没有实现。
3.客户端缓存
客户端创建文件的请求不是立即到达NameNode, HDFS客户端先把数据缓存到本地的一个临时文件,程序的写操作透明地重定向到这个临时文件。当这个临时文件累积的数据超过一个块的大小(64MB)时,客户端才会联系NameNode。NameNode在文件系统中插入文件名,给它分配一个数据块,告诉客户端DataNode的ID和目标数据块id,这样客户端就把数据从本地的缓存刷新到指定的数据块中。当文件关闭后,临时文件中剩余的未刷新数据也会被传输到DataNode中,然后客户端告诉NameNode文件已关闭,此时NameNode才将文件创建操作写入日志进行存储。如果NameNode在文件关闭之前死机,那么文件将会丢失。如果不采用客户端缓存,网络速度和拥塞都会对输出产生很大的影响。
4.流水线复制
当客户端要写数据到HDFS的文件中时,就像前面介绍的那样,数据一开始会写入本地临时文件。假设该文件的复制因子是3,当本地临时文件累积到一个数据块的大小时,客户端会从NameNode获取一个副本存放的DataNode列表,列表中的DataNode都将保存那个数据块的一个副本。客户端首先向第一个DataNode传输数据,第一个DataNode一小块一小块(4KB)地接收数据,写入到本地库的同时,把接受到的数据传输给列表中的第二个DataNode;第二个DataNode以同样的方式边收边传,把数据传输给第三个DataNode;第三个DataNode把数据写入本地库。DataNode从前一个节点接收数据的同时,即时把数据传给后面的节点,这就是流水线复制。