HDFS写数据流程图
- 客户端会根据配置文件将需要写入的文件切分为多个block, 例如将 jdk.tar.gz 切分为 block1 和 block2
-
客户端首先向NN发送写数据的请求, 当请求同意后,客户端会向NN发送请求写入block1,NN会告知客户端block1将被写入哪些DN(DN1, DN2, DN3)
-
然后客户端会找将写入的第一个DN建立数据传输的连接,然后第一个DN再与第二个将要写入的DN建立连接,第二个DN在与第三个DN建立连接。
当所有需要写入的DN连接都建立后,第一个DN会告知客户端连接已建立
-
当所有连接都建立成功后,客户端向第一个DN传输block1数据,然后DN1会拷贝副本至DN2,DN3
-
block2 的传输过程与block1的传输过程一样
HDFS读数据流程图
-
客户端首先向NN发送读数据请求,然后NN告知客户端文件的元数据信息
-
客户端拿到元数据后,向DN1发送读取block1的数据请求, DN1将block1的数据流返回
向DN2发送读取block2的数据请求, DN2将block2的数据流返回
HDFS 元数据管理与checkpoint
元数据
HDFS的目录结构以及每个文件的BLOCK信息(id, 副本系数, block存放位置)
**元数据信息存放位置 **
元数据存放在hdfs-site.xml
配置文件配置的目录下 ${hadoop.tmp.dir}/dfs/namesecondary/current
的fsimage_*
文件中。
NN 元数据操作
元数据信息由NN管理,当操作dfs上的文件时,NN会以树形结构在内存中将元信息实时记录下来。
NN会定时将内存中的元信息序列化为fsimage文件。
为了防止宕机造成内存元信息丢失,NN会记录序列化时间段内对HDFS相关的操作指令,生成edits日志文件。
合并fsimage与edits文
NN会生成多个时间点的fsimage与edits文件,并且会定期将某个时间点的fsimage与edits记录的操作合并生成一个新的fsimage, 然后替换该时间点的fsimage。
反序列化fsimage 与 edits文件
合并fsimage 与edits文件需要先将文件反序列化为树形结构,生成一个新的树形结构,然后在序列化为新的fsimage。该过程涉及大量IO操作,为了不影响NN的性能,因此有了secondary NN 来进行合并操作。
checkpoint
合并fsimage与edits文件生成新的fsimage文件称为checkpoint。