本节将详细详解HDFS的组件及其之间的关系,部分图片来自于Hadoop的官方网站。图3-1展示了客户端如何与HDFS进行交互并存取数据的过程。
图3-1
图片引用自Hadoop的官方网站:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html。
上图的具体含义如下:
(1)客户端与NameNode进行交互,NameNode通知Client将数据存储在哪一台DataNode上。由Client保存数据到其中一个DataNode上,然后DataNode会根据元数据信息,再将自己的数据备份到其他DataNode上。这样,Client只要上传到其中一个DataNode上,DataNode之间负责数据副本的复制。NameNode中metadata用于在内存保存数据的元信息。在${hadoop.tmp.dir}/dfs/name目录下,保存了edits和fsimages文件,它们分别是日志文件和metadata的内存镜像文件。
(2)保存成功以后,由NameNode来保存数据的元信息,即什么数据保存到哪几台DataNode节点上。
(3)每一个文件块的大小在Hadoop 2.0以后为128MB。可以在hdfs-site.xml中配置dfs.blocksize,其默认值为134217728字节,即128MB。文件块可以理解为将文件分割和存储的大小,如一个文件为138MB大小,此文件就会分为两个文件块即128MB一块和10MB一块,每一块都可以保存到不同的DataNode上。在获取文件时多个文件块,会再合并成一个完整的文件。同时,按HDFS每一个文件块存在3个副本的原则,则138MB的文件保存到HDFS文件系统上后,大小为128MB×3份+10MB×3份。而在NameNode中则保存了这六个文件块的具体位置信息,即元数据信息。
(4)SecondaryNameNode用于实时地管理NameNode中的元数据信息。执行更新和合并的工作。