HDFS(2):NN;DN;2NN

HDFS:NN;DN;2NN;

1、NameNode

1.1、知识总结

在这里插入图片描述

1.2、功能

  • 1、存储数据

    • 保存文件的元数据信息
      • 文件的归属
      • 文件的权限
      • 文件的大小时间
    • 文件与block块的映射
    • Block信息与DN的映射,但是block的位置信息不会持久化,需要每次开启集群的时候DN上报
      • 系统启动时
        • NN关机的时候是不会存储任意的Block与DN的映射信息
        • DN启动的时候,会将自己节点上存储的Block信息汇报给NN
        • NN接受请求之后重新生成映射关系
          • Block–DN3
      • 如果某个数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
  • 2、接受客户端的读写服务

    • 当客户端访问HDFS的时候
    • 都会通过NN获取或者是生成BLK对应的DN信息
    • 但是真实存储或者读取数据的时候,都是客户端直接去DN建立连接
  • 3、心跳机制

  • NN与DN保持心跳机制,三秒钟发送一次

    • 如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
    • 可以让客户端读取存活的DN节点
  • 如果DN超过三秒没有心跳,就认为DN出现异常

    - 不会让新的数据读写到DataNode
    - 客户访问的时候不提供异常结点的地址
    
    • 如果DN超过10分钟+30秒没有心跳,那么NN会将当前DN存储的数据转存到其他节点
      • 超时时长的计算公式为:
        timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。
        而默认的heartbeat.recheck.interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。
  • 4、日志记录

  • 因为NN为了追求效率,所有的数据都会存放到内存中。

  • 为了保障集群中的时候不会出现问题,以及出现问题的时候可以进行恢复最好的办法就是记录日志

  • 如何选择一种方式就是SecondaryNameNode要执行的工作

1.3、性能

  • NameNode为了效率,将所有的操作都在内存中完成
    • NameNode不会和磁盘进行任何的数据交换
    • 问题:
      • 数据的持久化
      • 数据保存在内存中,掉电易失

2、DateNode

在这里插入图片描述

功能:

1、存放的是文件的数据信息和验证文件完整性的校验信息

  • 数据会存放在硬盘上
  • 1m=1条元数据 1G=1条元数据
  • NameNode非常排斥存储小文件,一般小文件在存储之前需要进行压缩

2、汇报—心跳机制

  • 启动时
    • 汇报之前先验证Block文件是否被损坏
    • 向NN汇报当前DN上block的信息
  • 运行中
    • 向NN保持心跳机制
    • 客户可以向DN读写数据,

3、当客户端读写数据的时候,首先去NN查询file与block与dn的映射

  • 然后客户端直接与dn建立连接,然后读写数据

3、SecondaryNameNode

3.1、传统解决方案

在这里插入图片描述

  • 日志机制
    • 做任何操作之前先记录日志
    • 当NN下次启动的时候,只需要重新按照以前的日志“重做”一遍即可
    • 缺点
      • edits文件大小不可控,随着时间的发展,集群启动的时间会越来越长
      • 有可能日志中存在大量的无效日志
    • 优点
      • 绝对不会丢失数据
  • 拍摄快照
    • 我们可以将内存中的数据写出到硬盘上
      • 序列化
    • 启动时还可以将硬盘上的数据写回到内存中
      • 反序列化
    • 缺点
      • 关机时间过长
      • 如果是异常关机,数据还在内存中,没法写入到硬盘
      • 如果写出频率过高,导致内存使用效率低(stop the world) JVM
    • 优点
      • 启动时间较短

3.2、2NN解决方案

  • 解决思路(日志edits+快照fsimage

    • 让日志大小可控
    • 定时快照保存

在这里插入图片描述

3.3、2NN备份数据优化

  1. 客户端请求增删改,NN记一条日志edits到硬盘上。
  2. 当edits日志到达64M/3600S时,会创建新的edits.new。
  3. 2NN会 获取NN的edits和fsimage。
  4. 2NN优化edits,将fsimage加载到内存生成新的fsimage.ckpt。
  5. NN复制fsimage.ckpt到本地,并重命名fsimage;将edits.new改名为edits。

在这里插入图片描述

3.4、数据恢复

  1. 强行杀死NameNode节点

    1. kill -9 7388

在这里插入图片描述

  1. 清空namenode下name中的fsimage和edtis文件

      [root@node01 ~]# rm -rf /var/yjx/hadoop/full/dfs/name/current/*
    
  2. secondary namenode下的name中的fsimage和edits复制到namenode对应文件夹中

      [root@node01 ~]# scp -r root@node02:/var/yjx/hadoop/full/dfs/namesecondary/current/* /var/yjx/hadoop/full/dfs/name/current
    
  3. 启动namenode

hadoop-daemon.sh start namenode
  1. 访问namenode节点页面,成功

    在这里插入图片描述

  2. 很不幸部分数据丢失?

    1. 思考 应该怎么解决
    2. 将日志edits与fsimage生成在第三方平台或数据库里,这样就可以避免一部分数据丢失。

4、HDFS数据写入流程

在这里插入图片描述

4.1、宏观流程

在这里插入图片描述

  1. 客户端向HDFS发送写数据请求
  • hdfs dfs -put tomcat.tar.gz /yjx/
  1. filesystem通过rpc调用namenode的create方法
  • nn首先检查是否有足够的空间权限等条件创建这个文件,或者这个路径是否已经存在
    • 有:NN会针对这个文件创建一个空的Entry对象,并返回成功状态给DFS
    • 没有:直接抛出对应的异常,给予客户端错误提示信息
  1. DFS如果接收到成功状态,会创建一个对象 FSDataOutputStream的对象给客户端使用
  2. 客户端需要向NN询问第一个Block存放的位置
  • NN通过机架感知策略 (node1 node 2 node8)
  1. 需要将客户端和DN节点创建连接
  • pipeline(管道)
    • 客户端和node1创建连接 socket
    • node1和node2创建连接 socket
    • node2 和Node8创建连接 socket
  1. 客户端将文件按照块block切分数据,但是按照packet发送数据
  • 默认一个packet大小为64K,Block128M为2048个packet
  1. 客户端通过pipeline管道开始使用FSDataOutputStream对象将数据输出
  • 客户端首先将一个packet发送给node1,同时给予node1一个ack状态
  • node1接受数据后会将数据继续传递给node2,同时给予node2一个ack状态
  • node2接受数据后会将数据继续传递给node8,同时给予node8一个ack状态
  • node8将这个packet接受完成后,会响应这个ack给node2为true
  • node2会响应给node1 ,同理node1响应给客户端
  1. 客户端接收到成功的状态,就认为某个packet发送成功了,直到当前块所有的packet都发送完成
  2. 如果客户端接收到最后一个pakcet的成功状态,说明当前block传输完成
  3. 客户端会将这个消息传递给NN,NN确认传输完成
  • NN会将block的信息记录到Entry,客户端会继续向NN询问第二个块的存储位置,依次类推
  • block1 (node1 node2 node8)
  • block2 (node1 node8 node9)
  • blockn(node1 node7 node9)
  1. 最后一个Block传输完成,管道就会被撤销
  2. 当所有的block传输完成后,NN在Entry中存储所有的File与Block与DN的映射关系
  3. 关闭FsDataOutPutStream

4.2、微观流程

在这里插入图片描述

  1. 首先客户端从自己的硬盘以流的方式读取数据文件到自己的缓存中

  2. 然后将缓存中的数据以chunk(512B)和checksum(4B)的方式放入到packet(64K)

    1. chunk:checksum=128:1
    2. checksum:在数据处理和数据通信领域中,用于校验目的的一组数据项的和
    3. Packet分为两类,一类是实际数据包,另一类是heater包。
    4. 一个Packet数据包的组成结构

在这里插入图片描述

  1. 当packet满的时候加入到 添加到 dataqueue ,

  2. datastreamer开始从dataqueue队列上取出一个packet,通过FSDataOPS发送到Pipleline

    1. 在取出的时候,也会将packet加入到ackQueue,典型的生产者消费者模式
  3. 客户端发送一个Packet数据包以后开始接收ack,会有一个用来接收ack的ResponseProcessor进程,如果收到成功的ack

  • 如果某一个packet的ack为true,那么就从ackqueue删除掉这个packet
  • 如果某一个packet的ack为false,将ackqueue中所有的packet重新挂载到 发送队列,重新发送
  1. 最终DFS保存的数据格式为

在这里插入图片描述

5、HDFS数据读出流程

在这里插入图片描述

  • 首先客户端发送请求到DFS,申请读取某一个文件
    • /yjx/tomcat.tar.gz
  • DFS去NN查找这个文件的信息(权限,文件是否存在)
    • 如果文件不存在,抛出指定的错误
    • 如果文件存在,返回成功状态
  • DFS创建FSDataInputStream对象,客户端通过这个对象读取数据
  • 客户端获取文件第一个Block信息,返回DN1 DN2 DN8
  • 客户端直接就近原则选择DN1对应的数据即可
  • 依次类推读取其他块的信息,直到最后一个块,将Block合并成一个文件
  • 关闭FSDataInputStream
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值