zoukankan      html  css  js  c++  java
  • 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所在机架的另一个节点;其它副本随机挑选。

    更多精彩内容请关注微信公众号:Hadoop大数据之路
  • 相关阅读:
    《浅谈12306核心模型设计思路和架构设计》阅读笔记
    《一路打怪升级,360推荐系统架构演进》阅读笔记
    SOA架构设计的案例分析
    《苏宁易购:商品详情系统架构设计》阅读笔记
    《数据蜂巢架构演进之路》阅读笔记
    洛谷P1005 矩阵取数游戏
    LOJ#6277. 数列分块入门 1
    洛谷P1879 [USACO06NOV]玉米田Corn Fields
    洛谷P1072 Hankson 的趣味题
    洛谷P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
  • 原文地址:https://www.cnblogs.com/firstsheng618/p/9829288.html
Copyright © 2011-2022 走看看