对HDFS分布式文件系统的简单理解。

来源:互联网 发布:对于网络诈骗的看法 编辑:程序博客网 时间:2024/06/05 16:05

最近在交叉看几本书,对阅读做个记录。

《精通hadoop》《hadoop实战》《hadoop技术详解》

(一)标准的HDFS集群由3个守护进程组成。

(1) NameNode(NN),一个集群一个, 储存文件系统的源数据,储存文件与数据块的映射,提供文件系统的全景图。

(2)次NameNode,一个集群一个,处理NameNode内务日志检查点。

(3)DataNode,(DN)一个集群多个,储存块数据。

疑问:为什么说NN保存了文件与数据块的映射关系,但NN不保存DN的具体位置。 

个人理解:NameNode本身在自己的磁盘中没有保存DataNode的具体位置,但是有“块报告”这个东西,在DataNode初始化(启动                        时),以及以后固定的时间间隔里,向NameNode发送一个“块报告” ,这个块报告就是一个包含了DN磁盘中所有数据块信                    息的列表,NameNode会保存这个块报告里面的信息。

参考资料:点击打开链接   深度解析:点击打开链接

(二)HDFS读写数据

(1) 读数据。

    客户端访问NameNode,告诉他要读取的文件。在确定客户身份以及客户有权限读取文件的情况下,NameNode 返回给客户端第一个数据块的标号以及保存有这个数据块的DataNode 列表。这个DataNode 列表是按到客户端的距离排序后的。

    客户端得到了数据块标号和DataNode 主机名,便可以访问最适合的DataNode ,读取需要的数据。 一直到读取完毕或者客户端主动关闭了。

    读取过程中如果发生了进程或主机异常,读取不会停止,HDFS会自动尝试从别的DataNode 中读取数据,如果所有副本都无法访问,则读取失败,返回给客户端异常。

(2)写数据

    客户端通过hadoop 文件系统向NameNode 发送请求,请求一个要写入的文件。此时会在NameNode 上建立该文件的元数据。然后客户端会收到“打开文件成功”,然后便可以向文件中写入数据了。

    当客户端将数据写入流时,数据会被拆分成数据包,保存在内存队列中。

    客户端有一个独立的线程,从该队列中读取数据包,同时向NameNode 请求一组DataNode列表。

    接着客户端连接到列表中的第一个 DataNode,这个 DataNode 会连接到第二个,第二个会连接第三个。如此以往,建立了数据块的复制管道。每一个DataNode 都会确认数据块已经写入磁盘。(确认就是向客户端发个消息说,数据块已经写入磁盘了,您安心吧。)

    客户端这面维护着一个列表,记录了哪些数据块还没有写入内存,每收到一个相应,客户端便知道了数据块已经写入了磁盘。

    当数据块写满了DataNode ,客户端便向NameNode 申请下一组DataNode。 最终所有数据块全部写入磁盘,关闭数据流,写操作完成。

(三)HDFS 命令行

start-dfs.sh 启动HDFS

touch  name.txt   ---新建文本

hdfs  dfs  -put  /目标文件夹    ---上传文件

hdfs  dfs  -cat  /目标文件    ---查看文本

hdfs  dfs  -mv   /原来文件  /目标目录  ---移动文件

hdfs  dfs  -ls   查看所有文件

hdfs  dfs  appendToFile  /被追加文件  /追加文件

hdfs  dfs   -rmr   /目标目录  rmr 循环删除hdfs系统中的目录

hdfs  dfs   -touchz   /文件名  创建一个文件

hdfs  dfs  -mkdir  -p  /afile/bfile  创建目录

hdfs  dfs  -moveFromlocal  /源文件   /目标文件夹    本地文件移入HDFS系统中

hdfs  dfs  -chgrp -R  root    改变所属组

hdfs  dfs  -chmod -R  777  递归改变所有文件目录与文件的权限