数据复制(Data Replication)
HDFS
旨在跨大型集群中的计算机可靠地存储非常大的文件。它将每个文件存储为一系列块,除最后一个块之外的文件中的所有块都具有相同的大小,HDFS
使用的默认块大小为 128MB
。复制文件的块以实现容错,且一般复制出的文件块会存储到不同的 DataNode
中。每个文件的Block
大小和Replication
因子都是可配置的。。
Replication
因子在文件创建的时候会默认读取客户端的HDFS
配置,然后创建(可改变)
HDFS
中的文件是write-one
,并且严格要求在任何时候只有一个writer
HDFS
数据冗余复制如图所示。
从图可以看到,文件/user/nuoline/data/part-1
的复制因子Replication
值是2
,块的ID
列表包括{1,3}
,可以看到块1和块3分别被冗余备份了两份数据块;
文件/user/nuoline/data/part-2
的复制因子Replication
值是3
,块的ID列表包括2、4、5,可以看到块{2,4,5}
分别被冗余复制了三份。
在
HDFS
中,NameNode
做着有关块复制的所有决定,它定期从群集中的每个DataNode
接收Heartbeat
和Blockreport
。心跳包(Heartbeat
)的接收表示该DataNode
节点正常工作,而Blockreport
包括了该DataNode
上所有的Block
组成的列表
数据复制流水线
当客户端将数据写入复制因子为 r = 3
的 HDFS
文件时,NameNode
使用 replication target choosing algorithm
检索 DataNode
列表。此列表包含将承载该块副本的 DataNode
。
然后客户端向第一个 DataNode
写入,第一个 DataNode
开始分批接收数据,将每个部分写入其本地存储,并将该部分传输到列表中的第二个 DataNode
。第二个 DataNode
又开始接收数据块的每个部分,将该部分写入其存储,然后将该部分刷新到第三个 DataNode
。最后,第三个 DataNode
将数据写入其本地存储。
可见,DataNode
是从流水线中的前一个接收数据,同时将数据转发到流水线中的下一个,数据是从一个 DataNode
流水线到下一个 DataNode
。
操作命名
应用可以以多种方式操控 HDFS 上的文件,其中通过 FS Shell 可以像操控 Linux 文件系统一般,常用命令有:
hdfs dfs -cp /user/merge /user/search
上面的命令将merge文件下面的所有文件(包括merge文件夹)复制到search目录下。
Action | Command |
创建 foodir 文件夹 | bin/hadoop fs -mkdir /foodir |
删除文件夹 | bin/hadoop fs -rm -R /foodir |
查看文件内容 | bin/hdfs dfs -cat /foodir/myfile.txt |
上传文件 | bin/hdfs dfs -copyFromLocal ~/a.txt /foodir/ |
…… | …… |
会发现这里有两种命令前缀,一个是 hadoop fs,一个是 hdfs dfs
区别是:hadoop fs 可以用于其他文件系统,不止是hdfs文件系统内,也就是说该命令的使用范围更广;而 hdfs dfs 专门针对hdfs分布式文件系统。
还有一个前缀为 hadoop dfs,这个已经过时,建议不要使用。