一个文件,上传到hdfs上时指定的是几个副本就是几个。修改了副本数(dfs.replications),对已经上传了的文件也不会起作用。
当然可以在上传文件的同时指定创建的副本数
hadoop dfs -D dfs.replication=2 -put abc.txt /tmp
可以通过命令来更改已经上传的文件的副本数:
hadoop fs -setrep -R 2 /
查看当前hdfs的副本数
hadoop fsck -locations
某个文件的副本数,可以通过ls中的文件描述符看到
hadoop dfs -ls
如果你只有3个datanode,但是你却指定副本数为4,是不会生效的,因为每个datanode上只能存放一个副本
当一个文件上传时,client并不立刻联系namenode,而是先在本地缓存数据,当 HDFS block size时, 联系namenode, namenode将文件名插入到文件系统结构中,并为期分配一个数据块。
namenode以datanode主机名和数据块的位置来相应client的请求。客户端从本地临时文件中将数据刷新到指定的datanode。
当file关闭时,未刷新的临时文件将传输到datanode,client通知namenode 文件关闭。 此时,namenode将文件创建操作提交到永久存储。
如果namenode在file closes之前die,则文件丢失。
创建副本
当client写文件到hdfs时,像前面提到的,先写文件到本地临时文件,假设设定hdfs的副本系数为3.当缓存的文件达到hdfs block size时,client从namenode检索一个datanode的列表。该列表包含将host该副本的datanode列表。
client刷新数据到列表中的第一个datanode。
第一个datanode以4kb为单位接收数据,将数据写到本地并传输到列表中的第二个datanode,第二个datanode也做同样操作。
一个datanode可以从上一个数据管道获取数据,并同时将数据发送到下一个数据管道。
配置参数可以不止一次被指定
最高优先级值优先
优先顺序(从低到高):
- *-site.xml on the slave node
- *-site.xml on the client machine
- Values set explicitly in the JobConf object for a MapReduce job
如果在配置文件中的值标记为final,它覆盖所有其他
<property>
<name>some.property.name</name>
<value>somevalue</value>
<final>ture</final>
</property>
对于类似副本数、data.dir,fs相关的参数建议在datanode节点配成final=true的
问:预处理主机的dfs.replication设置的是几?
答:预处理设置dfs.replication参数的hdfs-site.xml配置文件,修改后重新重启预处理服务,副本数问题搞定。
block的备份数是由写入数据的client端配置决定的,所以该类问题一般是由client的配置引起。
【参考】http://blog.sina.com.cn/s/blog_edd9ac0e0101it34.html