1、概念
hadoop从广义上说指的是依托于Apache Hadoop项目的整个生态圈,包括hdfs、spark、sqoop、flume等等。狭义上说就是指的是Apache Hadoop这一个项目。现阶段学习的内容以hadoop这一个项目为核心,所以下面的内容都基于狭义上的hadoop,其实更准确的描述就是基于HDFS。
2、HDFS框架
HDFS 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和SecondaryNameNode.
3、HDFS组成进程简介
HDFS(Hadoop分布式文件系统)包括NameNode、DataNode、SecondaryNode三个进程。
NameNode
NameNode是HDFS的命名空间,里面存储着整个HDFS的所有文件的元数据信息,这些信息都会加载到内存中,元数据信息分为两部分,第一部分是文件系统树及整棵树内所有的文件和目录,第二部分是每个文件的各个组成块所在的数据节点信息。第一部分会落地形成文件(命名空间镜像文件和编辑日志文件)永久保存,第二部分的信息是在HDFS启动时,DataNode自动报送给NameNode,所以这个不会永久保存。元数据格式如下(/test/a.log是在hdfs文件系统中的路径,3是这个文件的副本数(副本数可以通过在配置文件中的配置来修改的)。在hdfs中,文件是进行分块存储的,如果文件过大,就要分成多块存储,每个块在文件系统中存储3个副本,以上图为例,就是分成blk_1和blk_2两个块,每个块在实际的节点中有3个副本,比如blk_1的3个副本分别存储在h0,h1,h3中):
简单元数据存储逻辑图(不用较真,只是为了表达为什么元数据的存储逻辑是现在这样):
DataNode
文件块( block): 最基本的存储单位。 对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。 HDFS默认Block大小是128MB, 因此,一个256MB文件,共有256/128=2个Block.
与普通文件系统不同的是,在 HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间, 但是会占用一个块。
DataNode是文件系统的工作节点,它会根据需要存储并检索数据块,受NameNode调度,并且定期向NameNode发送该DataNode上存储的块的列表信息。一个数据块在Datanode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
SecondaryNode
SecondaryNode是辅助NameNode,它是用来定期合并NameNode产生的编辑日志(edits.log)和命名空间镜像文件(fsImage),以防止edits.log过大。SecondaryNameNode一般要在另一台机器上运行,因为它需要占用大量的CPU时间与namenode相同容量的内存才可以进行合并操作。它会保存合并后的命名空间镜像的副本,并在namenode发生故障时启用。