今天在网上查资料,突然发现一个很好玩的东西,一致性哈希算法,有个大佬解释的非常详细,出于羡慕就小小转载一波,也得到他同意了,如果感兴趣小伙伴们可以去瞅瞅,吼吼。。。好,言归正传,就是前两天给周围朋友讲了一下HDFS文件的读写流程,他们反映特别好,都说不错,恍然大明白的感觉,今天借着这个兴奋劲就写一篇,希望能帮大家理解一下HDFS的读写流程。。
说读写流程之前我们先简单了解一下读写数据所要用到的节点吧
主节点NameNode
- 接收并处理客户端发出的请求
- 维护文件系统的目录结构
- 管理block与文件、block与DataNode之间的关系
从节点DataNode
- 存储数据
- 将数据以block的形式存储到磁盘上
- 副本机制
写数据流程图
好!准备工作完毕,我们一步一步开始分析
- 首先客户端向NameNode请求向HDFS中写入数据。
- 然后NameNode会对发送请求的客户端进行权限检测,检测客户端是否有向HDFS中写数据的权限。这里在画图的时候忘记了还有一步,检测完权限后还会检测HDFS中是否存在要写的文件,如果权限不足或者文件已存在,都会抛出异常。
- 如果以上检测都通过,那么就给客户端返回可以写数据的DataNode信息。
- 客户端和DataNode建立连接。
- DataNode之间建立管道。这里需要解释一下,因为我们集群存储数据是以多副本形式存储的,所以为了提高文件存储的安全性,会将数据复制多份通过管道传到其他DataNode中。各种管道建好了,就开始以block的形式往DataNode中传数据。
- 等到数据都传完,客户端向NameNode发送完成写数据的消息。
以上就是向HDFS写数据的流程,有一说一,不是很详细,但是很好懂。
读数据流程图
我们继续分析
- 客户端向NameNode请求读HDFS中的数据。
- 同样的NameNode也会对发送请求的客户端进行权限检测,检测客户端是否有从HDFS中读数据的权限。然后还会检测HDFS中是否存在要读取的文件,如果权限不足或者文件不存在,都会抛出异常。
- 如果以上检测都通过,那么就给客户端返回数据的元数据信息。
- 客户端和DataNode建立连接,读取数据。这里读取数据有一个很重要的点,就是因为我们存储数据是以block形式存的,有的文件被切成多个block后可能被存到不同的DataNode中,其实NameNode在向客户端返回元数据信息的时候,就会将这个文件每个block的顺序和存放位置都告诉客户端,这时客户端读取文件时会按block的顺序进行读,如果读完第一个block而下一个block在其他DataNode中,则会与当前DataNode断开连接,和另外的DataNode建立连接,直到数据传输完毕。
- 等到数据都传完,客户端向NameNode发送完成读数据的消息。