1 - HDFS 的副本机制
HDFS 中的文件,在物理上都是以分块(block)存储的,块大小可以通过 hdfs-site.xml
文件中的参数 dfs.block.size
进行设置:
<!-- 块大小,单位:Byte -->
<property>
<name>dfs.block.size</name>
<value>134217728</value>
</property>
分块存储的好处有:
1)一个文件有可能大于集群中的所有磁盘,块机制可以很好地解决这个问题;
2) 使用块作为文件存储的逻辑单位,可以简化存储子系统;
3)块非常适合用于数据备份(冗余的数据副本),进而提供数据容错能力。
文件块的副本存储示例图:
在 Hadoop 1.x 版本中,block 大小默认是 64M,Hadoop 2.x 版本默认是 128M。
块大小的设置是否合理,对系统性能影响很大:
2 - HDFS 的机架感知机制
HDFS 的机架感知,又叫机架策略,用来决定副本存放位置的策略。
以默认的副本数=3为例:
1)第一个副本块保存在客户端所在的 DataNode 上;
2)第二个副本块保存在客户端所在 DataNode 同机架内的其他 DataNode 上;
3)第三个副本块保存不同机架的某个 DataNode 上。
生产环境中,需要手动配置机架策略。
3 - HDFS 的负载均衡机制
HDFS 的负载均衡机制,可以做到让每个 DataNode 上存储的数据的百分比相差不那么大。
HDFS 有一个自动的负载均衡操作,传输速度相对较慢,在集群规模较小的时候是可行的:
<!-- 集群空闲情况下,1M/s -->
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>1048576</value>
</property>
如果集群规模较大,为了防止负载均衡对正常的业务读写造成影响,应当在集群空闲的时候,手动执行负载均衡。
手动命令如下:
# 任意两个节点之间的存储百分比不超过10%
sbin/start-balancer.sh -t 10%