Hadoop核心组件:
- 分布式文件系统(HDFS):以流式数据访问模式来存储超大文件,运行于商用硬件集群,是管理网络中跨多台计算机存储的文件系统
- 分布式运算框架(MapReduce);
- 分布式调度引擎(YARN);
HDFS的设计特点:
概括:分(分块)、余(冗余)、展(动态扩展)的大硬盘!
- 分块:HDFS的存储文件被划分为块,作为独立的存储单元,称为数据块,默认大小是:Hadoop1.x:64MB;Hadoop1.x:128MB。
- 冗余:HDFS文件分块,且每块默认备份3份;
- 动态扩展:存储空间可以动态扩展;
HDFS的关键元素:
- Block(块);
- NameNode(名称节点):HDFS的守护进程,管理文件系统的命名空间,负责记录文件数据块、管理数据块被存储的节点,它的主要功能是对内存及IO进行集中管理。
- DataNode(数据节点):文件实际存储的位置;
- SecondaryNameNode(CheckPoint节点):辅助程序,与NameNode进行通信,以便定期保存HDFS元数据的快照;
HDFS运行原理:
- NameNode和DataNode初始化完成后,采用RPC进行信息交换,采用的机制是心跳机制;
- 心跳机制:DataNode节点定时向NameNode反馈状态信息,反馈信息如:是否正常、磁盘空间大小、资源消耗情况等信息,以确保NameNode知道DataNode的情况;
- NameNode负责存储fsImage和edits元数据信息;
- fsImage和edits元数据文件需要定期进行合并;
- SecondNameNode进程对fsImage和edits文件进行定期合并,合并好的文件再交给NameNode存储;
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。
过程描述:
(1) 客户端通过对DistributedFileSystem对象调用create()函数新建文件。
(2) 分布式文件系统对namenod创建一个RPC调用,在文件系统的命名空间中新建一个文件。
(3)Namenode对新建文件进行检查无误后,分布式文件系统返回给客户端一个FSDataOutputStream对象, FSDataOutputStream对象封装一个DFSoutPutstream对象,负责处理namenode和datanode之间的通信,客户端开始写入数据。
(4)FSDataOutputStream将数据分成一个一个的数据包,写入内部队列"数据队列",DataStreamer负责将数据包依次流式传输到由一组namenode构成的管线中。
(5)FSDataOutputStream维护着确认队列来等待datanode收到确认回执,收到管道中所有datanode确认后,数据包从确认队列删除。
(6)客户端完成数据的写入,对数据流调用close()方法。
(7)namenode确认完成。
HDFS读数据:
- HDFS客户端提交读操作到NameNode,NameNode收到客户端提交的请求后,会先判断此客户端在此目录下是否有读权限,如果有,则给客户端返回存放数据块的节点信息,即告诉客户端可以到相关的DataNode节点下去读取数据块;
- 客户端获取到块位置信息后,会和相关的DataNode直接构建读取通道,读取数据块,当所有数据块都读取完成后关闭通道,并给NameNode返回状态信息,告诉NameNode已经读取完毕。
过程描述:
(1)客户端调用FileSyste对象的open()方法在分布式文件系统中打开要读取的文件。
(2)分布式文件系统通过使用RPC(远程过程调用)来调用namenode,确定文件起始块的位置。
(3)分布式文件系统的DistributedFileSystem类返回一个支持文件定位的输入流FSDataInputStream对象,FSDataInputStream对象接着封装DFSInputStream对象(存储着文件起始几个块的datanode地址),客户端对这个输入流调用read()方法。
(4)FSDataInputStream连接距离最近的datanode,通过反复调用read方法,将数据从datanode传输到客户端。
(5) 到达块的末端时,FSDataInputStream关闭与该datanode的连接,寻找下一个块的最佳datanode。
(6)客户端完成读取,对FSDataInputStream调用close()方法关闭连接。