HDFS原理与应用 | 青训营笔记

91 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第8天

  • High Availability: 高可用
  • Throughput: 吞吐量
  • Scale Out: 水平扩展
  • Scale Up:纵向扩展
  • Fault-Tolerance: 容错
  • Erasure Coding/EC: 纠删码

HDFS架构原理

NameNode

我们客户端需要读一个文件的信息时,必须知道我们这个文件被分成了多少个block,各个block又分别存储在哪个服务器上,这种用于描述文件的信息被称为文件的元数据信息(metaData),而metaData就是存储在NameNode的内存中的。

什么说HDFS适合存储大文件而不适合存储小文件?

metaData的大小:文件,block,目录占用大概150byte字节的元数据,可想而知存储一个大文件就只有一份150byte的元数据,存储N多个小文件就会伴随存在N份150Byte字节的元数据文件,这就非常地不划算

元数据信息以命名空间镜像文件(以下称为fsimage)和编辑日志(以下称为edits log)的方式保存,两者的作用分别是

fsimage:元数据镜像文件,保存了文件系统目录树信息以及文件和块的对应关系
edits log:日志文件,保存了文件的更改记录
  • NameNode目录树设计,重点理解EditLog的设计,可类比关系型数据库中的Transaction Log概念。

    • 仅在内存中修改:fsimage
    • 需要立即保存到硬盘:EditLog

block

HDFS3.x上的文件会按照128M为单位切分成一个个的block,分散存储在集群的不同的数据节点datanode上,需要注意的是,这个操作是HDFS自动完成的。一个文件被分成了几块存储在不同的datanode上,万一其中的一个datanode挂掉,那岂不是这个文件就找不回来了吗,所以hadoop还对我们的每一个数据块做了一个副本,保证数据的可靠性

HDFS关键设计

心跳机制

1.NameNode全权管理数据块的复制,它周期性从集群中的每个DataNode接收心跳信号和块状态报告(blockReport),接收到心跳信号意味着该DataNode节点工作正常,块状态报告包含了该DataNode上所有数据块的列表

2.DataNode启动时向NameNode注册,通过后周期性地向NameNode上报blockReport,每3秒向NameNode发送一次心跳,NameNode返回对该DataNode的指令,如将数据块复制到另一台机器,或删除某个数据块等···而当某一个DataNode超过10min还没向NameNode发送心跳,此时NameNode就会判定该DataNode不可用,此时客户端的读写操作就不会再传达到该DataNode上

3.hadoop集群刚开始启动时会进入安全模式(99.99%),就用到了心跳机制,其实就是在集群刚启动的时候,每一个DataNode都会向NameNode发送blockReport,NameNode会统计它们上报的总block数,除以一开始知道的总个数total,当 block/total < 99.99% 时,会触发安全模式,安全模式下客户端就没法向HDFS写数据,只能进行读数据。

负载均衡

HDFS应用场景

  • 大数据技术中的应用

    • HDFS在大数据技术体系中的角色

    • 演示:PySpark读取分析HDFS上的文件

      • 数据如何产生
      • 数据如何读取
      • 数据如何保存
    • ETL:数据如何产生、传输

    • OLAP:如何高效地读取分析数据

  • 存储底座

    • HBase
    • 机器学习
    • 通用场景