数据复制(Data Replication)

HDFS 旨在跨大型集群中的计算机可靠地存储非常大的文件。它将每个文件存储为一系列块,除最后一个块之外的文件中的所有块都具有相同的大小,HDFS 使用的默认块大小为 128MB。复制文件的块以实现容错,且一般复制出的文件块会存储到不同的 DataNode 中。每个文件的Block大小和Replication因子都是可配置的。。

Replication因子在文件创建的时候会默认读取客户端的HDFS配置,然后创建(可改变)

HDFS中的文件是write-one,并且严格要求在任何时候只有一个writer

HDFS数据冗余复制如图所示。

hadoop hdfs 复制 hdfs数据复制_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 接收 HeartbeatBlockreport。心跳包(Heartbeat)的接收表示该DataNode节点正常工作,而Blockreport包括了该DataNode上所有的Block组成的列表

数据复制流水线

当客户端将数据写入复制因子为 r = 3HDFS 文件时,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,这个已经过时,建议不要使用。