HDFS数据存储和删除

转载:https://blog.csdn.net/oh_mourinho/article/details/53117691node

1、数据写入

在客户端想HDFS写数据的过程当中,主要分为下面几个过程:缓存

客户端将数据缓存到本地的一个临时文件中;
当这个本地的临时文件到达HDFS中的块大小限制时,客户端访问Namenode,Namenode将文件的名字插入到HDFS命名空间中,而且为其分配相应的存储位置;
Namenode与分配好的Datanode进行沟通,肯定存储位置可用,而后将这些存储位置信息返回给客户端;
客户端将本地的临时文件传输到Datanode中;
当写文件结束,临时文件关闭时,会将已有的临时数据传输到Datanode中,并告知Namenode写数据完成;
Namenode将该文件改变为持久的一致性状态,也就事将该操做记录到日志EditLog中。若是此时Namenode宕掉,那么文件信息丢失。网络

上面的过程主要特色是写入数据先缓存到本地,在达到块大小限制时才与Datanode通讯进行传输。这样的好处在于避免在客户写数据的过程当中持续占用网络带宽,这对于处理多用户大量数据的写入是很是关键的。oop

2、数据备份

数据的写入同时伴随这数据块的备份,过程以下:学习

在客户端临时数据达到一个块时,与Namenode通讯,获得一组Datanode地址,这些Datanode就是用来存储该数据块的;
客户端首先将该数据块发送到一个Datanode上,Datanode在接受时是以4kb为单位进行,咱们把这些小单位称为缓存页(参考了Linux管道文件的说法);
对于第一个接到数据的Datanode,它把缓存页中的数据写入本身的文件系统,另外一方面,它又将这些缓存页传送给下一个Datanode;
重复3的过程,第二个Datanode又将缓存页存储在本地文件系统,同时将它传送给第三个Datanode;
若是HDFS中的备份数目设置为3,那么第三个Datanode就只须要将缓存页存储便可。.net

上面的过程当中,数据块从客户端流向第一个Datanode,而后再流向第二个,从第二个再到第三个,整个是一个流水线过程,中间不会有停顿。因此HDFS将它称为Replication Pipelining。日志

为何不采起客户端同时向多个Datanode写数据的方法呢?其实从Pipelining这个称呼上就能够猜到,客户端和Datanode采用的缓存文件都是管道文件,即只支持一次读取。blog

3、 数据删除

HDFS中的数据删除也是比较有特色的,并非直接删除,而是先放在一个相似回收站的地方(/trash),可供恢复。ip

对于用户或者应用程序想要删除的文件,HDFS会将它重命名并移动到/trash中,当过了必定的生命期限之后,HDFS才会将它从文件系统中删除,并由Namenode修改相关的元数据信息。而且只有到这个时候,Datanode上相关的磁盘空间才能节省出来,也就是说,当用户要求删除某个文件之后,并不能立刻看出HDFS存储空间的增长,得等到必定的时间周期之后(如今默认为6小时)。文档

对于备份数据,有时候也会须要删除,好比用户根据须要下调了Replicaion的个数,那么多余的数据备份就会在下次Beatheart联系中完成删除,对于接受到删除操做的Datanode来讲,它要删除的备份块也是先放入/trash中,而后过必定时间后才删除。所以在磁盘空间的查看上,也会有必定的延时。

那么如何当即完全删除文件呢,能够利用HDFS提供的Shell命令:bin/Hadoop dfs expunge清空/trash。

关于HDFS打开、读取、写入文件的操做,觉先博文 Hadoop学习总结之二:HDFS读写过程解析 给出了很好的说明,可供参考。

上面写的内容,基本上是来自HDFS官方文档,而后稍微加上一些本身的见解,不少地方也没有从Hadoop源码中去求证。若是有不对的地方,还请高手指正,不胜感激!

相关文章
相关标签/搜索