hadoop的dfs.replication和dfs setrep

首先 dfs.replication這個參數是個client參數,即node level參數。需要在每臺datanode上設置。
其實默認爲3個副本已經夠用了,設置太多也沒什麼用。

一個文件,上傳到hdfs上時指定的是幾個副本就是幾個。以後你修改了副本數,對已經上傳了的文件也不會起作用。可以再上傳文件的同時指定創建的副本數
hadoop dfs -D dfs.replication=1 -put 70M logs/2

可以通過命令來更改已經上傳的文件的副本數:
hadoop fs -setrep -R 3 /

查看當前hdfs的副本數
hadoop fsck -locations
FSCK started by hadoop from /172.18.6.112 for path / at Thu Oct 27 13:24:25 CST 2011
....................Status: HEALTHY
Total size: 4834251860 B
Total dirs: 21
Total files: 20
Total blocks (validated): 82 (avg. block size 58954290 B)
Minimally replicated blocks: 82 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 3
Average block replication: 3.0
Corrupt blocks: 0
Missing replicas: 0 (0.0 %)
Number of data-nodes: 3
Number of racks: 1
FSCK ended at Thu Oct 27 13:24:25 CST 2011 in 10 milliseconds
The filesystem under path '/' is HEALTHY

某個文件的副本數,可以通過ls中的文件描述符看到
hadoop dfs -ls
-rw-r--r-- 3 hadoop supergroup 153748148 2011-10-27 16:11 /user/hadoop/logs/201108/impression_witspixel2011080100.thin.log.gz


如果你只有3個datanode,但是你卻指定副本數爲4,是不會生效的,因爲每個datanode上只能存放一個副本。
hadoop fsck -locations 可以看到相應的提示信息,可以看到副本丟失率爲33.33%:
/user/hadoop/logs/test.log: Under replicated blk_-45151128047308146_1147. Target Replicas is 4 but found 3 replica(s).
Status: HEALTHY
Total size: 4834251860 B
Total dirs: 21
Total files: 20
Total blocks (validated): 82 (avg. block size 58954290 B)
Minimally replicated blocks: 82 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 82 (100.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 3
Average block replication: 3.0
Corrupt blocks: 0
Missing replicas: 82 (33.333332 %)
Number of data-nodes: 3
Number of racks: 1
FSCK ended at Thu Oct 27 13:22:14 CST 2011 in 12 milliseconds
參考:hdfs_design
http://hadoop.apache.org/common/docs/r0.20.204.0/hdfs_design.pdf
http://hadoop.apache.org/common/docs/r0.20.204.0/hdfs_design.html
當一個文件上傳時,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可以從上一個數據管道獲取數據,並同時將數據發送到下一個數據管道。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章