HDFS学习笔记 【Namenode/数据块管理】

news/2024/5/5 6:04:04/文章来源:https://blog.csdn.net/xuschang/article/details/130053500

说明

Namenode关于数据块管理主要做两方面的事情。
文件系统对应数据块
数据块对应数据节点

Block的数据结构

通过Block,BlockInfo,BlocksMap,replica等数据结构表示数据块。

Block

唯一标识一个数据块
包含有比较方法,通过blockId进行比较

BlockInfo

block的补充说明,包括block的副本在哪个HDFS文件
Object[] triplets,包含一个隐形的双链表。DatanodeStorageInfo, 前一个BlockInfo,后一个BlockInfo.

BlocksMap

管理Namenode上数据块的元数据,包括当前数据块属于哪一个HDFS文件,当前数据块保存在哪些Datanode上。
保存了什么信息
获取数据块对应的hdfs文件
获取数据块对应的datanode节点
何时保存的
datanode启动时,扫描本地磁盘。
如何保存的
维护 block-> blockInfo信息对应关系
blockInfo是通过上报更新的,无论是datanode启动上报还是增量上报

replica

replicastate表示副本的状态
FINALIZED,RBW,RUR,RWR,TEMPORARY

Block状态类

Block也包含有不同的状态。
通过副本的状态来判断是否可以读取,是否可以关闭文件。

数据块副本的状态

在文件系统中的数据称为数据块,在datanode中的数据称为副本。对于副本的不同状态,NN需要做不同的操作。
通过BlockManager类,
不同状态的副本类,
副本所在datanode状态来实现状态转移。

BlockManager数据结构

BlockManager维护多个不同状态的副本
损坏的副本
多余的副本
无效的副本
需要复制的副本
需要等待切换汇报的Block队列(防止HA切换多删除)

不同状态的副本通过不同的数据结构保存,比如损坏的,使用CorruptReplicasMap会记录损坏的原因。
需要复制的副本,会使用优先队列使用独立线程进行处理。为了防止失败,先在内存中保存,等待增量汇报后进行处理。

数据块副本状态

数据块的状态和BlockManager描述一致
只不过增加了两个正在进行时的状态
正在构建状态(客户端写入)
恢复状态(客户端写入失败)

状态转移

通过队列的修改实现状态转移
在这里插入图片描述

元数据管理

集群中所有数据块的数据称为元数据。
通过BlockManager类实现复制管理和状态管理来完成元数据管理。

不同状态队列处理

PendingReplications线程: 处理超时块复制
replicationThread线程: 处理块复制

复制操作

replicationThread循环执行两个操作:
computeDatanodework
从neededReplicaitons里面取复制任务执行,里面包含两个任务,增加或者是删除。逻辑差不多,以增加为例。
computeReplicationWorkForBlocks方法
包含四个小步骤

  1. 找到需要复制的块
    neededReplications优先队列执行
  2. 找到复制的源节点
    chooseSource,找到符合条件的节点。
  3. 找到复制的目的节点
    chooseTarget,机架感知法
  4. 保存复制命令(心跳执行)
    加入到心跳的任务队列中
    加入到等待确认的队列中。pendingReplications

processpendingreplications
pendingReplications队列中超时操作的重新加到neetedReplications队列中。

数据块的增删改查

BlockManager管理两个块映射关系
块映射节点 blockInfo
节点映射块 datastorage.blocklist

增加数据块

客户端向NN申请增加数据块
NN检查文件系统状态,选择DN,构造Block对象,加入到INode对应的对象中。
再构造BlockInfo,加入到BlockManager.BlocksMap中

增加副本

dn上增加了副本,需要在心跳时向NN同步,然后NN更改副本状态。
向NN汇报的块操作,最终会调用NN的BlockManager.addStoredBlock()方法。

  1. 首先维护块和DN之间的关系。BlockInfo信息
  2. 其次维护数据节点的块信息。 DatasetStorageInfo信息
  3. 数据块(Block)具有状态,如果副本块的状态是Complete,调用complete方法修改数据块状态。
  4. 判断是否副本满足期望,如果不满足那么修改updateneedReplicas队列
  5. 判断是超出了副本数,超出的副本放到excessReplicaMap队列。
  6. 删除损坏的副本

删除数据块

  1. INode中级联的找到所有的数据块
  2. 租约管理器删除Inode文件的租约
  3. deleteInternal删除所有的数据块
    删除数据块,其实就是遍历加入invalidateBlocks队列。其他队列中也删除该数据块。

删除副本

三种情况下可以删除副本

  1. 删除数据块
  2. 副本数过多时
  3. 副本被标识为损坏副本
    注意维护损坏副本的队列,corruptReplicas以及invalidateBlocks

数据块复制

needReplicatetions队列
三种情况下需要数据块复制

  1. 客户端完成写文件,副本数不足
  2. datanode撤销时
  3. pendingReplications任务超时
    在HDFS客户端删除副本,重置副本数,或者报告副本损坏时,会进行数据块复制操作。

元数据的汇报

块的存储关系是在内存中进行动态更新的。底层依赖dn向nn进行汇报。
dn向nn汇报共有三种方式。

全量块汇报

何时汇报
启动时进行一次,定期默认6h进行一次
如何统计
Datanode上的数据结构进行统计。FsVolume中存储了所有的块信息。
如何汇报
Datanode的BPServiceActor进行汇报
NN响应汇报,分为两种,第一次和其他。
如何响应
NN第一次响应,对比NN内存中的块和DN汇报的块,以及块的不同状态,从而同步到不同的状态队列(忽略掉NN中不存在的)。

这时候内存中加载的应该仅仅是BlockId

普通块汇报

NN处理心跳,将不同的块汇报分到5中不同的队列中进行处理
什么队列

  1. toADD
  2. toRemove
    副本不存在
  3. toInvalidate
    块不存在
  4. toCorrupt
  5. toUC
    构建中的块
    谁处理队列
    NN调用reportDiff方法,对比内存中和块汇报的副本状态

增量块汇报

何时汇报
默认300s进行一次汇报
增加数据块
调用addBlock方法
删除数据块
调用removeStorageBlock方法,修改数据块和节点的映射关系
增加副本
修改datanodeDescriptor上面BlockScheuler计数
移除pendingReplications请求
处理副本为提交状态的数据块副本

小结

Block具有状态,NN维护数据块和数据节点以及数据块和文件系统的关系。(最终目的是维护数据块和DN汇报的一致性)
NN通过不同的队列来维护数据块的不同状态。
数据块的复制是使用了两个线程处理不同的队列,复制队列和超时队列。
数据块的删除也是维护一个删除队列。BlockManager处理。
数据块具有不同的汇报方式,NN得到汇报之后,进行数据块的具体操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_284851.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端自动化测试之葵花宝典

作者:京东零售 杜兴文 首先聊一下概念,Web 前端自动化测试是一种通过编写代码来自动化执行 Web 应用程序的测试任务的方法,它通常使用 JavaScript 和测试框架 (如 Selenium、Appium 等) 来实现。 Web 前端自动化测试的优点是可以提高测试效…

微服务+springcloud+springcloud alibaba学习笔记【基础知识+各个组件介绍+聚合父工程创建】(1/9)

微服务springcloudspringcloud alibaba学习笔记 1/91、微服务简介1.1 微服务的自动化部署(CI /CD)(持续集成 持续交付)1.2 服务集中化管理1.3 分布式架构1.4 熔断机制 Hystri2、SpringCloud 简介2.1 SpringCloud 版本对应关系2.2 SpringCloud…

Node.js安装与配置(详细步骤)

前言 本篇博文记录了Node.js安装与环境变量配置的详细步骤,旨在为将来再次配置Node.js时提供指导方法。 另外:Node.js版本请根据自身系统选择,安装位置、全局模块存放位置和环境变量应根据自身实际情况进行更改。 Node.js安装与配置 一、…

windows命令执行的几种绕过方法

windows命令执行的几种绕过方法介绍1、添加特殊符号2、定义变量3、切割字符串4、逻辑运算符在绕过中的作用5、利用for循环拼接命令介绍 反检测、反清理,是红队攻击中的重中之重,本文详细描述了几种windows执行命令的几种绕过手法。 1、添加特殊符号 w…

【 Spring MVC 核心功能(一) - 使用注解实现 URL 路由映射】

文章目录引言一、RequestMapping 注解介绍1.1 RequestMapping 是 post 还是 get 请求?1.2 RequestMapping 指定一种请求方式二、GetMapping三、PostMapping四、总结引言 前面我们讲到,学习 Spring MVC 需要掌握三个核心功能即连接,获取参数&…

webgl-attribute、uniform、varying三者的区别

通用js: let canvas document.getElementById(webgl) canvas.width window.innerWidth canvas.height window.innerHeight let ctx canvas.getContext(webgl) attribute: 范围: 只适用于vertexShader,将js代码中的数据传递给vertexShader。 使用方…

软考-套接字(scoket)

💤SocketSocket套接字:是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。将OSI模型中从传输层到物理层封装起来的抽象层,把网络协议隐藏在Socket抽象层中,只对使用者暴露API接口&#xff0c…

DDoS攻击实验笔记

DoS&DDoS简介 DoS(Denial of Service),拒绝服务攻击是通过一些方法影响服务的可用性,比如早期主要基于系统和应用程序的漏洞,只需要几个请求或数据包就能导致长时间的服务不可用,但易被入侵检测系统发现。 DDoS(Distributed D…

Mysql通过行表中的行数据筛选主表数据

有订单头表和订单行表。筛选出行表中包含某些商品的头表 文章目录1. 示例表test_ordertest_order_line2. 实现EXISTS(推荐)内联1. 示例表 test_order test_order_line 2. 实现 EXISTS(推荐) 优点: 使用内联,主表字段很多的情况下,需要写越…

人员跌倒识别检测系统 yolov7

人员跌倒识别检测系统通过PythonYOLO7网络模型算法,人员跌倒识别检测算法模型对现场画面中有人员倒地摔倒行为实时分析预警,发现则立即抓拍存档告警同步提醒后台值班人员及时处理。YOLOv7 的发展方向与当前主流的实时目标检测器不同,研究团队…

LabVIEW实现ST-Link自动烧录单片机

目录 1、添加CLI到系统环境变量中 2、查询ST-Link/V2烧录器信息 3、连接待烧录的MCU芯片 4、下载固件到Flash 5、可能会使用的命令 5.1、-Rst 5.2、-ME 5.3、-SE 6、封装好的LabVIEW库 在讲解LabVIEW实现ST-Link自动烧录之前先聊一聊ST官方提供一款专用的Flash烧录工具…

《华为机试》——查找两个字符串a,b中的最长公共子串

本期给大家带来的是 华为机试题库 关于 查找两个字符串a,b中的最长公共子串 的讲解。首先,我们还是先从题目入手进行分析思考!!! 题目如下 :👇 查找两个字符串a,b中的最长公共子串。若有多个,输…

正则化的基本认识

正则化(一) 拟合与欠拟合(二) 正则化的目的(三) 惩罚项(3.1)常用的惩罚项:(3.2)L-P范数:(3.3)L1与L2的选择:(一) 拟合与欠拟合 欠拟合: 是指测试级与训练集都…

IDEA集成Git、GitHub、Gitee

一、IDEA 集成 Git 1.1、配置 Git 忽略文件 为什么要忽略他们? 与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。 怎么忽略? 创建忽略规则文件 xxxx.ignore(前缀名随便起&#xff0c…

〖Python网络爬虫实战⑫〗- XPATH语法介绍

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费…

java 通过 spring 官网创建springboot项目

文章java简单一写一个springboot入门案例带大家用idea工具工具创建了一个springboot简单的小案例 但有时 我们idea如果连不上网 就会有点问题 我们可以采用另一种创建方式 但这里的前提肯定就是 你的计算机是要有网的 然后访问 https://spring.io/ 打开spring的官网 在 Project…

SpringBoot基础使用

SpringBoot基础使用1.SpringBoot简介2.SpringBoot项目创建3.RESTful Web 服务4.SpringBoot 实现WebMvcConfigurer拦截器4.1 WebMvcConfigurer介绍4.2 WebMvcConfigurer接口常用方法4.3 WebMvcConfigurer拦截器5.SpringBoot常用注解总结6.SpringBoot异常处理6.1 使用 Controller…

Zeppelin框架及Hive查询操作

1)、介绍 Apache Zeppelin是一款基于Web交互式框架,支持多种语言,Scala、SparkSQL、Markdown,SQL、Shell、Python等。 Zeppelin提供数据分析、数据可视化。 可以使用Zeppelin链接SparkSQL Zeppelin安装和使用 1)、…

JVM性能调优简介

一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参…

Hive查询语句

目录 1.1 基础语法 1.2 基本查询(Select…From) 1.2.1 数据准备 1.2.2 全表和特定列查询 1.2.3 列别名 1.2.4 Limit语句 1.2.5 Where语句 1.2.6 关系运算函数 1.2.7 逻辑运算函数 1.3 分组 1.3.1 Group By语句 1.3.2 Having语句 1.4 Join语句…