复制策略是hadoop文件系统最核心的部分,对读写性能影响很大,hadoop和其它分布式文件系统的最大区别就是可以调整冗余数据的位置,这个特性需要很多时间去优化和调整。
一、数据存放
目前hadoop采用以机柜为基础的数据存放策略,这样做的目的是提高数据可靠性和充分利用网络带宽。当前具体实现了的策略只是这个方向的尝试,hadoop短期的研究目标之一就是在实际产品环境中观察系统读写的行为,测试性能和研究更深入的规则。
一个大的hadoop集群经常横跨多个机柜,而不同机柜之间的数据通讯同经过交换机或者路由,所以同一个机柜中不同机器的通讯带宽是比不同机柜之间机器通讯时候的大。
Hadoop提供了一个api来决定数据机所属的机柜id,当文件系统启动的时候,数据机就把自己所属的机柜id发给目录机,然后目录机管理这些分组。
Hadoop默认是每个数据机都是在不同的机柜上面,这种方法没有做任何性能优化,但是也有不少优点:
1、 数据可靠性是最高的。因为这样可以防止机柜出错的时候数据丢失。 2、 在读取数据的时候充分利用不同机柜之间的带宽。 3、 而且这个策略可以很容易的完成负载平衡和错误处理。
缺点就是写入数据的时候并不能完全利用同一机柜里面机器的带宽。
在默认的配置下,hadoop的冗余复制因子是3,意思就是每一块文件数据一共有3个地方存放,hadoop目前的存放策略是其中两份放在同一个rack id的不同机器上面,另外一个放在不同rack id的机器上面,简单来说就是1/3的冗余数据在一个机柜里面,2/3的冗余数据在另外一个机柜里面,这样既可以防止机柜异常时候的数据恢复,又可以提高读写性能。
上面所说的策略目前还是在测试优化阶段。
二、数据读取
数据读取策略,根据前面所说的数据存放策略,数据读取的时候,客户端也有api确定自己的机柜id,读取的时候,如果有块数据和客户端的机柜id一样,就优先选择该数据节点,客户端直接和数据节点建立连接,读取数据。如果没有,就随机选取一个数据节点。
三、数据复制
主要是在数据写入和数据恢复的时候发生,数据复制是使用流水线复制的策略。
当客户端要在hadoop上面写一个文件,首先它先把这个文件写在本地,然后对文件进行分块,默认64m一块,每块数据都对hadoop目录服务器请求,目录服务器选择一个数据机列表,返回给客户端,然后客户端就把数据写入第一台数据机,并且把列表传给数据机,当数据机接收到4k数据的时候,写入本地并且发起连接到下一台数据机,把这个4k传过去,形成一条流水线。当最后文件写完的时候,数据复制也同时完成,这个就是流水线处理的优势。