本文内容出自以下链接
正文
HDFS特点
- HDFS文件系统可存储超大文件
2)HDFS上的块之所以设计的如此之大,其目的是为了最小化寻址开销。如果块设置得足够大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。
3)HDFS文件的所有块并不需要存储在一个磁盘上,因此可以利用集群上任意一个磁盘进行存储,由于具备这种分布式存储的逻辑,所以可以存储超大的文件。
- HDFS同一时刻只允许一个客户端对文件进行追加写操作(不支持多个写入者的操作,也不支持在文件的任意位置修改),这样避免了复杂的并发管理功能,但也限制了系统性能。
- 运行在普通廉价的机器上
Hadoop的设计对硬件要求低,无需昂贵的高可用性机器上,因为在HDFS设计中充分考虑到了数据的可靠性、安全性和高可用性。
- HDFS适合存储大文件并为之提供高吞吐量的顺序读/写操作,不太适合大量随机读的应用场景,也不适合存大量小文件的应用场景。HDFS是为高吞吐量应用优化的,会以提高时间延迟为代价,因此不适合处理低时延的数据访问的应用。
HDSF体系架构
- HDFS是一个主/从(Master/Slave)体系架构,由于分布式存储的性质,集群拥有两类节点NameNode和DataNode。
- NameNode(名称节点):系统中通常只有一个,中心服务器的角色,管理存储和检索多个DataNode的实际数据所需的所有元数据,响应客户请求。
- DataNode(数据节点):系统中通常有多个,是文件系统中真正存储数据的地方,在
NAMENODE
- NameNode负责整个分布式文件系统的元数据,包括文件目录树,文件到数据块Block的映射关系等。 这些元数据信息主要为:
“文件名 -> 数据块‘’映射
“数据块 -> DataNode列表”映射
- 这些元数据保存在内存里,同时这些数据还以两个文件形式永久保存在本地磁盘上:命名空间镜像文件(fsimage)和编辑日志文件(editlog)。
- fsimage是内存命名空间元数据在外存的镜像文件.
- editlog文件则记录着用户对文件的各种操作记录,当客户端对hdfs中的文件进行新增或者修改操作,操作记录首先被记入editlog文件中,当客户端操作成功后,相应的元数据会更新到内存meta.data中,防止发生意外导致丢失内存中的数据。
- fsimage和editlog两个文件结合可以构造出完整的内存数据。
- NameNdoe还负责对DataNode的状态监控。DataNode定期向NameNode发送心跳以及所存储的块的列表信息。NameNode可以知道每个DataNode上保存着哪些数据(Block信),DataNode是否存活,并可以控制DataNode启动或是停止。若NameNode发现某个DataNode发生故障,会将其存储的数据在其他DataNode机器上增加相应的备份以维护数据副本(默认为3,可在配置文件中配置)保持不变。
- DataNode负责数据块的实际存储和读/写工作。在hadoop1.0时,DataNode的数据块默认大小为64M,2.0版本后,块的默认大小为128M。当客户端上传一个大文件时,HDFS会自动将其切割成固定大小的Block,每个块以多份的形式存储在集群上,默认为3份。
- 如果NaneNode服务器失效,集群将失去所有的数据。因为我们将无从知道哪些DataNode存储着哪些数据。因此NameNode的高可用,容错机制很重要。
DATANODE
HDFS的管理节点是NameNode,用于存储并管理元数据。那么具体的文件数据存储在哪里呢?答案就是DataNode.
DataNode就是负责存储和读/写数据的组件,一个数据块Block会在多个DataNode中进行冗余备份;而一个DataNode对于一个块最多只包含一个备份。所以可以简单地认为DataNode上存储了数据块ID和数据块内容,以及它们的映射关系。一个HDFS集群可能包含上千个DataNode节点,这些DataNode定时和NameNode进行通信,接受NameNode的指令,为了减轻NameNode的负担,NameNode上并不永久保存哪个DataNode上有哪些数据块的信息,而是通过DataNode启动时的上报来更新NameNode上的映射表。【这个和上述讲解namenode的职责是一样的】 DataNode和NameNode建立连接后,就会不断地和NameNode保持联系,反馈信息中也包含了NameNode对DataNode的一些命 令,如删除数据库或者把数据块复制到另一个DataNode。应该注意的是:NameNode不会发起到DataNode的请求,在这个通信过程中,它们 严格遵从客户端/服务器架构。
当然DataNode也作为服务器接受来自客户端的访问,处理数据块读/写请求。DataNode之间还会相互通信,执行数据块复制任务,同时,在客户端执行写操作的时候,DataNode之间需要相互配合,以保证写操作的一致性。DataNode是文件系统Worker中的节点,用来执行具体的任务:存储数据块,被客户端和NameNode调用。同时,它会通过心跳(Heartbeat)定时向NameNode发送所存储的数据块信息。
在hadoop1.0时,DataNode的数据块默认大小为64M,2.0版本后,块的默认大小为128M。当客户端上传一个大文件时,HDFS会自动将其切割成固定大小的Block,每个块以多份的形式存储在集群上,默认为3份。
NAMENODE与SECONARY NAMENODE 容错
- 第一种是在配置文件里配置namenode的工作目录为多个,这样可以将元数据信息存到多块磁盘上,或是多台机器上,甚至可以将元数据存在远程挂载的网络文件系统中(NFS),可以通过配置使namenode在多个文件系统上实时保存元数据。这样一来,namenode的工作目录所在的磁盘损坏后,还有其他磁盘上的数据可用。
- 第二种是运行一个辅助namenode,被称为secondary namenode(第二名称节点)。secondary namenode的职责并不是作为namenode的热备份机,其主要作用是定期从namenode拉取fsimage和editlog,并将两者合并成新的fsimage,将新的fsimage返回给namenade。这种方式,一方面可以避免namenode上的编辑日志过大,另一方面将合并操作放在secondary namenode上可以节省namenode的cpu时间和内存,减轻namenode的工作压力,让namenode更专注于自己的本职工作。secondary namenode中保存的fsimage数据总是会滞后于namenode内存中的元数据,所以在namenode宕机后,难免会有部分的数据丢失。(可以把NFS上的namenode元数据复制到secondary namenode上,使其成为新的namenode,并不损失任何数据)
SECONARY NAMENODE
secondary namenode将namenode上积累的所有editlog下载到本地,并加载到内存进行merge,这个过程称为checkpoint,目的是为了刷新fsimage。步骤详解:
1)secondary namenode通知namenode要进行checkpoint了。(定时,或是namenode上的editlog数量达到一定规模)。
2)namenode做准备。
3)secondary namenode将namenode的editlogs下载到本地磁盘上。
4)secondary namenode将editlogs和fsimage加载到内存中,进行合并产生新的fsimage。
5)secondary namenode将新的fsimage传回给namenode(覆盖namenode上旧的fsimage文件),并将其保存到本地磁盘上覆盖掉旧的fsimage。
1) hdfs上数据的更新修改等操作都会先写入编辑日志文件,再更新到内存里。
2) secondary namenode节点只有在启动后,第一次进行checkpoint时才会将namenode的editlog和fsimage都下载到自己的本地磁盘,再进行合并。后期的checkpoint都只会下载editlog文件,而不会下载fsimage,因为自己磁盘上保存的fsimage和namenodev上的是一样的。
正文结束