2_HDFS的基本架构,工作原理

2020/12/10 [email protected]

HDFS的基本架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yjUe9veH-1614602170119)(file:///C:/Users/19701/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]

​ 这种架构主要由四个部分组成,分别为 HDFS Client、 NameNode、 DataNode 和 SecondaryNameNode。下面我们分别介绍这四个组成部分。

1.1、Client

​ 客户端

(1)文件切分。文件上传 HDFS 的时候, Client 将文件切分成一个一个的 Block,然后进行存储。

(2)与 NameNode 交互,获取文件的位置信息。

(3)与 DataNode 交互,读取或者写入数据。

(4) Client 提供一些命令来管理 HDFS,比如启动或者关闭 HDFS。

(5) Client 可以通过一些命令来访问 HDFS。

1.2、NameNode

​ 就是master,它是一个主管、管理者。

(1)管理 HDFS 的名称空间。

(2)管理数据块(Block)映射信息

(3)配置副本策略

(4)处理客户端读写请求。

1.3、DataNode

​ 就是 Slave。 NameNode 下达命令, DataNode 执行实际的操作。

(1)存储实际的数据块。

(2)执行数据块的读/写操作。

1.4、Secondary NameNode

​ 并非 NameNode 的热备。当 NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。

(1)辅助 NameNode,分担其工作量。

(2)定期合并 Fsimage 和 Edits,并推送给 NameNode。

(3)在紧急情况下,可辅助恢复 NameNode。

HDFS的工作原理

2.1、基本概念

​ HDFS是一个文件系统,用于存储和管理文件,通过统一的命名空间(类似于本地文件系统的目录树)。HDFS是分布式的系统,服务器集群中各个节点都有自己的角色和职责。理解HDFS,需要注意以下几个概念:

  • HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数(
    dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,之前的版本中是64M。
  • HDFS文件系统会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
  • 目录结构及文件分块位置信息(元数据)的管理由namenode节点承担,namenode是HDFS集群主节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的数据块信息(blockid及所在的datanode服务器)
  • 文件的各个block的存储管理由datanode节点承担,datanode是HDFS集群从节点,每一个block都可以在多个datanode上存储多个副本(副本数量也可以通过参数设置dfs.replication,默认是3)
  • Datanode会定期向Namenode汇报自身所保存的文件block信息,而namenode则会负责保持文件的副本数量,HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行。
  • HDFS是设计成适应一次写入,多次读出的场景,且不支持文件的修改。需要频繁的RPC交互,写入性能不好。

2.2、NameNode

2.2.1、磁盘与内存

在NameNode开始服务时,将会读取磁盘上的edits,fsimage文件,在内存(缓存)使用这些数据
读到内存中使用的原因:和磁盘多次交互会导致效率变低,从内存增删改查则是高效的选择(例:对文件进行2000000次相同内容的删除增加,在内存中执行此操作,到最后到磁盘上的结果就是什么都没发生)

2.2.2、NameNode运行原理

edits:编辑日志(操作过程数据)

fsimages:镜像文件(某一时刻的完整状态,HDFS只会保存最新的两个镜像文件)

1、在hdfs第一次启动时,会在name目录下创建edits和fsimage文件。在之后的启动过程中,HDFS会把磁盘中最新的fsimage文件和edits文件加载到内存中,并且同时创建edits.inprogress文件。
2、edits文件分为两种,正在运行的文件系统将操作存储至edits_improgressxxx文件,在集群关闭或者进行滚动日志时该文件将转化为edits_xxx文件,如果是日志滚动将会生成新的edits_improgressxxx文件

例:有一家公司的财务需要每两个月清算一下账单,清算结束后将结果布告。在这两个月中公司的所有进出账都会进行记录,并且浮动资金超过30%就要清算一次变成小账本,所以这两个月中可能只有一个小账本也可能有多个小账本。到了两个月就将所有小账本其合并至总账单中。
如果工商局在一个半月的时候突然要求查看所有账单,那么进行合并将会是上次结算的总账单,所有已经总结好的小账本,以及还没来得及整理成小账本的财务明细
在本例中:
1. 财务的总账单—>fsimage文件
2. 小账本—>edits日志文件
3. 没来的及整理成小账本的财务明细—>edits.inprogress文件
4. 每两个月总结一次—>HDFS运行时间为一小时
5. 浮动资金超过30%—>HDFS的操作记录数达到100万条

在这里插入图片描述

2.2.3、NameNode工作原理、checkpoint合并机制

​ 那么合并的工作由谁来做,什么时间做?

  • SecondryNameNode将会执行这个操作
    • 每隔一分钟SNN将会询问NN是否需要合并
  • 触发两个条件之一将会合并
    • 记录数达到100万条
    • 集群运行时间达到了一小时
      每次合并fsimage文件与edits文件都相当于合并 存储的最后一个fsimage文件和最后一段edits文件,以及当前集群的edits.inprogress滚动而来的文件
  • 一次完整的checkpoint
    • 1、 NameNode将最新的fsimage001文件和edits001文件读取到内存中,以此来保证文件系统是最新的状态
    • 2、客户端发起对文件系统上的内容进行修改
    • 3、最新的edits001文件进行一次滚动生成下一个edits02文件,并且生成edits.inprogress001文件,用来存储本次集群开启将进行的所有操作
    • 4、用户提出的请求将会在内存中进行修改,并将操作记录记录至edits.inprogress001文件中
    • 5、SNN向NN询问是否需要checkpoint(当文件系统运行了1小时或者操作记录达到100万次)
    • 6、请求执行checkpoint操作
    • 7、滚动正在记录的edits.inprogress001文件为edits003文件,并生成新的edits.inprogress002文件,记录在合并过程中对文件系统的操作
    • 8、将edits002、edits003、fsimage001拷贝至SNN加载至内存进行合并
    • 9、生成新的fsimage.chkpoint001文件
    • 10、将新生成的fsimage.chkpoint001文件拷贝至NameNode中
    • 11、将拷贝过来的fsimage.chkpoint001重命名为fsimage002文件,
    • 12、下一次合并的应为由edits.inprogress002转化而来的edits文件、fsimage002文件、以及新生成的edits.inprogress滚动而来的文件,共同合并。
      在这里插入图片描述

2.3、DataNode

2.3.1、两种文件

一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件

  • 数据本身
  • 元数据:包括数据块的长度,块数据的校验和,以及时间戳。

2.3.2、DataNode工作机制

2.1、DataNode启动后向NameNode注册,通过后,周期性(1小时)的向namenode上报所有的块信息。

2.2、NameNode每隔三秒向DataNode发送一次请求,达到确认该DataNode节点仍在服务,将指令发给DataNode节点

2.3、十分钟之内,DataNode向NameNode发送回执请求,确认DataNode仍在服务

2.4、如果超过十分钟DataNode仍没有发送回执请求,NameNode则认为该节点已经不可用。

2.3.3、动态服役、退役DataNode节点

​ 在实际生产环境下,集群可能关闭或者启动将耗费很长时间,所以是不能够随意关闭启动的。在此状态下我们也能向集群中添加、删除DataNode节点

服役新节点

  • 准备一台虚拟机

  • 修改IP地址,主机名称

  • 删除hadoop相关所有文件

  • 在namenode的hadoop-2.7.6/etc/hadoop目录下创建dfs.hosts文件(文件内容为所有正在服役的Datanode节点名称以及将要服役的节点名称,用主机名,每行一个不允许空格)

  • 在namenode的hdfs-site.xml配置文件中增加dfs.hosts属性
    在这里插入图片描述

  • 刷新NameNodehdfs dfsadmin -refreshNodes

  • 更新resourcemanager节点yarn rmadmin -refreshNodes

  • 在namenode节点的slaves文件中增加新服役的主机名

  • 将hadoop/etc/hadoop的整个文件夹分发至集群中

  • 在新服役的机器上启动DataNode服务

    • [bduser@node105 hadoop-2.7.6]$ sbin/hadoop-daemon.sh start datanode
    • [bduser@node105 hadoop-2.7.6]$ sbin/yarn-daemon.sh start nodemanager
  • 在webUI上查看是否有新节点服务信息

    退役旧节点

  • 在/hadoop-2.7.6/etc/hadoop目录下创建dfs.hosts.exclude文件,文件内容为即将退役的节点主机名

  • 在NameNode上把刚才在hdfs-site.xml中增加的属性注释,添加新的属性
    在这里插入图片描述

  • 将/hadoop2.7.3/etc/hadoop同步到所有节点上

  • 同样刷新namenode和resourcemanager

  • 等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役

  • 在退役节点上运行

    • [bduser@node105 hadoop-2.7.6]$ sbin/hadoop-daemon.sh stop datanode
    • [bduser@node105 hadoop-2.7.6]$ sbin/yarn-daemon.sh stop nodemanager
  • 从namenode的slave文件中删除退役节点

bduser@node105 hadoop-2.7.6]$ sbin/hadoop-daemon.sh stop datanode`

  • [bduser@node105 hadoop-2.7.6]$ sbin/yarn-daemon.sh stop nodemanager
  • 从namenode的slave文件中删除退役节点

猜你喜欢

转载自blog.csdn.net/nothair/article/details/114271105