Hadoop原理——HDFS原理

Hadoop核心组件:

  1. 分布式文件系统(HDFS)流式数据访问模式来存储超大文件,运行于商用硬件集群,是管理网络中跨多台计算机存储的文件系统
  2. 分布式运算框架(MapReduce)
  3. 分布式调度引擎(YARN)

HDFS的设计特点:

概括:分(分块)、余(冗余)、展(动态扩展)的大硬盘!

  1. 分块:HDFS的存储文件被划分为块,作为独立的存储单元,称为数据块,默认大小是:Hadoop1.x:64MB;Hadoop1.x:128MB。
  2. 冗余:HDFS文件分块,且每块默认备份3份;
  3. 动态扩展:存储空间可以动态扩展;

HDFS的关键元素:

  1. Block(块)
  2. NameNode(名称节点)HDFS的守护进程,管理文件系统的命名空间,负责记录文件数据块、管理数据块被存储的节点,它的主要功能是对内存及IO进行集中管理。
  3. DataNode(数据节点):文件实际存储的位置;
  4. SecondaryNameNode(CheckPoint节点)辅助程序,与NameNode进行通信,以便定期保存HDFS元数据的快照;

HDFS运行原理:

  1. NameNode和DataNode初始化完成后,采用RPC进行信息交换,采用的机制是心跳机制;
  2. 心跳机制:DataNode节点定时向NameNode反馈状态信息,反馈信息如:是否正常、磁盘空间大小、资源消耗情况等信息,以确保NameNode知道DataNode的情况;
  3. NameNode负责存储fsImage和edits元数据信息;
  4. fsImage和edits元数据文件需要定期进行合并;
  5. SecondNameNode进程对fsImage和edits文件进行定期合并,合并好的文件再交给NameNode存储;

Hadoop原理——HDFS原理_第1张图片

HDFS数据合并原理:

1、NameNode初始化时会产生一个edits文件和一个fsimage文件:

edits:记录操作日志,比如对文件删除或添加等操作信息;

fsImage用于存储文件与目录对应的信息以及edits合并进来的信息,即相当于fsimage文件在这里是一个总的元数据文件,记录着所有的信息;

2、随着edits文件不断增大,当达到设定的阀值时,SecondaryNameNode会将edits文件和fsImage文件通过采用Http的方式进行复制到SecondaryNameNode,同时NameNode会产生新的edits文件替换旧的edits文件,以保证数据不会出现冗余;

3、SecondaryNameNode拿到这两个文件后,会在内存进行合CheckPoint操作生成fsImage.ckpt文件,合并完成后,再通过http的方式将fsImage.ckpt复制到NameNode,NameNode得到fsImage.ckpt后,将旧的fsimage文件替换,并且改名成fsimage。

HDFS数据流

HDFS写数据:

  • HDFS客户端提交写操作到NameNode,NameNode收到请求后,先判断此客户端是否有写权限,如果有,然后进行查看哪些DataNode适合存放,再给客户端返回存放数据块的节点信息,即告诉客户端可以把文件存放到相关的DataNode节点;
  • 客户端获取到存放数据的节点信息后,和对应的DataNode节点进行直接交互,进行数据写入,由于数据块具有副本Replication,在数据写入时采用的方式是先写第一个副本,写完后再从第一个副本的节点将数据拷贝到其它节点,依次类推,直到所有副本都写完,才算数据成功写入到HDFS,副本写入采用的是串行,每个副本写的过程中都会逐级向上反馈写进度,以保证实时知道副本的写入情况;
  • 随着所有副本写完后,客户端会收到数据节点反馈回来的一个成功状态,成功结束后,关闭与数据节点交互的通道,并反馈状态给NameNode,告诉NameNode文件已成功写入到对应的DataNode。

Hadoop原理——HDFS原理_第2张图片

过程描述:

(1 客户端通过对DistributedFileSystem对象调用create()函数新建文件。

(2 分布式文件系统对namenod创建一个RPC调用,在文件系统的命名空间中新建一个文件。

(3Namenode对新建文件进行检查无误后,分布式文件系统返回给客户端一个FSDataOutputStream对象,        FSDataOutputStream对象封装一个DFSoutPutstream对象,负责处理namenodedatanode之间的通信,客户端开始写入数据。

(4FSDataOutputStream将数据分成一个一个的数据包,写入内部队列"数据队列",DataStreamer负责将数据包依次流式传输到由一组namenode构成的管线中。

(5FSDataOutputStream维护着确认队列来等待datanode收到确认回执,收到管道中所有datanode确认后,数据包从确认队列删除。

(6)客户端完成数据的写入,对数据流调用close()方法。

(7)namenode确认完成。

 

HDFS读数据:

  • HDFS客户端提交读操作到NameNode,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有读权限,如果有,则给客户端返回存放数据块的节点信息,即告诉客户端可以到相关的DataNode节点下去读取数据块;
  • 客户端获取到块位置信息后,会和相关的DataNode直接构建读取通道,读取数据块,当所有数据块都读取完成后关闭通道,并给NameNode返回状态信息,告诉NameNode已经读取完毕。

Hadoop原理——HDFS原理_第3张图片

过程描述:

(1)客户端调用FileSyste对象的open()方法在分布式文件系统中打开要读取的文件。

(2)分布式文件系统通过使用RPC(远程过程调用)来调用namenode,确定文件起始块的位置。

(3)分布式文件系统的DistributedFileSystem类返回一个支持文件定位的输入流FSDataInputStream对象,FSDataInputStream对象接着封装DFSInputStream对象(存储着文件起始几个块的datanode地址),客户端对这个输入流调用read()方法。

(4FSDataInputStream连接距离最近的datanode,通过反复调用read方法,将数据从datanode传输到客户端。

(5 到达块的末端时,FSDataInputStream关闭与该datanode的连接,寻找下一个块的最佳datanode。

(6)客户端完成读取,对FSDataInputStream调用close()方法关闭连接。

你可能感兴趣的:(Hadoop)