HDFS主要包含NameNode、Secondary NameNode和DataNode三部分,且这三部分在分布式文件系统中分属不同的机器,其中Secondary NameNode不是必须的,在HA架构中Standby NameNode可以替代它。
(这一部分如果看不懂没关系,先看对各部分的功能介绍,如果你不先了解他们是干嘛的,那么这些抽象的名词没有任何意义。)
1. NameNode
NameNode主要维护着整个文件系统的文件目录树、文件/目录的信息和每个文件对应的数据块列表,并且还负责接收用户的操作请求。
- 目录树:表示目录之间的层级关系,就是我们在HDFS上执行ls命令可以看到的那个目录结构信息。
- 文件/目录的信息:表示文件/目录的的一些基本信息(所有者、属组、修改时间、文件大小等信息)
- 每个文件对应的数据块列表:如果一个文件太大,那么在集群中存储的时候会对文件进行切割,这个时候就类似于会给文件分成一块一块的,存储到不同机器上面。所以HDFS还要记录一下一个文件到底被分了多少块,每一块都在什么地方存储着(这些信息记录在fsimage文件中)。
- 接收用户的操作请求:我们在命令行使用hdfs操作的时候,是需要先和namenode通信才能开始去操作数据。
NameNode主要包含四个主要文件,这四个文件分别是fsimage、edits、seen_txid和VERSION,他们十分重要,下面会依次介绍。
- fsimage文件
fsimage文件是元数据镜像文件,存储某一时刻NameNode内存中的元数据信息,类似于定时的快照操作(这里的元数据信息是指文件目录树、文件/目录的信息、每个文件对应的数据块列表),可以说fsimage中存放了hdfs最核心的数据。 - edits文件
edits文件是操作日志文件(事务文件),这里面会实时记录用户的所有操作。固化的一些文件内容是存储在fsimage文件中,而当前正在上传的文件信息存储在edits文件之中,edit文件不唯一,这些细致的操作信息会放在多个文件中,文件统一命名为edits_*(这里的*代表数字编号)。edits文件中的信息非常细致,举个例子:上传一个120M的文件,这个事件在fsimage中可能只记录了最终的上传结果信息以及分块编号和地址等,而在edits文件中将记录如下的完整过程:
由此可见,edits文件中的记录是非常细致,而且HDFS的增删改查会在edit文件和fsimage文件中都留下记录,但是edits的记录明显更加细致,因此实际上fsimage文件中的内容是由edits文件定期合成的,这个操作就是由Secondary NameNode完成的,且这个进程只负责这一件事,之所以在前面说这个进程不是必须的,是因为在存在多个NameNode的HA架构中,这一部分工作可以由其他的NameNode(也就是Standby NameNode)来完成。关于HA结构的介绍陈述,可以在下一篇博客中看到。 - seen_txid文件
seen_txid文件中只记录一个数字,其代表的是NameNode里面最后一个edits文件的编号,NameNode重启的时候,会按照seen_txid的数字,顺序从edits_0000001开始运行edits文件。如果根据对应的seen_txid无法加载到对应的文件,NameNode进程将不会完成启动以保护数据一致性。格式化后seen_txid文件记录的数字为0。 - VERSION文件
VERSION文件保存集群的版本信息,与DataNode文件的版本信息保持一致,当集群被格式化之后会发生变化(但重复格式化后DataNode的版本信息不会变,会出现版本信息不匹配问题导致bug)。
2. Secondary NameNode
在上文对edits文件的介绍中已经提及了Secondary NameNode的作用,即定期的把edits文件中的内容合并到fsimage中,这个合并操作称为checkpoint。上文也有说过Secondary NameNode并不是必须的,因为在存在多个NameNode的HA架构中,这一部分工作可以由其他的NameNode(也就是Standby NameNode)来完成。
3. DataNode
DataNode提供真实文件数据的存储服务,针对datanode主要掌握两个概念,一个是block,一个是replication。
- block:HDFS会按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block,HDFS默认Block大小是 128MB,Blokc块是HDFS读写数据的基本单位。若一个文件不足128M,那么该文件独占一个Block块,这时该块大小不为128M,而是这个文件的大小。
- replication:译为复制,这里指副本,默认每个文件的副本为3份(在hdfs-site.xml配置文件中进行配置),且分别存储在不同的DataNode机器上。
最后,举一个例子加深理解:假设我们上传了两个10M的文件,又上传了一个200M的文件,那么会产生多少个block块?在HDFS中又会显示几个文件?
答:会产生4个block块,因为默认每个block的大小为128M,因此200M的文件会被分为两个块,分别是128M和72M。在HDFS中会显示3个文件。