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

说明

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得到汇报之后,进行数据块的具体操作。

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

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

相关文章

OpenAI-ChatGPT最新官方接口《AI绘图》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(三)(附源码)

ChatGPT-AI绘图Image generation Beta 图片生成前言IntroductionUsageGenerationsEdits 编辑VariationsLanguage-specific tips 特定语言提示Python 语言Using in-memory image data 使用内存中的图像数据Operating on image data 操作图像数据Error handlingNode.js 语言Using…

CSDN博客写作编辑器如何使用?

文章目录0、引言1、快捷键2、文字3、链接和代码4、注脚和注释5、公式6、表7、图0、引言 笔者阅读CSDN博客已有五年,从最初的学习跟随者,到现在的CSDN博客创造者,这其中的转变来源于自身发展的思考,有学的输入,又有创作…

手撕Twitter推荐算法

Twitter近期开源了其推荐系统源码[1,2,3],截止现在已经接近36k star。但网上公开的文章都是blog[1]直译,很拗口,因此特地开个系列系统分享下。系列涵盖: Twitter整体推荐系统架构:涵盖图数据挖掘、召回、精排、规则多…

Python人工智能在气象中的实践技术应用

当今从事气象及其周边相关领域的人员,常会涉及气象数值模式及其数据处理,无论是作为业务预报的手段、还是作为科研工具,掌握气象数值模式与高效前后处理语言是一件非常重要的技能。WRF作为中尺度气象数值模式的佼佼者,模式功能齐全…

没有你 万般精彩皆枉然

​​没有你,万般精彩皆枉然。你,是栖息在某人心头之人,更是每一个无可替代的它。万物皆有灵,在不曾踟蹰的千里足迹下,觅得到;在大自然作家笔端浮游的辞藻间,看得透。 《没有你 万般精彩皆枉然》…

ESP32设备驱动-MAX30102脉搏血氧饱和度和心率监测传感器驱动

MAX30102脉搏血氧饱和度和心率监测传感器驱动 文章目录 MAX30102脉搏血氧饱和度和心率监测传感器驱动1、MAX30102介绍2、硬件准备3、软件准备4、驱动实现1、MAX30102介绍 MAX30102是一款集成脉搏血氧饱和度和心率监测生物传感器模块。 它包括内部 LED、光电探测器、光学元件和…

让你的three.js动起来

让你的three.js动起来 简介 本节主要是给实例添加动画效果,以及加了一些小插件用以实现帧率检测、gui可视化配置、动态监听屏幕大小变化刷新和鼠标操控功能。 引入的插件js: three.jsdat.gui.jsStats.jsTrackballControls.js 实际效果: …

Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU

概述 Redis高可用高性能缓存的应用系列的第3篇,主要介绍Redis缓存过期淘汰策略和内存淘汰策略回收的LRU和LFU的知识点进行说明。 Redis过期键删除策略 Redis设置key时,都会设置一个过期时间,那么当过期时间到了都是怎么处理的?…

不用但一定要懂 ---- iOS 之 响应链、传递链 与 手势识别

iOS 事件的主要由:响应连 和 传递链 构成。一般事件先通过传递链,传递下去。响应链,如果上层不能响应,那么一层一层通过响应链找到能响应的UIResponse。 响应链:由最基础的view向系统传递,first view ->…

初谈 ChatGPT

引子 最近,小编发现互联网中的大 V 突然都在用 ChatGPT 做宣传:“ChatGPT不会淘汰你,能驾驭ChatGPT的人会淘汰你”、“带领一小部分人先驾驭ChatGPT”。 确实,ChatGPT这个新生事物,如今被视为蒸汽机、电脑、iPhone 般的…

EfficientNet V2

目录 1. EfficientNet V1存在的问题 2. EfficientNet V2 的亮点 3. EfficientNet V2 网络架构 1. EfficientNet V1存在的问题 针对EfficientNet V1 ,作者提出了以下的三个缺点 当训练图像的size很大时,网络中传递的特征图尺寸就会很大,这…

(链表专题) 234. 回文链表——【Leetcode每日一题】

234. 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: 输入&…

Vue:组件化开发

一、组件的使用 1、创建组件(结构HTML 交互JS 样式CSS) Vue.extend({该配置项和new Vue的配置项几乎相同,略有差别}) 区别:①创建vue组件的时候,配置项中不能使用el配置项。(但是需要使用template配置项来配置模板语句) ②配置项中的da…

黑马程序员微服务技术栈教程 - 1. SpringCloud 微服务治理

教程链接:https://www.bilibili.com/video/BV1LQ4y127n4 黑马的资料下载链接:https://pan.baidu.com/s/1zRmwSvSvoDkWh0-MynwERA&pwd1234 目录认识微服务单体架构分布式架构微服务微服务结构微服务技术对比SpringCloud总结 🎀服务拆分及远…

实时翻译器-实时自动翻译器

自动翻译器——让语言不再是障碍。 在当今全球化的背景下,语言已不再是跨文化交流的障碍。而自动翻译技术作为突破语言壁垒的有效手段,越来越受到关注和需求。我们的自动翻译器就是一个高效、准确的翻译工具,它能够根据用户输入的内容自动识…

【DS】河南省第十三届ICPC大学生程序设计竞赛 J-甜甜圈

明天就要省赛了,感觉已经寄了捏 J-甜甜圈_河南省第十三届ICPC大学生程序设计竞赛(重现赛) (nowcoder.com) 题意: 思路: 直接模拟复杂度太高,因此考虑用DS优化 我们考虑用树状数组维护 在用线段树和树状…

MYSQL Row 752 was cut by GROUP_CONCAT()

因为group_concat有个最大长度的限制,GROUP_CONCAT函数返回的结果大小被MySQL默认限制为1024(字节)的长度。超过最大长度就会被截断掉 解决方法:更改配置文件,修改长度。 https://blog.csdn.net/zzddada/article/details/115082236 concat…

网络的基本概念

作者:爱塔居 专栏:JavaEE 作者简介:大三学生,希望和大家一起进步 文章简介:主要概述IP地址、端口号、协议、协议分层、封装、分用、客户端、服务器、请求、响应、两台主机之间的网络通信流程。 文章目录 目录 文章目录…

Yolo V7详解及openvino部署

论文: https://arxiv.org/abs/2207.02696 代码: https://github.com/WongKinYiu/yolov7 Anchor Anchor是一种用于目标检测的先验框(prior box)生成方法,由Ren等人在2015年提出。Anchor可以在不同尺度和不同纵横比下生成多个先验框,并通过与真实目标框的…

java equals和==的区别

目录一、equals1.前言2.重写equals方法二、三、equals和的区别一、equals 1.前言 **当用equals来比较两个引用数据类型时默认比较的是它们的地址值,比如创建两个成员变量完全相同对象A和对象B两个进行比较,比较的是两个对象的地址值是否相等&#xff0c…