【大数据Hadoop】HDFS3.3.1-Namenode-缓存管理

news2024/9/24 13:21:24

缓存管理

  • 前言
  • 缓存概念
    • HDFS 集中式缓存有两个主要概念。
    • 缓存管理命令
    • HDFS 集中式缓存架构
    • CacheManager 类实现
    • CacheReplicationMonitor

前言

Hadoop 2.3.0 版本新增了集中式缓存管理(Centralized Cache Management)功能,允许用户将一些文件和目录保存到HDFS缓存中。HDFS集中式缓存是由分布在 Datanode 上的堆外内存组成的,并且由Namenode 统一管理

添加集中式缓存功能的 HDFS 集群具有以下显著的优势。

  • 阻止了频繁使用的数据从内存中清除。
  • 因为集中式缓存是由 Namenode 统一管理的,所以 HDFS 客户端可以根据数据块的缓存情况调度任务,从而提高了数据块的读性能。
  • 数据块被 Datanode 缓存后,客户端就可以使用一个新的更高效的零拷贝机制读取数据块。因为数据块被缓存时已经执行了校验操作,所以使用零拷贝读取数据块的客户端不会有读取开销。
  • 可以提高集群的内存利用率。当 Datanode 使用操作系统的 buffer 缓存数据块时,对一个块的重复读会导致该块的 N个副本全部被送入操作系统的 buffer 中。而使用集中式缓存时,用户可以锁定这N个副本中的M个,从而节约了 N-M的内存。

本节首先介绍 HDFS 集中式缓存的概念、架构,然后介绍 Namenode 中负责管理缓存的组件 CacheManager 以及 CacheReplicationMonitor的实现.

缓存概念

HDFS 集中式缓存有两个主要概念。

  • 缓存指令Cache Directive):一条缓存指令定义了一个要被缓存的路径(path)。这些路径可以是文件夹或文件。需要注意的是,文件夹的缓存是非递归的,只有在文件夹第一层列出的文件才会被缓存。文件夹也可以指定额外的参数,比如缓存副本因子(replication)、有效期等。缓存副本因子设置了路径的缓存副本数,如果多个缓存指令指向同一个文件,那么就用最大缓存副本因子。

  • 缓存池(Cahce Pool:缓存池是一个管理单元,是管理缓存指令的组。缀存池拥有类似 UNIX 的权限,可以限制哪个用户和组可以访问该缓存池。缓存池也可以用于资源管理。它可以设置一个最大限制值,限制写入缓存池中指令的字节数。

缓存管理命令

HDFS 为管理员和用户提供了 “hdfs cacheadmin” 命令管理集中式缓存,包括缓存指令控制和缓存池控制两个部分。

  • 缓存指令控制:管理员可以调用 hafs cacheadmin -addDirective 命令缓存指定路径:调用 hdfs cacheadmin -removeDirective 命令删除指定 id 对应的缓存;调用 hdfs cacheadmin -removeDirectives 命令删除指定路径的缓存:调用 hdfs cacheadmin -listDirectives 命令显示当前所有的缓存。由于篇幅原因,这里就不列出所有命令的参数了。

  • 缓存池控制:管理员可以调用 hdfs cacheadmin -addPool 命令创建一个缓存池;调用 hdfs cacheadmin -modifyPool 命令修改一个缓存池的配置:调用hdfs cacheadmin -removePool 命令删除一个缓存池。

HDFS 集中式缓存架构

在这里插入图片描述

如图所示,用户可以通过 hdfs cacheadmin 命令或者 HDFS API 向 Namenode 发送缓存指令(Cache Directive), Namenode 的 CacheManager 类会将缓存指令保存到内存的指定数据结构(CacheManager 的 directivesBylddirectivesByPath 字段)中,同时在 fsimageeditlog 文件中记录该绶存指令。之后 Namenode 的 CacheReplicationMonitor 类会周期性扫描命名空间和活跃的缓存指令,以确定需要缓存或删除缓存的数据块,并向 Datanode 分配缓存任务。

Namenode 还负贵管理集群中所有 Datanode 的堆外缓存,Datanode 会周期性向 Namenode 发送缓存报告,而 Namenode 会通过心跳响应向 Datanode 下发缓存指令(添加缓存或者删除缓存)。

DFSClient 读取数据块时会向 Namenode 发送 ClientProtocol.getBlockLocations 请求获取数据块的位置信息,Namenode 除了返回数据块的位置信息外,还会返回该数据块的缓存信息, 这样 DFSClient 就可以执行本地零拷贝读取缓存数据块了,从而提高了读取效率。

CacheManager 类实现

CacheManager 类是 Namenode 管理集中式缓存的核心组件,它管理着分布在 HDFS 集群中 Datanode 上的所有缓存数据块,同时负责响应 hdfs cacheadmin 命令或者 HDFS API发送的缓存管理命令(请参考缓存管理命令小节)。

CacheManager 定义了以下字段。

  • directivesByld: 以缓存指令id为 key,保存所有的缓存指令。
  • direetivesByPath:以路径为 key,保存所有的缓存指令。
  • cachePools:以缓存池名称为 key,保存所有的缓存池。
  • monitor: CacheReplicationMonitor 对象,负责扫描命名空间和活跃的缓存指令,以确定需要缓存或删除缓存的数据块,并向 Datanode 分配缓存任务。

客户端会调用 ClientProtocol.addCachePool() 方法创建一个缓存池,NameNodeRpcServer 接收了这个请求后,会将创建缓存池请求的参数封装到一个 CachePoollnfo 对象中(包括 owner、 group、 mode、 limit、 max Ttl 等参数),然后调用 CacheManager.addCachePool() 方法响应这个请求。CacheManager.addCachePool() 方法首先会验证请求参数(info 变量保存)是否合法,然后检查 CacheManager.cachePools 集合中是否已己经保存了这个缓存池。如果 CacheManager 中没有这个缓存池的信息,则调用 CachePool.ereate FromlnfoAndDefaults() 方法根据请求参数创建一个新的 CachePool 对象。createFromlnfoAndDefaults() 方法会将请求中没有设置的参数用默认值补齐,然后构造 CachePool 对象。成功创建 CachePool 对象后,addCachePool() 方法会将 CachePool 对象放入 cachePools 字段中保存。至此,添加缓存池的操作完成。

CacheManager.addCachePool() 方法的代码如下:

成功地创建了缓存池之后,客户端就会调用 ClientProtocol.adaCacheDirective() 方法将一个路径添加到缓存中。NameNodeRpeServer 接收了这个请求后,会将创建缓存请求的参数封装到一个 CacheDirectivelnfo 对象中,然后调用 CacheManager.addlnternal() 方法响应这个请求。
如下代码所示,CacheManager.addinternal() 会将缓存指令对象加入 directivesByld 以及 directivesByPath 集合中保存,然后更新缓存池的统计信息。之后 addinternal() 方法会调用 setNeedsRescan() 方法触发 CacheReplicationMonitor 执行 rescan() 操作。

可以看到,addInternal() 方法只是更新了 Cache ManagerdirectivesBylddirectivesByPath 以及 cachePools 等字段维护的缓存信息,之后并没有对 Datanode 下发任何缓存指令(添加、 删除缓存),而是调用 setNeedsRescan 方法触发 CacheReplicationMonitor 执行绶存操作。我们在下一节介绍 CacheReplicationMonitor 的实现。

CacheReplicationMonitor

CacheReplicationMonitor 是一个线程类,它会在 Namenode 启动时以及以固定的间隔扫描命名空间和活跃的缓存指令,以确定需要缓存或删除缓存的数据块,之后向 Datanode 下发缓存指令(这里的间隔是由 dfs.namenode.path.based.cache.refresh.interval.ms 配置项配置的,默认为30秒)。

CacheReplicationMonitor 会循环调用 rescan() 方法执行扫描逻辑,rescan() 方法的代码如下所示,它会调用 rescanCacheDirectives() 方法遍历所有的缓存指令(存储在 CacheManager.

directivesByPath 字段中),并将绶存指令路径中包含的数据块加入到 CacheReplicationMonitor.

cachedBlocks 集合中等待进一步操作。之后 rescan() 方法会调用 rescanCachedBlockMap() 遍历 CacheReplicationMonitor.cachedBlocks 集合,判断这些数据块是执行 cache 操作还是 uncache 操作。对于需要执行 cache 操作的数据块,rescanCachedBlockMap() 会调用CacheReplicationMonitor.addNewPendingCached() 方法为每个等待 cache 的数据块选择一个合适的 Datanode(从保存了该数据块副本的所有 Datanode 中挑选一个可用内存最多的),之后将该数据块加入该 Datanode 对应的 DatanodeDescriptor 对象的 pendingCached 列表中。而对于需要执行 uncache 操作的数据块,rescanCachedBlockMap() 会调用 CacheReplicationMonitor.

addNewPendingUncached() 方法从缓存了该数据块的 Datanode 中随机选出一个节点执行 uncache 操作,也就是将数据块加入该 Datanode 对应的 DatanodeDescriptor 对象的 pendingUncached 列表中。

将数据块加入 DatanodeDescriptorpendingCachedpendingUncached 列表中后, Namenode 就会在心跳处理流程中生成名字节点指令(请参考数据节点管理的名字节点指令生成小节),并通过心跳响应发送给 Datanode。Datanode 接受指令之后,会执行缓存以及删除缓存操作(请参考第4 章的 FSDatasetlmpl 小节)。至此,Namenode 端处理缓存数据块的逻辑就结束了。DFSClient 通过零拷贝模式读取缓存数据块的实现,请读者参考第5章的零拷贝读取相关小节。

本文内容结合自 《Hadoop 2.X HDFS 源码剖析》以及自己的理解

希望对正在查看文章的您有所帮助,记得关注、评论、收藏,谢谢您

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字滤波器设计——FIR 滤波器

数字滤波器设计实践介绍 此示例说明如何使用 Signal Processing Toolbox 产品中的 designfilt 函数,根据频率响应设定设计 FIR 和 IIR 滤波器。该示例重点讲述低通滤波器,但大多数结果也适用于其他响应类型。 此示例主要介绍数字滤波器的设计&#xff…

MATLAB | 如何用MATLAB如何绘制各式各样精致的三元相图(ternary plot)

整了个大活,写了一个能够生成非常精致三元相图的函数,这种图主要用于展示三种变量之间的比例,本期实验绘制效果如下: 编写不易,这个工具写的脑壳痛,求多多点赞,依旧先介绍咋使用,工具…

嵌入式软件架构

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录1 嵌入式软件分类 – BAREMETAL2 嵌入式软件分类 – 实时操作系统 (RTOS)3 嵌入式软件分类 – “通用”操作系统4 嵌入式软件分类 – 容器/微服务微服务容器5 嵌…

入行 4 年,跳槽 2 次,我摸透了软件测试这一行

最近几年行业在如火如荼的发展壮大,以及其他传统公司都需要大批量的软件测试人员,但是20年的疫情导致大规模裁员,让人觉得行业寒冬已来,软件测试人员的职业规划值得我们深度思考。 大家都比较看好软件测试行业,只是因为…

python入门(四)python眼里的图像

文章目录背景一.搭建jupyter环境Jupyter 是什么:安装Jupyter Lab1: cmd中找到 anaconda powershell prompt2.切换到python3.8环境中3. 安装Jupyter4. 运行jupyter-lab5. 备注6.命令练习二.图像的本质背景 本人工作中,用到了ai相关技术,但是java出身&…

CNStack 云服务云组件:打造丰富的云原生技术中台生态

作者:刘裕惺 CNStack 相关阅读: CNStack 多集群服务:基于OCM 打造完善的集群管理能力 CNStack 虚拟化服务:实现虚拟机和容器资源的共池管理 CNStack 云边协同平台:实现原生边缘竟能如此简单 01 前言 CNStack 2.0…

Linux网络IO精华指南

在互联网中提起网络,我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现,脱离不了网络 IO 的选择,因此本文作为一篇个人学习的笔记,特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型。 1.网…

小说情感倾向分析工具

目前有很多中英文小说情感倾向工具,以下是一些常用的工具: 情感分析工具:可以对文本进行情感识别,根据文本中包含的情感信息,将其转化成情感值,通常有积极情感值、消极情感值、中性情感值等,常…

Vue3.0的生命周期

要说清这个生命周期钩子,首先我们要通过一个实例来讲解 就是点击这个按钮来切换Demo组件的显示隐藏,当然它也疯狂的操作Demo的挂载,卸载 红色是卸载流程,蓝色是挂载流程 我们写在外面可以实现,但是v3的思想是组合api因…

树状数组与线段树的应用

一、树状数组 树状数组给人的感觉就像,一直在维护前缀和一样,只是加快了前缀和的速度,再用前缀和结合题目得出一些性质,从而去解题。(一些不成熟的看法) 基础知识(一般树状数组用来处理单点修…

含氢微网优化调度模型matlab

目录 1 主要内容 模型示意图 目标函数 2 部分程序 3 程序结果 4 下载链接 1 主要内容 最近咨询含氢微网优化调度模型的同学较多,本次就分享一个高质量的源码资源。该程序方法复现《Simulation of design and operation of hydrogen energy utilization syste…

ssm拦截器

ssm拦截器 #: 与之前的过滤器不一样,过滤器是指在servlet中的,而拦截器是属于SpringMVC的,可以对请求的数据进行提前操作和后置操作: 先自己创建一个拦截器Interception类(其实人家真名叫Interceptor&…

flutter dart中用ffi调用golang或C的动态链接库

本文介绍从dart中,通过ffi方式调用golang生成的动态链接库。 go/lib.go package mainimport "C"//export GetKey func GetKey() *C.char {theKey : "123-456-789"return C.CString(theKey) }func main() {}cd go go build -buildmodec-shared…

高通QSSI方式导致CI编译失败问题记录

一、问题背景 1、QSSI说明 QSSI 是 Qualcomm Single System Image 的缩写,高通平台从Android Q开始,为了解决Android碎片化问题,把system.img和vendor.img进一步拆分,增加了QSSI编译选项,QSSI就是用来编译system.img的…

数据结构(ArrayList)

文章目录一、线性表二、顺序表2.1 ArrayList(1)概念(2)ArrayList 的构造(3)ArrayList 的方法(4) ArrayList的遍历(5)ArrayList的优缺点2.2 链表一、线性表 概…

symmetric funtion and antisymmetric function(对称性函数和反对称性函数)

symmetric funtion and antisymmetric functionantisymmetric functionsymmetric funtion附录今天看资料的时候遇到了一个说法,文中提及,f(x)f\left(x\right)f(x) 是一个 antisymmetric function,看到这个说法有点儿懵,这里特来记…

上海亚商投顾:沪指逼近3400点 CPO概念股再度爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪沪指今日震荡反弹,午后逼近3400点关口,创业板指则小幅调整。CPO概念股再度爆发,…

[oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum

python 历史 回忆上次内容 颜文字是kaomoji 把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme 虚拟的表情也在真实世界有巨大影响 一步步地影响 字符编码就是这样一步步发展过来的python也是 一步步 发展到今天的 python究竟是 怎么发展的呢&…

异常(throwable)

异常 异常分类 (1)Throwable类 所有的异常类型都是它的子类,它派生两个子类Error、Exception。 (2)Error类 表示仅靠程序本身无法恢复的严重错误(内存溢出动态链接失败、虚拟机错误)&#…

分布式定时任务

本文引用了谷粒商城的课程 定时任务 定时任务是我们系统里面经常要用到的一些功能。如每天的支付订单要与支付宝进行对账操作、每个月定期进行财务汇总、在服务空闲时定时统计当天所有信息数据等。 定时任务有个非常流行的框架Quartz和Java原生API的Timer类。Spring框架也可以…