HDFS集群遵循主从架构。每个群集包括一个主节点和多个从节点。在内部,文件分为一个或多个块,每个块根据复制因子存储在不同的从节点计算机上。主节点存储和管理文件系统名称空间,即有关文件块的信息,例如块位置,权限等。从节点存储文件的数据块。主从各司其职,互相配合,共同对外提供分布式文件存储服务。当然内部细节对于用户来说是透明的。
HDFS遵循主从架构。每个群集包括一个主节点和多个从节点。其中:NameNode是主节点,负责存储和管理文件系统元数据信息,包括namespace目录结构、文件块位置信息等;DataNode是从节点,负责存储文件具体的数据块。两种角色各司其职,共同协调完成分布式的文件存储服务。SecondaryNameNode是主角色的辅助角色,帮助主角色进行元数据的合并。
NameNode是Hadoop分布式文件系统的核心,架构中的主角色。它维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。基于此,NameNode成为了访问HDFS的唯一入口。
内部通过内存和磁盘两种方式管理元数据。其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和editslog(Journal)编辑日志。
DataNode是HadoopHDFS中的从角色,负责具体的数据块存储。DataNode的数量决定了HDFS集群的整体数据存储能力。通过和NameNode配合维护着数据块。
除了DataNode和NameNode之外,还有另一个守护进程,它称为secondaryNameNode。充当NameNode的辅助节点,但不能替代NameNode。当NameNode启动时,NameNode合并Fsimage和editslog文件以还原当前文件系统名称空间。如果editslog过大不利于加载,SecondaryNameNode就辅助NameNode从NameNode下载Fsimage文件和editslog文件进行合并。
HDFS采用master/slave架构。一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
HDFS中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中:dfs.blocksize。默认大小是128M(134217728)。
为了容错,文件的所有block都会有副本。每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。默认dfs.replication的值是3,也就是会额外再复制2份,连同本身总共3份副本。
HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被Namenode记录下来。
HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
在HDFS中,Namenode管理的元数据具有两种类型:
文件的各个block的具体存储管理由DataNode节点承担。每一个block都可以在多个DataNode上存储。
该模块可以说是我们在开发使用HDFS过程中使用最多的模块了,提供了一种Web页面浏览操作文件系统的能力,在某些场合下,比使用命令操作更加直观方便。
该模块可以列出当前集群成功加载的所谓配置文件属性,可以从这里来进行判断用户所设置的参数属性是否成功加载生效,如果此处没有,需要检查配置文件或者重启集群加载。
Pipeline,中文翻译为管道。这是HDFS在上传文件写数据过程中采用的一种数据传输方式。客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将其复制到第三个数据节点。通俗描述pipeline的过程就是:Client->A->B->C
为什么datanode之间采用pipeline线性传输,而不是一次给三个datanode拓扑式传输呢?因为数据以管道的方式,顺序的沿着一个方向传输,这样能够充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时。在线性推送模式下,每台机器所有的出口宽带都用于以最快的速度传输数据,而不是在多个接受者之间分配宽带。
ACK(Acknowledgecharacter)即是确认字符,在数据通信中,接收方发给发送方的一种传输类控制字符。表示发来的数据已确认接收无误。在pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全。
默认副本存储策略是由BlockPlacementPolicyDefault指定。策略如下:第一块副本:优先客户端本地,否则随机
第二块副本:不同于第一块副本的不同机架。
第三块副本:第二块副本相同机架不同机器。
元数据(Metadata),又称中介数据,为描述数据的数据(dataaboutdata),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。按存储形式分为内存元数据和磁盘元数据文件两种,分别存在内存和磁盘上。
为了避免两次持久化之间数据丢失的问题,又设计了Editslog编辑日志文件。文件中记录的是HDFS所有更改操作(文件创建,删除或修改)的日志,文件系统客户端执行的更改操作首先会被记录到edits文件中。
NameNode职责是管理元数据信息,DataNode的职责是负责数据具体存储,那么SecondaryNameNode的作用是什么?对很多初学者来说是非常迷惑的。它为什么会出现在HDFS中。从它的名字上看,它给人的感觉就像是NameNode的备份。但它实际上却不是。当HDFS集群运行一段事件后,就会出现下面一些问题:
因此为了克服这个问题,需要一个易于管理的机制来帮助我们减小editlogs文件的大小和得到一个最新的fsimage文件,这样也会减小在NameNode上的压力。SecondaryNameNode就是来帮助解决上述问题的,它的职责是合并NameNode的editlogs到fsimage文件中。
namenode元数据存储目录由参数:dfs.namenode.name.dir指定。dfs.namenode.name.dir属性可以配置多个目录,各个目录存储的文件结构和内容都完全一样,相当于备份,这样做的好处是当其中一个目录损坏了,也不会影响到hadoop的元数据,特别是当其中一个目录是NFS(网络文件系统NetworkFileSystem,NFS)之上,即使你这台机器损坏了,元数据也得到保存。
SecondaryNameNode在checkpoint的时候会将fsimage和editslog下载到自己的本机上本地存储目录下。并且在checkpoint之后也不会进行删除。如果NameNode中的fsimage真的出问题了,还是可以用SecondaryNamenode中的fsimage替换一下NameNode上的fsimage,虽然已经不是最新的fsimage,但是我们可以将损失减小到最少!
HDFS并不擅长存储小文件,因为每个文件最少一个block,每个block的元数据都会在NameNode占用内存,如果存在大量的小文件,它们会吃掉NameNode节点的大量内存。HadoopArchives可以有效的处理以上问题,它可以把多个文件归档成为一个文件,归档成一个文件后还可以透明的访问每一个文件。
例如:如果你只想存档一个目录/smallfile下的所有文件:
hadooparchive-archiveNametest.har-p/smallfile/outputdir这样就会在/outputdir目录下创建一个名为test.har的存档文件。注意:Archive归档是通过MapReduce程序完成的,需要启动YARN集群。
首先我们来看下创建好的har文件。使用如下的命令:hadoopfs-ls/outputdir/test.har
在查看har文件的时候,如果没有指定访问协议,默认使用的就是hdfs://,此时所能看到的就是归档之后的样子。此外,Archive还提供了自己的haruri访问协议。如果用haruri去访问的话,索引、标识等文件就会隐藏起来,只显示创建档案之前的原文件:HadoopArchives的URI是:har://scheme-hostname:port/archivepath/fileinarchivescheme-hostname格式为hdfs-域名:端口。
未压缩的SequenceFile文件由header、record、sync三个部分组成。其中record包含了4个部分:recordlength(记录长度)、keylength(键长)、key、value。每隔几个record(100字节左右)就有一个同步标记
基于record压缩的SequenceFile文件由header、record、sync三个部分组成。其中record包含了4个部分:recordlength(记录长度)、keylength(键长)、key、compressedvalue(被压缩的值)。每隔几个record(100字节左右)就有一个同步标记。
基于block压缩的SequenceFile文件由header、block、sync三个部分组成。block指的是recordblock,可以理解为多个record记录组成的块。注意,这个block和HDFS中分块存储的block(128M)是不同的概念。Block中包括:record条数、压缩的key长度、压缩的keys、压缩的value长度、压缩的values。每隔一个block就有一个同步标记。block压缩比record压缩提供更好的压缩率。使用SequenceFile时,通常首选块压缩。