写在前面

本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见1000个问题搞定大数据技术体系

解答

HDFS上的文件对应的 Block保存多个副本,且提供容错机制,副本丢失或宕机自动恢复。默认存3份副本。

副本放置策略

第一副本:放置在上传文件的 DataNode上;如果是集群外提交,则随机挑选台磁盘不太慢、CPU不太忙的节点

第二副本:放置在与第一个副本不同的机架的节点上

第三副本:与第二个副本相同机架的不同节点上。

如果还有更多的副本:随机放在节点中。

详情可以参考我的另一篇博客——Block块的存储策略是什么?HDFS副本放置策略是什么?

副本系数

  1. 对于上传文件到HDFS时,当时 Hadoop 的副本系数是几,那么这个文件的块副本数就有几份,无论以后怎么更改系统副本系数,这个文件的副本数都不会改变。
    也就是说上传到HDFS系统的文件副本数是由当时的系统副本数决定的,不会受副本系数修改影响。
  2. 在上传文件时可以指定副本系数, dfs.replication 是客户端属性,不指定具体的 replication 时采用默认副本数;
    文件上传后,备份数已经确定,修改dfs.replication 不会影响以前的文件,也不会影响后面指定备份数的文件,只会影响后面采用默认备份数的文件。
  3. replication 默认是由客户端决定的,如果客户端未设置才会去配置文件中读取。
  4. 如果在 hdfs-site.xml 中设置了 dfs.replication=1,这也并不一定就是块的备份数是1。
    因为可能没把 hdfs-site.xml 加入到工程的 classpath 里,那么我们的程序运行时取的 dfs.replication 可能是hdfs-default.xml中 dfs.replication 的默认值3
    可能这就是造成为什么 dfs.replication 总是3的原因。
hadoop fs setrep 3 test/test.txt 
hadoop fs -ls test/test.txt 

此时 test.txt 的副本系数就是 3 了,但是重新 put 一个到hdfs系统中,备份块数还是 1 (假设默认 dfs.replication 的值为 1 )。

上一篇 下一篇