HDFS架构原理

HDFS采用主从架构存储数据,包含Namenode、SecondaryNameNode、Client、DataNode四大块

HDFS架构原理

1.NameNode:是HDFS的Master架构,负责文件系统的管理,包括namespace(名称空间)的管理、文件块Block管理,记录数据修改记录、元数据操作等信息

(
简单讲就是:

  1. 管理 HDFS 的名称空间
  2. 管理数据块(Block)映射信息
  3. 配置副本策略
  4. 处理Client读写请求
    )
  • Namespace: 通过镜像文件(fsimage)和操作日志文件(editlog),将文件系统树和文件树中子文件/夹的元数据信息缓存在RAM中,并持久化在本地硬盘;Namenode执行namespace操作是指打开、关闭、重命名文件或文件夹,并决策文件、block、datanode的映射关系
    【editlog文件:记录了对文件系统元数据产生修改的操作】
    【fsimage文件:存储整个文件系统的名字空间】
    【NameNode启动过程:从硬盘读取editlog和fsimage文件,将editlog中的事务作用在内存中的fsimage上,并将这个新版本的fsimage持久化到磁盘,以及删除旧的editlog。这个过程叫做一个检查点(Checkpoint)】

  • Block:HDFS的数据存储单元,Namenode记录每个文件中各个block所在数据节点(datanode)的位置信息(元数据信息),从NameNode中可以获得每个文件的每个block所在的DataNode。这些信息不持久化,重启NameNode时会动态重建
    (
    1.元数据信息是指映射的位置信息:
    文件名 -> block,[持久化到磁盘]
    block -> DataNode列表,[通过DataNode上报给NameNode建立起来的临时信息]
    )

  • 文件被切分成固定大小的block:有个默认数据块大小(比如64MB),可配置, 若文件大小不到默认值,则单独存成一个block

  • 一个文件存储方式:按大小被切分成若干个block,存储到不同节点上,默认情况下每个block都有三个副本

  • block大小和副本数通过Client端上传文件时设置,文件上传成功后副本数可以变更,Block Size不可变更
    HDFS架构原理

2.SecondaryNameNode:不是NameNode的备份(但可以备份),辅助 NameNode,分担其工作量,它的主要工作是帮助NameNode定期合并 fsimage和fsedits,并推送给NameNode,减少NameNode启动时间

HDFS架构原理
当客户端执行写操作,则NameNode会在edit log记录下来并在内存中保存一份文件系统的元数据。
Namespace image(fsimage)文件是文件系统元数据的持久化检查点,不会在写操作后马上更新,因为fsimage写非常慢(这个有比较像datafile)。
由于Edit log不断增长,在NameNode重启时,会造成长时间NameNode处于安全模式,不可用状态,是非常不符合Hadoop的设计初衷。所以要周期性合并Edit log,但是这个工作由NameNode来完成,会占用大量资源,这样就出现了Secondary NameNode,它可以进行image检查点的处理工作。步骤如下:

  1. Secondary NameNode请求NameNode进行edit log的滚动(即创建一个新的edit log),将新的编辑操作记录到新生成的edit log文件;
  2. 通过http get方式,读取NameNode上的fsimage和edits文件,到Secondary NameNode上;
  3. 读取fsimage到内存中,即加载fsimage到内存,然后执行edits中所有操作,并生成一个新的fsimage文件,即这个检查点被创建;
  4. 通过http post方式,将新的fsimage文件传送到NameNode;
  5. NameNode使用新的fsimage替换原来的fsimage文件,让1创建的edits替代原来的edits文件;并且更新fsimage文件的检查点时间。
    Secondary NameNode的处理,是将fsimage和edites文件周期的合并,不会造成nameNode重启时造成长时间不可访问的情况。
    参考:https://blog.****.net/Lord_War/article/details/78727049

3.DataNode:就是Slave,NameNode 下达命令,DataNode 执行实际的操作

  • 存储实际的block
  • 执行block的读/写操作
  • 启动DataNode线程的时候会向NameNode汇报block信息
  • 通过向NameNode发送心跳保持与其联系(3秒一次),如果NameNode10分钟没有收到DataNode的心跳,则认为其已经lost,并copy其上的block到其他DataNode

4.Client:这里的客户端不是指用户的手机电脑浏览器,而是指Hadoop生态组件里的客户端,HDFS的Client是用户和HDFS进行交互的手段,包含:命令行接口、Java API, Thrift接口、C语言库、用户空间文件系统〔Filesystem in Userspace,FUSE)等

  • 文件切分:文件上传 HDFS 的时候,Client 将文件切分成若干个block进行存储
  • 与 NameNode 交互,获取文件的位置信息
  • 与 DataNode 交互,读取或者写入数据
  • Client 提供一些命令来管理 HDFS
  • HDFS的Client物理形态: HDFS客户端就是用来访问这个hadoop文件系统的机器,它可以是装有hadoop的机器,也可以是没有装hadoop的机器,如果你的机器装有hadoop,那你这台机器既是服务器,又是客户端

5.HDFS优缺点和适用场景

优点
  • 多副本实现高容错性
  • 适合批处理
  • 适合大数据处理
  • 流式文件访问:一次写入多次读取,一旦写入不可修改,保证数据一致性
  • 可构建在廉价机器上
  • 适合高吞吐量存储并且无需实时读写的场景
缺点
  • 无法低延时数据访问:存储较慢,无法毫秒级存储数据和读取数据,也就无法实时获取数据
  • 不适合大量小文件存储
  • 不适合并发写入:一个文件不支持多线程同时写
  • 不支持文件随机修改:只支持数据追加写入append,不支持随机修改