hdfs特点

hdfs是hadoop的分布式文件系统,用于存储大数据,它的特点是:
1.分布式部署,利用廉价的机器存储大数据
2.提供副本机制,容错机制,在机器宕机或副本丢失,自动恢复,默认副本保存3份

hadoop 实时运算 hadoop运行机制_hadoop 实时运算

关注三个主要节点:

1.NameNode:整个文件系统的管理节点,接收用户的请求,保存着文件/目录的元数据信息和每个文件对应的block的映射列表。在linux系统上,它保存着三个重要文件
a.fsimage,元数据镜像文件,存储某一段时间内的namenode的元数据信息
b.edits,保存操作日志文件
c.fstime,保存最近一次checkpoint的时间

2.DataNode:提供真实文件的数据存储服务,它文件的多个块(Block),block是最基础的存储单位,hdfs默认的块大小的是128M。

3.SecondaryNameNode:冷热备,合并fsimage和fsedits生成新的fsimage,然后再发给namenode,替换旧的fsimage

NameNode元数据详细

NameNode metadata主要存放FileName,replications,block-ids,还有blockid到host的映射,例如,有一个文件名为android.apk写到hdfs系统中,那medata将会保存如下信息

hadoop 实时运算 hadoop运行机制_读数据过程_02

客户端向hdfs读数据的过程

hadoop 实时运算 hadoop运行机制_hadoop_03

文件读取的过程如下:
1.客户端向Namenode发起RPC请求;
2.Namenode返回该文件的元数据信息,包括,文件名称,分块的id已经和分块id和主机的映射等等
3.客户端根据元数据信息向最近的DataNode读取block,如果客户端本身是DataNode,那么将直接从本地获取数据,block的读取是同步的,即读完一块block,才可以读另外一块block。
4.读取完一个block都会进行checksum验证,如果发现该block错误,那么客户端会通知NameNode,NameNode将会从其他拷贝副本选择一份让客户端继续读取

客户端向hdfs写数据的过程

1.客户端通过RPC向NameNode提交写数据请求
2.NameNode检查该文件是否存在,客户端是否有权限写数据,如果可以写入,则为该文件创建一条记录,如果不可以,则向客户端抛出异常。
3.客户端接收到NameNode允许写操作之后,将文件进行切分成多个packets,并向NameNode申请blocks,NameNode返回blocks列表给客户端
4.客户端接收到blocks列表之后,开始将packets写到blocks列表中,当将packet写到第一个DataNode完成时,该DataNode会把该分块的数据复制到其他DataNode中,默认是复制3份。
5.最后一个datanode成功存储之后通过客户端,客户端接收到消息之后,将会移除相应的packet,并通知NameNode,NameNode就会在内存中的Metadata中添加一条该文件信息的描述,并在edits日志文件中写入一条记录
6.如果写数据的过程中,发生异常,都会在edits日志文件中记录操作。

NameNode和SecondaryNameNode协助过程

SecondaryNameNode的作用是协作NameNode完成fsimage的保存和更新,协作过程如下。

hadoop 实时运算 hadoop运行机制_读数据过程_04

1.SecondaryNameNode根据checkpoint的设置,将NameNode的edits和fsimage下载到本地,并进行合并生成fsimage.ckpt
2.在下载edits和fsimage的时候,不允许删除edits和fsimage,防止下载和合并过程中出现错误,造成文件不能恢复,另外,在卸载edits的过程中,NameNode会生成新的edits.new,让客户端操作NameNode的时候,不会出现异常和数据不一致问题
3.fsimage生成之后,将fsimage.ckpt推送给NameNode,NameNode将把旧的fsimage替换掉,并把edits.new切换成edits
4.将旧的fsimage和edits删除

什么时候checkpoint

1.设置fs.checkpoint.period指定俩次checkpoint的最大时间,默认是3600秒

2.设置fs.checkpoint.size规定edits文件的最大值,默认是64m

只要满足这俩个条件,SecondaryNameNode就会下载edits和fsimage生成新的fsimage镜像