hadoop02-HDFS【尚硅谷】

HDFS

大数据学习笔记

一、HDFS产出背景及定义

  1. HDFS产生背景
    随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种
  2. HDFS定义
    HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
    HDFS的使用场景适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。

优点:
1)高容错性

  • 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
  • 某一个副本丢失以后,它可以自动恢复。

2) 适合处理大数据

  • 数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据
  • 文件规模:能够处理百万规模以上的文件数量,数量相当之大。
    3)可构建在廉价机器上,通过多副本机制,提高可靠性。

缺点:
1) 不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
2)无法高效的对大量小文件进行存储。

  • 存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;
  • 小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。
    3)不支持并发写入、文件随机修改。
  • 一个文件只能有一个写,不允许多个线程同时写;
  • 仅支持数据append(追加),不支持文件的随机修改。
  1. HDFS组成架构
    在这里插入图片描述
  1. NameNode(nn):就是Master,它是一个主管、管理者。
  • 管理HDFS的名称空间;
  • 配置副本策略;
  • 管理数据块(block)映射信息;
  • 处理客户端读写请求。
  1. DataNode(dn):就是Slave。NameNode下达命令,DataNode执行实际的操作。
  • 存储实际的数据块;
  • 执行数据块的读/写操作。
  1. Client:就是客户端。
  • 文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传;
  • 与NameNode交互,获取文件的位置信息;
  • 与DataNode交互,读取或者写入数据;
  • Client提供一些命令来管理HDFS,比如NameNode格式化;
  • Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作。
  1. Secondary NameNode(2nn):并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
  • 辅助NameNode,分担其工作量,比如定期合并Fsimage和Edits(镜像和编辑日志),并推送给NameNode;
  • 在紧急情况下,可辅助恢复NameNode只可恢复部分,并不是所有
  1. HDFS文件块大小(面试重点)
    HDFS中的文件在物理上是分块层出(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在Hadoop2.x版本中是128M,老版本中是64M
    在这里插入图片描述

思考:为什么块的大小不能设置太小,也不能设置太大?
1)HDFS的块设置太小,会增加寻址时间,程序一直在找块的开始位置;
2)如果块设置的太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢。

总结:HDFS块的大小设置主要取决于磁盘传输速率。

二、 HDFS的数据流(面试重点)

  1. HDFS写数据流程
  1. 客户端创建一个分布式文件系统,向NameNode请求上传文件,指定文件位置
  2. NameNode接收到请求,响应可以上传文件
  3. 客户端向NameNode请求上传一个Block(128M),请返回DataNode
  4. NameNode返回DataNode1、DataNode2、DataNode3结点,表示采用这三个节点存储数据。
  5. 客户端创建FS对象写数据,与DataNodes 建立Block传输通道。
  6. DataNodes应答成功
  7. 开始传输数据到DataNode
  8. 传输数据完成,关闭通道

在这里插入图片描述
2. NameNode 如何选择DataNode

在HDFS写数据的过程中,namenode会选择距离待上传数据最近距离的DataNode接收数据。
节点距离计算
在这里插入图片描述
3. HDFS读数据流程
在这里插入图片描述

1. 客户端创建FileSystem,向NameNode请求下载文件
2. namenode返回目标文件的元数据信息(文件位置)
3. 客户端创建输入流Stream,向DataNode请求读数据block1
4. DataNode像客户端传输数据
5. 请求读取数据block2
6. DataNode将block2的数据返回给客户端

三、NameNode 和 SecondaryNameNode(面试开发重点)

  1. NN和2NN工作机制

NameNode中的元数据存储在哪里?
首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断电,元数据丢失,整个集群就无法工作了。因此产生在磁盘中备份元数据的FsImage

这样又会带来新的问题,当在内存中的元数据更新时,如果同时更新FsImage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦NameNode节点断电,就会产生数据丢失。因此,引入Edits文件(只进行追加操作,效率很高)。每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到Edits中。这样,一旦NameNode节点断电,可以通过FsImage和Edits的合并,合成元数据。

但是,如果长时间添加数据到Edits中,会导致该文件数据过大,效率降低,而且一旦断电,恢复元数据需要的时间过长。因此,需要定期进行FsImage和Edits的合并,如果这个操作由NameNode节点完成,又会效率过低。因此,引入一个新的节点SecondaryNamenode,专门用于FsImage和Edits的合并。

  1. NameNode 和 SecondaryNameNode工作机制
    在这里插入图片描述
  1. 第一阶段:NameNode启动
    (1)第一次启动NameNode格式化后,创建Fsimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
    (2)客户端对元数据进行增删改的请求。
    (3)NameNode记录操作日志,更新滚动日志。
    (4)NameNode在内存中对数据进行增删改。
  2. 第二阶段:Secondary NameNode工作
    (1)Secondary NameNode询问NameNode是否需要CheckPoint。直接带回NameNode是否检查结果。
    (2)Secondary NameNode请求执行CheckPoint。
    (3)NameNode滚动正在写的Edits日志。
    (4)将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode。
    (5)Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
    (6)生成新的镜像文件fsimage.chkpoint。
    (7)拷贝fsimage.chkpoint到NameNode。
    (8)NameNode将fsimage.chkpoint重新命名成fsimage。

NN和2NN工作机制详解:
Fsimage:NameNode内存中元数据序列化后形成的文件。
Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据)。
NameNode启动时,先滚动Edits并生成一个空的edits.inprogress,然后加载Edits和Fsimage到内存中,此时NameNode内存就持有最新的元数据信息。Client开始对NameNode发送元数据的增删改的请求,这些请求的操作首先会被记录到edits.inprogress中(查询元数据的操作不会被记录在Edits中,因为查询操作不会更改元数据信息),如果此时NameNode挂掉,重启后会从Edits中读取元数据的信息。然后,NameNode会在内存中执行元数据的增删改的操作。
由于Edits中记录的操作会越来越多,Edits文件会越来越大,导致NameNode在启动加载Edits时会很慢,所以需要对Edits和Fsimage进行合并(所谓合并,就是将Edits和Fsimage加载到内存中,照着Edits中的操作一步步执行,最终形成新的Fsimage)。SecondaryNameNode的作用就是帮助NameNode进行Edits和Fsimage的合并工作。
SecondaryNameNode首先会询问NameNode是否需要CheckPoint(触发CheckPoint需要满足两个条件中的任意一个,定时时间到和Edits中数据写满了,默认1小时,100w条)。直接带回NameNode是否检查结果。SecondaryNameNode执行CheckPoint操作,首先会让NameNode滚动Edits并生成一个空的edits.inprogress,滚动Edits的目的是给Edits打个标记,以后所有新的操作都写入edits.inprogress,其他未合并的Edits和Fsimage会拷贝到SecondaryNameNode的本地,然后将拷贝的Edits和Fsimage加载到内存中进行合并,生成fsimage.chkpoint,然后将fsimage.chkpoint拷贝给NameNode,重命名为Fsimage后替换掉原来的Fsimage。NameNode在启动时就只需要加载之前未合并的Edits和Fsimage即可,因为合并过的Edits中的元数据信息已经被记录在Fsimage中。

  1. Fsimage和Edits概念
    1. Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和问句inode的序列化信息。
    2. Edits文件:存放hdfs文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
    3. seen_txid文件保存的是一个数字,就是最后一个edits_的数字
    4. 每次NameNode启动的时候都会将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息时最新的、同步的,可以看成NameNode启动的时候就将Fsimage和Edits文件进行了合并。

四、NameNode故障机制

方法一:将SecondaryNameNode中数据拷贝到NameNode存储数据的目录;
方法二:使用importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。

五、集群安全模型

  1. NameNode启动
    NameNode启动时,首先会加载Fsimage文件到内存,然后执行Edits编辑日志中存储的操作。在内存创建成功后,就要创建一个新的FsImage和Edits文件。这时。NameNode开始监听DataNode请求。在这个过程期间,NameNode一直运行在安全模型,即NameNode的文件系统对于客户端来说是只读的。
  2. DataNode启动
    系统中的数据块以块列表的形式存储在DataNode中。在完全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。
  3. 安全模式退出判断
    如果满足**“最小副本条件”,NameNode会在30秒钟之后就退出安全模型**。最小副本条件是指在整个文件系统中99.9%的块满足最小副本级别。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以namenode就不会进入安全模式。

六、DataNode工作机制

  1. DataNode工作机制
    在这里插入图片描述

1)一个数据块在DataNode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
2)DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
3)心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
4)集群运行中可以安全加入和退出一些机器。

  1. 数据完整性
    1)当DataNode读取Block的时候,它会计算CheckSum。
    2)如果计算后的CheckSum,与Block创建时值不一样,说明Block已经损坏。
    3)Client读取其他DataNode上的Block。
    4)DataNode在其文件创建后周期验证CheckSum(校验:奇偶校验、crc校验位)

七、HDFS2.X新特性

  1. 集群间的数据拷贝 distcp命令
  2. 快照管理(相当于对目录做一个备份)
  3. 小文件存档

HDFS存储小文件的弊端
大量的小文件会耗尽NameNode中的大部分内存。但注意,存储小文件所需的磁盘容量和数据块的大小无关。
在这里插入图片描述

  1. 回收站

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。在HDFS内部的具体实现就是在NameNode中开启了一个后台线程Emptier,这个线程专门管理和监控系统回收站下面的所有文件/目录,对于已经超过生命周期的文件/目录,这个线程就会自动的删除它们

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值