HDFS框架图:
主从架构(master/slave
),通常包括一个主节点核多个从节点主从架构
NameNode是Hadoop分布式文件系统的核心,架构中的主角色
NameNode维护和管理文件系统元数据
,包括名称目录树结构、文件和块的位置信息、访问权限等信息
NameNode是访问HDFS的唯一入口
NameNode内部通过内存和磁盘文件两种方式管理元数据
其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal) 编辑日志
在Hadoop2之前,NameNode是单点故障,Hadoop2之后引入了Hadoop的高可用,Hadoop集群体系结构允许集群中以热备配置运行两个或者多个NameNode
HDFS采用master/slave架构,一般一个HDFS集群是有一个NameNode和一定数目的DataNode组成
NameNode是HDFS主节点,DataNode是HDFS从节点,两种各司其职,共同协调完成分布式的文件存储服务
物理上是分块存储的
,块的大小可以通过配置具体的参数来规定,参数位于hdfs-default.xml中dfs.blocksize。默认大小128M(
134217728)分块存储的好处: 可以提高操作效率、决负载均衡以解决单机能不能存储下的问题
文件的所有block都会有副本,每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可以进行配置的,副本系数可以在文件创建的时候指定,也可以在之后通过命令进行改变
默认dfs.replication的值是3,这个3容易存在歧义,这个3的实际含义是带上本身一共存在三份
我们可以进行一个上传,查看其是存储位置。
在HDFS中,NameNode管理的元数据具有两种类型:
数据块存储
文件的各个block的具体存储管理由DataNode节点承担,每一个block都可以在多个DataNode上存储。
DataNodes模块主要记录了HDFS集群中各个DataNode的相关状态信息
记录模块异常
当前还没有异常
Snapshot模块记录HDFS文件系统的快照相关信息,包括那些文件夹创建了快照和总共那些快照。
Satartup progress 模块记录了HDFS集群启动过程中的信息,执行步骤和每一步所用的时间和所做的事
使用最多的模块,可以直接进行一系列的操作,告别shell API
Logs是直接把所有的Log都显示出来,可以点击直接查看:
Log Level 可以进行一个所有
Hadoop的所有配置:
Pipeline,中文管道,是HDFS在上传文件写数据过程中采用的一种数据传输方式。客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二数据节点,后者保存后再将其复制到第三个数据节点。简单描述pipeline过程:
客户端->A->B->C
为什么DataNode之间采用Pipeline先行传输而不是一次给三个DataNode拓扑式的传输?
因为数据一贯道的方式顺序的沿着一个方向传输,这样能够充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时,在现行推送模式下,每台机器所有的出口带宽都将以最大的线性速度传输数据,而不是在多个接收者之间分配带宽。
ACK即是确认字符,在数据通信中,接收方发送给发送方的一种传输类控制字符。表示发来的数据已确定接收无误。在pipeline管道传输数据的过程中,传输的反方向会进行ACK校验,确保数据传输安全。
在默认情况下是一个三副本模式,
第一块副本:有限客户端本地,否则随机
第二块副本:不同于第一块副本的不同机架
第三块副本:第二块副本相同机架的不同机器
元数据,又称中介数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能
HDFS中,元数据主要指的是文件相关的元数据,由NameNode管理维护,从广义的角度来讲,因为NameNode还需要管理众多的DataNode节点,因此DataNode的位置和健康状态信息也属于元数据。
在HDFS中,文件相关元数据具有两种类型:
文件自身属性信息
文件名称、权限、修改日期、文件大小、复制因子、数据块大小
文件块映射信息
记录文件块和DataNode之间的映射信息,即哪个块位于那个节点上。
按照存储形势分为内存元数据和元数据文件两种,分别存储在内存和磁盘上。
为了保证用户操作员数据交互高效、低延迟,NameNode把所有的元数据都存储在内存中,我们称作为内存元数据。内存中的元数据是最完整的,包括文件自身属性信息、文件块位置映射信息。
但是内存的致命问题就是断电数据丢失,数据不会持久化,因此NameNode又辅佐了元数据文件来保证元数据的完全完整。
是内存元数据的一个持久化的检查点,但是fsimage中仅包含hadoop文件系统中文件自身属性的相关的元数据信息,但不包括文件快位置的信息。文件块位置信息之存储在内存中,由datanode启动加入集群的时候,向namenode进行数据块汇报得到的,并且后续间断指定时间进行数据块报告。
持久化的动作是一种数据从内存到磁盘的IO过程,会对NameNode正常服务造成一定的影响,不能频繁的进行持久化。
为了避免两次持久化之间数据丢失问题,又设计了Edits log编辑日志文件,文件中记录的是HDFS所有更改操作(文件创建、删除或者修改)的日志,文件系统客户端执行的更新操作首先先回记录到edits文件中。
fsimage和edits文件都是经过序列化的,在被NameNode启动的时候,他会将fsimage文件中的内存加载到内存中,之后再执行edits文件中的各项操作,是的内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作,也是最完整的元数据。
当客户端对HDFS中的文件进行新增或者修改操作,操作记录首先被记入edits日志文件中,当客户端操作成功后,相应的元数据会更新到内存元数据中,因为fsimage问及那一半都很大(GB级别十分常见),如果所有操作都往fsimage文件中添加,这样会导致系统运行得十分缓慢。
HDFS这种设计是先着手于:一是内存中数据更新、查询快,极大缩短了操作响应时间,二是内存中源数据丢失风险颇高,因此辅佐元数据镜像文件(fsimage) +编辑日志文件(edits)的备份机制进行确保源数据的安全。
NameNode维护系统元数据,因此,元数据的准确管理,影响着HDFS提供文件存储服务的能力。
在Hadoop的HDFS首次部署好文件之后不能马上启动,而是先要对文件系统进行格式化操作:hdfs namenode -format
这里注意两个概念:一个是format之前,hdfs在物理上还是不存在的,二是就在此处的format不是我们理解的本地磁盘的格式化,而是一些清除与准备工作。其中就会创建元数据本地存储目录和一些初始化的元数据相关文件。
NameNode元数据存储目录由参数: dfs.namenode.name.dir指定,格式化完成之后就会在$$dfs.namenode.name.dir/current目录下创建文件,其中的dfs.namenode.name.dir是在hdfs-site.xml文件中配置的。
dfs.namenode.name.dir属性可以配置多个目录,各个目录存储的文件结构和内容都完全一样,相当于备份,这样子做的好处是当其中一个目录损坏了,也不会影响到hadoop的元数据,特别是当其中一个目录是NFS(网络文件系统 Network File System)之上,俗称这台机器损坏了,元数据也得到了保存
查看VERSION
clusterID/namespaceID/blockpoolID 是集群的唯一标识符,标识符被用来防止DataNodes被意外地注册到另一个集群的NameNode上,这些表示在联邦(federation)部署中特别重要。在联邦模式下会有多个NameNode独立工作,每个的NameNode提供唯一的命名空间(namespaceID)并管理一组唯一的文件块池(blockpoolID)。clusterID将整个集群集合在一起作为单独的逻辑单元,在集群中的所有节点上都是一样的。
storageType,说明这个文件存储的是什么进程的数据结构类型,如果是DataNode,storageType=DATA_NODE
NameNode节点的图->
DataNode结点的图:
cTime NameNode存储系统创建时间,首次格式化文件系统这个属性是0,当文件系统升级后,该值会更新到升级之后的时间戳
layoutVersion,HDFS元数据格式的版本,添加需要修改源数据格式的新功能时,需要修改此处的数字。当前HDFS软件使用比当前版本更新的布局版本是需要升级HDFS。
包括最后一个checkpoint的最后一个事务ID,这不是NameNode接受的最后一个事务ID,该文件不会再每个事务上更新,而只会在checkpoint或者编辑日志记录上更新,改文件的目的是尝试识别edits启动期间是否丢失的文件,如果edits目录被意外删除,然后自上一个checkpoint以来的所有事物都将消失,NameNode仅从最近的一次fsimage加载启动,为了防止这种情况,NameNode启动还会检查seen_txid以确定他至少还可以加载该属数目的食物,如果无法验证装入事务,他将终止启动。
元数据镜像文件,每个fsimage文件还有一个对应的.md5文件,其中包含md5校验和,HDFS使用该文件放置磁盘损坏文件异常。
已完成且不可修改的编辑日志,这些文件中的每一个文件都包含文件名定义的范围内的所有编辑日志事务,在HA高可用部署中,主备NameNode之间可以通过Edits log进行数据同步
fsimage文件时Hadoop文件系统元数据的一个永久性的检查点,包括Hadoop文件系统中的所有目录和文件idnode的序列化信息,对于文件来说,包含的信息有修改的时间、访问时间、块大小和组成一个文件信息等,而对于目录来说,包含的信息主要有修改时间、访问控制权限等信息。
oiv是offline image viewer的缩写,用于将fsimage文件的内容转储到指定文件中以便于阅读,该工具还提供了只读的WebHDFS API以允许离线分析和检查hadoop集群的命名空间。
hdfs oiv -i fsimage文件名 -p XML -o 自定义.xml
Edits Log文件存放的是Hadoop文件系统的所有更新操作记录日志,文件系统客户端执行的所有写操作手贱会被记录到edits文件中。。
NameNode启动之后,HDFS中的更新操作会重新写到Edits问文件中,因为fsimage文件很大,如果所有的更新操作都写入到fsimage文件中,这会导致系统启动非常缓慢,但是如果往edits文件里面写入就不会这样子,每次执行写入操作之后,且在向客户端发送成功代码之前,edit文件都需要同步更新,如果一个文件比较大,使得写操作需要向多台机器进行操作,只有当所有的写操作都执行完之后写操作才会返回成功,这样子的好处就是任何的操作都不会因为机器的故障而造成源数据不同步。
oev是offline edits viewer(离线edits查看器)的缩写。
hdfs oev -i edits_00000000000000000468-00000000000000000470 -o edits.xml
NameNode的职责是管理员数据信息,DataNode的职责是负责数据具体的存储,那么SecondaryNameNode的作用是什么?
HDFS集群运行一段时间会存在很多问题:
为了解决这个问题,需要一种易于管理的机制帮助我们减小edits logs文件的大小和得到一个最新的fsimage文件,这样子会减小NameNode的压力
SNN的职责就是帮忙解决上述问题的,他的职责是帮助合并NameNode的edits logs 到fsimage文件中去。
checkpoint核心是吧fsimage与edits log合并以生成新的fsimage,此过程有两个好处:fsimage不会太旧,edits log文件不会太大
然后一条一条的执行edits文件中的操作,使得内存中的fsimage不断更新,这个过程就是edits和fsimage文件合并
,合并结束后,ssn将内存中的数据dump生成一个新的fsimage文件。CheckPoint触发条件收到了两个参数控制,可以通过core-site.xml进行配置:
存在默认值
<property>
<name>dfs.namenode.checkpoint.periodname>
<value>3600svalue>
<final>falsefinal>
<source>hdfs-default.xmlsource>
property>
<property>
<name>dfs.namenode.checkpoint.txnsname>
<value>1000000value>
<final>falsefinal>
<source>hdfs-default.xmlsource>
property>
可见SecondaryNameNode根本不是NameNode的一个热备,只是将fsimage和edits合并的秘书
NameNode元数据存储目录由参数dfs.namenode.name.dir指定,dfs.namenode.name.dir属性可以配置多个目录,各个目录的文件结构和内容都完全一样,相当于备份,这样做的好处是当其中一个目录文件损坏了,也不会影响到hadoop的元数据,特别是当其中一个目录是NFS之上,即使机器损坏,元数据也得到了保存。
SecondaryNameNode在checkpoint的时候会将fsimage和edits log下载到自己的本机上本地目录下,并且在checkpoint之后也不会删除。
如果NameNode中的fsimage文件真的出现了问题,还是可以用SecondaryNameNode中的fsimage替换一下NameNode下的fsimage,虽然不是最新的fsimage,但是能够将损失降到最低