Hadoop学习01——HDFS原理

这是我参与更文挑战的第9天,活动详情查看:更文挑战

一、文件系统

  • 文件系统定义:文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找

变得容易。

  • 文件名:在文件系统中,文件名是用于定位存储位臵。
  • 元数据(Metadata):保存文件属性的数据,如文件名,文件长度,文件所属用户组,

文件存储位臵等。

  • 数据块(Block):存储文件的最小单元。对存储介质划分了固定的区域,使用时按这

些区域分配使用

二、HDFS的特性

01.png
不适用的场景:

  1. 低时间延迟数据访问的应用,例如几十毫秒范围。

    • 原因: HDFS是为高数据吞吐量应用优化的,这样就会造成以高时间延迟为代价。
  2. 大量小文件

    • 原因: NameNode启动时,将文件系统的元数据加载到内存,因此文件系统所能存储的文件总数受限于NameNode内存容量。根据经验,每个文件,目录和数据块的存储信息大约占150字节,如果一百万个文件,且每个文件占一个数据块,那至少需要300MB的内存空间,但是如果存储十亿个文件,那么需要的内存空间将是非常大的。
  3. 多用户写入,任意修改文件。

    • 原因:现在HDFS文件只有一个writer,而且写操作总是写在文件的末尾。
  4. 流式数据访问

    • 在数据集生成后,长时间在此数据集上进行各种分析。每次分析都将涉及该数据集的大部分数据甚至全部数据,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。与流数据访问对应的是随机数据访问,它要求定位、查询或修改数据的延迟较小,比较适合于创建数据后再多次读写的情况,传统关系型数据库很符合这一点。

02.png

三、hadoop的存储模型

  • 使用字节为单位
  • 文件线性切割成块(Block):偏移量 offset (byte,中文?)
  • Block分散存储在集群节点中
  • 单一文件Block大小一致,文件与文件可以不一致
  • Block可以设置副本数,副本无序分散在不同节点中
    • 副本数不要超过节点数量
  • 文件上传可以设置Block大小和副本数(资源不够开辟的进程)
  • 已上传的文件Block副本数可以调整,大小不变
  • 只支持一次写入多次读取,同一时刻只有一个写入者
  • 可以append追加数据

四、Hadoop的架构模型

03.png

  • 文件元数据MetaData,文件数据
    • 元数据
    • 数据本身
  • (主)NameNode节点保存文件元数据:单节点 posix
  • (从)DataNode节点保存文件Block数据:多节点
  • DataNode与NameNode保持心跳,提交Block列表
  • HdfsClient与NameNode交互元数据信息
  • HdfsClient与DataNode交互文件Block数据(cs)
  • DataNode 利用服务器本地文件系统存储数据块

04.png

五、组件介绍

  1. namenode
    1. 主要功能
      • 接受客户端的读写服务
      • 收集DataNode汇报的Block列表信息
    2. NameNode保存metadata信息包括
      • 文件owership和permissions
      • 文件大小,时间
      • (Block列表:Block偏移量),位置信息(持久化不存)
      • Block每副本位置(由DataNode上报)
    3. 基于内存存储 :不会和磁盘发生交换(双向)
      • 只存在内存中
      • 持久化(单向)
    4. namenode持久化
      • NameNode的metadata信息在启动后会加载到内存
      • metadata存储到磁盘文件名为”fsimage”(时点备份)
      • Block的位置信息不会保存到fsimage
      • edits记录对metadata的操作日志…>Redis
  2. SecondaryNameNode(只存在于Hadoop1.0中)

05.jpg

  • 它不是NN的备份(但可以做备份),它的主要工作是帮助NN合并edits log,减少NN启动时间。
  • SNN执行合并时机
    • 根据配置文件设置的时间间隔fs.checkpoint.period 默认3600秒
    • 根据配置文件设置edits log大小 fs.checkpoint.size 规定edits文件的最大值默认是64MB

六、hdfs读写流程

  1. 写流程

06.jpg

  • 业务应用调用HDFS Client提供的API,请求写入文件。
  • HDFS Client联系NameNode, NameNode在元数据中创建文件节点。
  • 业务应用调用write API写入文件。
  • HDFS Client收到业务数据后,从NameNode获取到数据块编号、位臵信息后,联系DataNode,并将需要写入数据的DataNode建立起流水线。完成后,客户端再、通过自有协议写入数据到DataNode1,再由DataNode1复制到DataNode2,、DataNode3。
    • 写完的数据,将返回确认信息给HDFS Client。
    • 所有数据确认完成后,业务调用HDFS Client关闭文件。
    • 业务调用close, flush后HDFS Client联系NameNode,确认数据写完成,NameNode持久化元数据。
  1. 读流程

07.png

  • 业务应用调用HDFS Client提供的API打开文件。
  • HDFS Client联系NameNode,获取到文件信息(数据块、 DataNode位臵信息)。
  • 业务应用调用read API读取文件。
  • HDFS Client根据从NameNode获取到的信息,联系DataNode,获取相应的数据块。 (Client采用就近原则读取数据)。
  • HDFS Client会与多个DataNode通讯获取数据块。
  • 数据读取完成后,业务调用close关闭连接。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享