HDFS的架构及原理
Posted firstsheng618
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDFS的架构及原理相关的知识,希望对你有一定的参考价值。
HDFS(Hadoop Distributed File System)是Hadoop核心组成之一,是分布式计算中数据存储管理的基础,被设计成适合运行在通用硬件上的分布式文件系统。HDFS架构中有两类节点,一类是NameNode,又叫“元数据节点”,另一类是DataNode,又叫“数据节点”,分别执行Master和Worker的具体任务。
HDFS是一个(Master/Slave)体系结构,“一次写入,多次读取”。HDFS的设计思想:分而治之—将大文件、大批量文件分布式存放在大量独立的机器上。
一、HDFS的优缺点
优点:
1、高容错性。数据保存多个副本,通过增加副本的形式提高容错性,某个副本丢失后,它可以通过其它副本自动恢复。
2、适合大批量数据处理。处理达到GB、TB,甚至PB级别的数据,处理百万规模以上的文件数量,处理10K节点的规模。
3、流式文件访问。一次写入多次读取,文件一旦写入不能修改,只能追加,保证数据一致性。
4、可构建在廉价机器上。通过多副本机制提高可靠性,提供容错和恢复机制。
缺点(不适用HDFS的场景):
1、低延时数据访问。做不到毫秒级存储数据,但是适合高吞吐率(某一时间内写入大量的数据)的场景。
2、小文件存储。存储大量小文件会占用NameNode大量的内存来存储文件、目录和块信息。
3、并发写入、随机读写。一个文件不允许多个线程同时写,仅支持数据追加,不支持文件的随机修改。
二、HDFS存储架构
数据存储架构图:
HDFS采用Master/Slave的架构存储数据,由HDFS Client、NameNode、DataNode和Secondary NameNode四部分组成。
Client:客户端
1、文件切分。文件上传HDFS时,Client按照Block大小切分文件,然后进行存储
2、与NameNode交互,获取文件位置信息
3、与DataNode交互,读取或写入数据
4、Client提供一些命令管理和访问HDFS
NameNode:Master(管理者)
1、管理HDFS的名称空间
2、管理数据块(Block)映射信息
3、配置副本策略
4、处理客户端读写请求
DataNode:Slave(NN下达命令执行实际的操作)
1、存储实际的数据块
2、执行数据块的读/写操作
Secondary NameNode:并非NameNode的热备,当NN停止服务时,它并不能马上替换NN并提供服务
1、辅助NN,分担其工作量
2、定期合并fsimage和fsedits,并推送给NN
3、在紧急情况下,可辅助恢复NN
三、HDFS数据读写
文件读取步骤:
1、首先调用FileSystem的open方法获取一个DistributedFileSystem实例。
2、DistributedFileSystem通过RPC(远程过程调用)获得文件的第一批block的locations,同一个block按照重复数返回多个locations,这些locations按照Hadoop拓扑结构排序,按照就近原则进行排序。
3、前两步结束后会返回一个FSDataInputStream对象,通过调用read方法时,该对象会找出离客户端最近的DataNode并连接。
4、数据从DataNode源源不断地流向客户端。
5、如果第一个block块数据读取完成,就会关闭指向第一个block块的DataNode连接,接着读取下一个block块。
6、如果第一批blocks读取完成,FSDataInputStream会向NN获取下一批blocks的locations,然后重复4、5步骤,直到所有blocks读取完成,这时就会关闭所有的流。
文件写入步骤:
1、客户端通过调用DistributedFileSystem的create方法,创建一个新文件。
2、DistributedFileSystem通过RPC(远程过程调用)调用NameNode,去创建一个没有blocks关联的新文件。创建前,NN会进行各种校验,如果校验通过,NN就会记录下新文件,否则抛出I/O异常。
3、前两步结束后会返回一个FSDataOutputStream对象,客户端开始写数据到FSDataOutputStream,FSDataOutputStream会把数据切成一个个小packet,然后排成data queue。
4、DataStreamer 会去处理接受 data queue,它先问询 NameNode 这个新的 block 最适合存储的在哪几个DataNode里,比如重复数是3,那么就找到3个最适合的 DataNode,把它们排成一个 pipeline。DataStreamer 把 packet 按队列输出到管道的第一个 DataNode 中,第一个 DataNode又把 packet 输出到第二个 DataNode 中,以此类推。
5、DFSOutputStream 还有一个队列叫 ack queue,也是由 packet 组成,等待DataNode的收到响应,当pipeline中的所有DataNode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
6、客户端完成写数据后,调用close方法关闭写入流。
7、DataStreamer 把剩余的包都刷到 pipeline 里,然后等待 ack 信息,收到最后一个 ack 后,通知 NameNode 把文件标示为已完成。
RackAware机架感知功能:
1、若client为DataNode节点,那存储block时,规则为:副本1存储在同client的节点上;副本2存储在不同机架节点上;副本3同第副本2机架的另外一个节点上;其它副本随机挑选。
2、若client不为DataNode节点,那存储block时,规则为:副本1随机选择一个节点;副本2存储在不同于副本1的机架节点;副本3同副本2所在机架的另一个节点;其它副本随机挑选。
以上是关于HDFS的架构及原理的主要内容,如果未能解决你的问题,请参考以下文章