一個文件,上傳到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
