论坛首页 入门技术论坛

Hadoop理论部分--HDFS文件系统祥解

浏览 1677 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2016-08-31  

主要提及知识点:

NameNode定义及机制,DataNode定义及机制,

Hdfs运行机制,HDFS数据存储单元(Block),

NameNode祥解,SecondaryNameNode的定义,SecondaryNameNode执行合并过程,

DataNode祥解,Block的副本放置策略,HDFS读数据流程,HDFS写数据流程,安全模式

 

NameNode 

存储"元数据" ps:如文件名称/文件大小/文件可执行权限等

元数据保存在内存中 持久化在磁盘上 加电后读入内存待用

保存文件,文件存储单元block,datanode之间的映射关系

 

DataNode

存储文件内容持久化于磁盘

维护Bolockid到datanode本地文件的映射关系

 

Hdfs运行机制

一般来说整个HDFS拥有一个名字节点(即NameNode,存储文件元数据)和多个数据节点(即DataNode,存储文件内容).

 

DataNode中的机制

1.数据复制机制(冗余机制)

2.故障检测机制(心跳包-检测是否宕机、块报告-安全模式下检测、数据完整性检测-校验和比较)

 

NameNode中的机制

1.日志文件、镜像文件 

空间回收机制

 

HDFS数据存储单元(Block)

Block默认数据块大小为64MN,若不足64MB按照64MB占用。ps:仅是逻辑接口,不是实际占用大小。

一个文件的存储方式:按照大小被切分为若干个block,存储到不同节点上,默认情况下每个block都有三个副本。

Block大小和副本数通过client端上传文件时设置,文件上传成功后副本数可以更改,但是Block size不可变更。

如果发生某个机器A宕机,HDFS系统中实际的副本数小于设置的副本数(即blockA在此机器A上的副本丢失),那么HDFS将会从如机器B自动复制一份正常的blockA到另一台空闲的机器C上。

 

NameNode祥解

主要功能:接受客户端的读写服务

保存的元数据信息(metadate信息):

1.文件拥有者信息owership和执行权限permissions (该类数据保存在磁盘上名为fsimage)

2.文件包含哪些块(每个块的编号) (该类数据保存在磁盘上名为fsimage)

3.Block保存在哪个DataNode(该类数据存储在内存中 不会保存在磁盘上 当HDFS系统启动时 由DataNode启动时上报至NameNode 收到后存储在内存中) 

NameNode的metadata信息在启动后会加载到内存:

1.metadata存储到磁盘文件名为"fsimage"

2.Block的位置信息不会保存到"fsimge"

3.edits文件 记录对metadata的操作日志(注:当新增文件或删除文件时并不会直接修改metadata信息及fsimage文件信息,发生时将直接记录edits文件日志,在一定时间间隔后,再根据edits记录对上述两种文件执行数据同步操作 edits文件存储在磁盘上)

工作数据都在内存上

 

SecondaryNameNode !面试会问!

SecondaryNameNode的主要工作是帮助NameNode合并editslog减少NameNode启动时间

SecondaryNameNode执行合并的时机:1或2满足则执行合并

1.根据配置文件设置的时间间隔fs.checkpoint.period 默认3600s

2.根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB

它不是NameNode的备份但它可以做一部分的元数据的数据备份,并不是实时备份.

一部分数据备份的意思是:仅仅备份在上一次合并时的fsimage数据,但在上一次合并之后创建的edits文件操作数据并不备份,也就是说在上一次合并后发生的文件操作数据将会被丢失.所以说只可以备份一部分数据.

在SecondaryNameNode合并后将获得一个新的fsimage,并发送给NameNode,替换原来的fsimage使文件得到刷新.

 

SecondaryNameNode执行合并过程:

Step1.将NameNode的edits和fsimage拷贝(在拷贝的同时将形成一个新的edits文件,名如edits.new)至SecondaryNameNode

Step2.然后进行merge,merge后文件名为fsimage.ckpt

Step3.merge完成后将该文件推送给NameNode

Step4.NameNode在接到合并后的文件fsimage.ckpt替换原先的fsimage.

注意:执行合并任务后的edits文件为合并任务起始时创建的edits.new文件.(合并后edits.new重命名为edits)

整体流程归纳:

用户执行一个增加或删除操作时首先刷新NameNode工作数据(在内存中),而后在执行合并时再将磁盘上的数据进行更新.

 

NameNode的作用即相当于计算机的分区表,根据数据在其中的位置去相应的DataNode寻找数据.

 

DataNode祥解

存储数据(block)

在启动DataNode线程时将会向NameNode汇报block信息

通过向NameNode发送心跳保持与其的联系(默认3s一次),如果NameNode10分钟没有收到DataNode的心跳,则认为其宕机,将会拷贝剩余正常的Block到其它的DataNode.

 

Block的副本放置策略

第一个副本:放置在上传文件的DataNode;如果是集群外提交,则随机挑选一台磁盘不太满,cpu不太忙的节点.

第二个副本:放置在与第一个副本不同机架的节点上.

第三个副本:放置在与第二个副本相同的机架节点上.

更多副本:随机节点

 

 

HDFS读数据流程

Step1.客户端发送读请求 调用DistributedFileSystemAPI中的open()函数至NameNode

Step2.NameNode返回block locations

Step3.调用FSDataInputStreamAPI中Read()方法"并发"读取各Block中的文件信息

Step4.取回给block文件在client合并成一个文件

Step5.关闭流

 

 

HDFS写数据流程

Step1.客户端发送读请求 调用DistributedFileSystemAPI中的create()函数传入文件名,文件大小,拥有者等信息 并发送请求至NameNode

Step2.NameNode处理分析该文件存储后应切分为多少块,每个块应存储的位置(具体存在哪一个DataNode).返回给客户端

Step3.调用FSDataOutputStreamAPI中write()方法,将其中一个block写入其中一个DataNode中,仅写入一次,剩余副本由DataNode新启动的线程继续按照副本放置规则继续写入至其他DataNode,副本写入完成后将返回ack确认信息

Step4.客户端接收到ack确认信息后 发送请求至NameNode 通知此文件写入成功

Step5.关闭流

注意:block副本的产生机制,是由被写入block的datanode自己进行该block的副本复制备份,而不是由客户端写入其他剩余副本,客户端仅写入一次block

 

 

安全模式

NameNode启动时,首先将映像文件fsimage载入内存,并执行编辑日志edits中的各项操作

一旦内存中成功建立文件系统元数据的映射,则创建一个新的fsimage文件(这个操作不需要SecondayNameNode)和一个空的编辑日志

此时NameNode运行在安全模式.即NameNode的文件系统对于客户端来说是只读的.(只会显示目录,现实文件内容等.如果尝试写/删除/重命名都会失败).

再此阶段NameNode收集各个DataNode的报告,当数据块打到最小副本数以上时,会被认为是安全的,在一定billion的数据块被确认为安全后,再过若干时间,安全模式结束

当检测到副本数不足的数据块时,该块会被复制直到达到最小副本数,系统中数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中.

 

注:每一次NameNode启动时都将执行安全模式当中的所有操作,首先将进入安全模式.即初始化系统阶段.

 

 

论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics