HBase 源码阅读(四)HBase 关于LSM Tree的实现- MemStore

news2024/9/17 7:27:18

4. MemStore 接口

Memstore 的函数不能并行的被调用。调用者需要持有读写锁,这个的实现在HStore

我们放弃对MemStore中的诸多函数进行查看

直接看MemStore的实现类

  1. AbstractMemStore
  2. CompactingMemStore
  3. DefaultMemStore

4. 1 三个实现类的使用场景

1. AbstractMemStore

  • 角色: 基础抽象类
  • 作用:
    • AbstractMemStore是一个抽象基类,为HBase中的MemStore实现提供了基本的框架和公共功能。它定义了MemStore的核心操作,例如添加数据、获取数据、刷新数据等,但不具体实现这些操作的细节。
    • 它为子类提供了一些基础设施,例如管理内存中的数据结构、维护写入顺序和快照等。子类(如CompactingMemStoreDefaultMemStore)基于这些基础功能,添加自己的具体实现。
  • 总结: AbstractMemStoreMemStore实现的基类,它为不同类型的MemStore实现提供了公共的功能和结构。它本身并不直接被使用,而是作为其他MemStore实现的基础。

2. CompactingMemStore(常用的一种MemStore类型)

  • 角色: 带有内存压缩功能的MemStore
  • 作用:
    • CompactingMemStoreMemStore的一个实现,它在内存中实现了数据的压缩功能。内存压缩(Compaction)是一种优化技术,旨在减少内存占用和提高读性能。
    • 通过在内存中进行压缩,可以将多个冗余的版本合并,减少MemStore中的重复数据,从而降低内存的使用量。这有助于在数据写入频繁的情况下,减少内存压力并提高系统的整体性能。
    • 在数据被刷新到磁盘之前,CompactingMemStore会在内存中对数据进行部分整理,合并多个键值对的版本,删除过期的数据。这减少了写入HFile时的数据量,并在某种程度上提高了系统的读写性能。(我们不需要使用该类型)
  • 总结: CompactingMemStore通过在内存中执行部分压缩操作,优化了MemStore的内存使用和数据写入性能。它适用于需要处理大量写入操作并且希望优化内存占用的场景。

3. DefaultMemStore(基础实现)

  • 角色: 标准的MemStore实现
  • 作用:
    • DefaultMemStore是HBase中MemStore的标准实现。它提供了基本的数据存储功能,将写入的所有数据保存在内存中,直到这些数据被刷新到磁盘。
    • CompactingMemStore不同,DefaultMemStore没有内存中的压缩功能。它直接按照数据写入的顺序存储数据,当MemStore达到阈值或系统资源不足时,会将数据刷新到HFile。
    • DefaultMemStore适用于不需要内存压缩的场景,特别是在数据更新频率不高或内存充足的情况下。
  • 总结: DefaultMemStore是最基础的MemStore实现,适用于对性能和内存优化要求不高的场景。它提供了最直接的内存数据存储和管理方式

AbstractMemStore: 提供了MemStore实现的公共基础功能,是其他MemStore实现的基类。

CompactingMemStore: 实现了内存压缩功能,通过在内存中合并和整理数据,优化内存使用和系统性能。

DefaultMemStore: 标准的MemStore实现,提供了基础的数据存储功能,不包括内存压缩。适用于简单的数据存储需求。

4.2 系统如何指定自己所选择MemStore存储方式

在HBase中,可以通过配置文件或程序代码来指定所使用的MemStore存储方式。具体来说,你可以通过以下方式指定使用哪种MemStore实现:

1. 通过HBase配置文件配置

你可以在HBase的配置文件 hbase-site.xml 中指定使用的 MemStore 实现。配置文件中,相关的配置项是 hbase.regionserver.memstore.impl。以下是配置不同 MemStore 实现的示例:

  • 使用 DefaultMemStore(默认的 MemStore 实现):

    xml
    复制代码
    <property>
      <name>hbase.regionserver.memstore.impl</name>
      <value>org.apache.hadoop.hbase.regionserver.DefaultMemStore</value>
    </property>
    
  • 使用 CompactingMemStore(带内存压缩功能的 MemStore:

    xml
    复制代码
    <property>
      <name>hbase.regionserver.memstore.impl</name>
      <value>org.apache.hadoop.hbase.regionserver.CompactingMemStore</value>
    </property>
    
  • 使用自定义的 MemStore 实现: 如果你有一个自定义的 MemStore 实现,可以将其类的完全限定名配置在 hbase.regionserver.memstore.impl 中:

    xml
    复制代码
    <property>
      <name>hbase.regionserver.memstore.impl</name>
      <value>com.example.hbase.CustomMemStore</value>
    </property>
    

4.3 DefaultMemStore

MemStore 保存对 Store 的内存修改。修改是单元。当要求刷新时,当前的 memstore 会移动到快照并被清除。我们继续从新的 memstore 和备份快照中提供编辑,直到刷新器报告刷新成功。此时我们让快照继续运行。
MemStore 函数不应并行调用。调用者应持有写入和读取锁。这是在 HStore 中完成的。
TODO:当我们删除项目时调整 memstore 的大小,因为它们已被删除。TODO:使用新的 KVSLS,需要确保我们根据 KV 大小的差异更新 HeapSize。

4.4 CompactingMemStore

是否使用内存压缩要看自己业务的场景,我们不涉及对某个key键的连续更新

支持内存压缩的 memstore 实现。在活动集和快照数据结构之间添加了一个压缩管道;它由要压缩的段列表组成。与快照一样,所有管道段都是只读的;更新仅影响活动集。为了确保此属性,我们利用现有的阻止机制——活动集被推送到管道,同时将区域的 updatesLock 保持在独占模式。定期在后台对所有管道段应用压缩,从而产生单个只读组件。当没有扫描仪读取“旧”段时,将丢弃它们。

5. DefaultMemStore的调用!

这时候还需要去找DefaultMemStore的调用历程,DefaultMemStore 出了在其类中实现外,外部调用的位置为HStore类

6. HStore

1. 管理数据的存储与组织

  • 列族管理:
    • 在HBase中,每个表可以有多个列族,每个列族的数据被单独存储。HStore负责管理一个特定列族的数据。(这里可以测试一个列,多个列的分配地址,我们到底是怎么存储数据比较合适呢
    • 对于每个列族,HStore管理该列族的所有存储文件(HFile)和内存中的MemStore
  • 数据写入流程:
    • 当数据写入HBase时,首先会写入到内存中的MemStore
    • MemStore的数据量达到一定阈值时,数据会被刷新(flush)到磁盘上,生成一个新的HFile。
    • HStore负责管理这些HFile的生成和组织,并确保它们被正确地写入和读取。(真是文件的写入)

2. 管理HFile的生命周期

  • 合并与压缩(Compaction):

    • 随着数据不断地写入和刷新,HStore会生成多个HFile。如果不进行管理,这些HFile的数量可能会增加,影响查询性能。

    • HStore负责执行合并操作(Compaction),即将多个HFile合并成一个,以减少文件数量,优化读性能。

    • 合并操作有两种类型:

      Minor Compaction

      (小合并)和

      Major Compaction

      (大合并)。

      • Minor Compaction: 将少量小的HFile合并为一个较大的HFile,通常不会删除已删除的数据(tombstones)。
      • Major Compaction: 将所有的HFile合并为一个,并清除过期或已删除的数据。
  • 文件删除与清理:

    • 在合并过程中,旧的HFile会被废弃。HStore负责安全地删除这些不再使用的HFile,释放磁盘空间。

3. 数据读取与查询

  • 读取路径优化
    • 当客户端请求读取数据时,HStore会从内存中的MemStore和磁盘上的HFile中获取数据,并合并这些数据返回给客户端。
    • HStore负责管理这些数据源的优先级和读取顺序,确保查询操作高效执行。
  • 数据版本管理
    • HStore管理数据的多个版本(如果配置允许),可以根据查询的需求返回不同版本的数据。
    • 当进行读操作时,HStore会合并来自MemStore和HFile的不同版本的数据,并根据查询的条件返回正确的结果。

4. 参与一致性与恢复机制

  • 参与事务管理
    • HBase支持简单的事务操作,例如原子增量、检查并设置(Check and Set)等。HStore在这些操作中,负责确保数据的一致性。
  • 恢复机制
    • 在系统崩溃或重启时,HStore参与数据的恢复操作,确保数据的一致性和完整性。

5. MemStore与HFile的桥梁

  • HStore
    

    在内存中的

    MemStore
    

    和持久化存储的HFile之间充当桥梁:

    • 数据刷新(Flush): 当MemStore满了时,HStore负责将MemStore中的数据持久化到HFile中。
    • 读写均衡: HStore既要确保高效的写入(通过MemStore),也要确保高效的读取(通过合并和索引),在读写之间找到平衡。

6.2 这时候去找HStore 的写入数据流程

  1. 写一下随机生成数据插入数据的代码,每三秒插入一批数据 ✅
  2. 找一下HStore 写入到MemStore的代码

7. HStore 写入MemStore

7.1 add方法

  public void add(final Iterable<Cell> cells, MemStoreSizing memstoreSizing) {
    lock.readLock().lock();
    try {
      if (this.currentParallelPutCount.getAndIncrement() > this.parallelPutCountPrintThreshold) {
        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +
            "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());
      }
      memstore.add(cells, memstoreSizing);
    } finally {
      lock.readLock().unlock();
      currentParallelPutCount.decrementAndGet();
    }
  }

此时就设计另一个问题,MemStore如何Flush 刷新到磁盘的呢

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

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

相关文章

Hive中的分区表与分桶表详解

目录 分区表和分桶表 分区表 分区表基本语法 1. 创建分区表 2. 分区表读写数据 1&#xff09;写数据 &#xff08;1&#xff09;LOAD &#xff08;2&#xff09;INSERT 2&#xff09;读数据 3. 分区表基本操作 1&#xff09;查看所有分区信息 2&#xff09;增加分区 …

数据库MySQL零基础-下【详细】

目录 六、事务/视图/触发器/存储过程 1、事务的理解 &#xff08;1&#xff09;事务的理解 &#xff08;2&#xff09;事务的特性 2、事务的应用 &#xff08;1&#xff09;事务的开启与提交 # 语法 # 示例 &#xff08;2&#xff09;开启autocommit&#xff08;临时生…

MybatisPlus静态工具 通用枚举

静态工具 有的时候Service之间也会相互调用&#xff0c;为了避免出现循环依赖问题&#xff0c;MybatisPlus提供一个静态工具类&#xff1a;Db&#xff0c;其中的一些静态方法与IService中方法签名基本一致&#xff0c;就在方法例多给出一个参数&#xff0c;操作的实体类类型。…

P3285 [SCOI2014] 方伯伯的OJ

*原题链接* 本题与NOIP2017列队有很多共通之处&#xff0c;都是一开始给我们一个排好编号的队列&#xff0c;然后进行一些操作。 如果n的范围不大&#xff0c;我们会如何做呢&#xff1f;很容易想到权值线段树&#xff0c;以编号为下标建立权值线段树&#xff0c;维护每个下标…

WEB攻防-ASP安全MDB下载植入IIS短文件名写权限解析

知识点&#xff1a; 1、ASP环境搭建组合&#xff1b; 2、ASP-数据库下载&植入&#xff1b; 3、IIS-短文件&解析&写权限&#xff1b; WEB安全攻防 1、web源码&#xff1b; 2、开发语言&#xff1b; 3、中间件平台&#xff1b; 4、数据库类型&#xff1b; 5、…

百度快照劫持之JS劫持诊断与恢复一例

劫持现象&#xff1a; 百度搜索结果中&#xff0c;被劫持网站出现在搜索结果中&#xff0c; 点击进入网站&#xff0c;网站显示正常&#xff0c;数秒后网站自动跳转到彩票网站f51688.com/ff6/。但是第二次点击搜索结果&#xff0c;正常进入网站缺不会跳转到彩票网站。 初步认…

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理&#xff0c;打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名…

GO语言快速入门(比较乱)

一、环境安装 1、安装Go环境 1、官网下载 2、cmd-->go version 3、环境变量 GOROOT&#xff1a;go安装路径 GOPATH&#xff1a;go存放代码的路径 4、GOWorks新建三个文件 5、go env查看配置 2、安装编辑器 GoLand或者VSCode 3、HelloWorld package main //一个程序只有一个…

设计模式学习[5]---装饰模式

文章目录 前言1. 原理阐述2. 举例2.1 人装饰方案一2.2 人装饰方案二2.3 人装饰方案三 总结 前言 近期在给一个已有的功能拓展新功能时&#xff0c;基于原有的设计类图进行讨论。其中涉及到了装饰模式&#xff0c;因为书本很早已经看过一遍&#xff0c;所以谈及到这个名词的时候…

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统&#xff0c;并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址&#xff08;Addressable&#xff09;时&#xff0c;您可以使用该资源的地址从任何地方加载它。无论资源是在…

php转职golang第二期

以下是一份简单的 Go 基本语法笔记&#xff1a; 变量与常量&#xff1a; • var 声明变量。• const 声明常量。数据类型&#xff1a; • 整型、浮点型、布尔型、字符串型等。流程控制&#xff1a; • if-else 语句。• for 循环。函数&#xff1a; • 定义和调用函数。数…

【Hot100】LeetCode—394. 字符串解码

目录 1- 思路栈实现四种情况处理 2- 实现⭐394. 字符串解码——题解思路 3- ACM 实现 原题链接&#xff1a;394. 字符串解码 1- 思路 栈实现四种情况处理 ① 遇到数字&#xff0c;进行倍数相加 、②遇到左括号&#xff0c;压栈之前的元素、③遇到右括号弹出&#xff0c;栈进行…

DFS 算法:洛谷B3625迷宫寻路

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation&#xff08;属性编辑&#xff09;、disentanglement&#xff08;解纠缠&#xff09;常用的两种做法&#xff1a;线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中&#xff0c;有一种非常简单的方法来引导G向某个方向进行生成&…

【Android】使用和风天气API获取天气数据吧!(天气预报系列之一)

【Android】使用和风天气API获取天气数据吧&#xff01;&#xff08;天气预报系列之一&#xff09; 古话说得好&#xff0c;要有天气预报&#xff0c;首先需要有天气&#xff0c;和预报。 今天给大家介绍一个好用的天气预报API&#xff1a;和风天气。以及webAPI的使用方法~&a…

【H2O2|全栈】关于HTML(3)HTML基础(二)

HTML相关知识 目录 HTML相关知识 前言 准备工作 标签的具体分类&#xff08;二&#xff09; 本文中的标签在什么位置使用&#xff1f; 本期前置知识点 超文本 超文本引用和源属性 图片标签 锚链接 iframe 锚点 预告和回顾 后话 前言 本系列博客将分享HTML相关…

JavaWeb后端开发总结(3)

AOP基础 AOP概述 首先我们要知道AOP是什么&#xff1f; 看下图 个人解析&#xff1a; AOP叫做面向切面编程&#xff0c;但是实际上就是面向方法编程 图中下面一部分是一个AOP的案例 AOP快速入门案例代码实现 案例&#xff1a;测出业务中各个业务方法所需的执行时间 如果…

怎么利用NodeJS发送视频短信

随着5G时代的来临&#xff0c;企业的数字化转型步伐日益加快&#xff0c;视频短信作为新兴的数字营销工具&#xff0c;正逐步展现出其大的潜力。视频群发短信以其独特的形式和内容&#xff0c;将图片、文字、视频、声音融为一体&#xff0c;为用户带来全新的直观感受&#xff0…

单片机DMA原理及应用详解(上篇)(附工程源码)

这篇文章详细介绍单片机的DMA原理和应用范例。希望我的分享能给你带来不一样的收获&#xff01; 目录 一、DMA简介 二、DMA原理 三、DMA中断 1. DMA中断的工作原理 2. DMA中断的优点 3. DMA中断的配置和处理 4. 应用场景 四、结语 一、DMA简介 1、DMA&#xff08;D…

数据分析训练模型后输出模型评估报告

数据分析训练模型后输出模型评估报告 1、模型评估指标 1.1、概念: A:n个正样本,检测到是真值的数量 B:m个负样本,检测到是真值的数量 C:n个正样本,检测到假值的数量 D:m个负样本,检测到假值的数量 1.2、准确率(Accuracy) 正确预测的样本数量与总样本数量的比值。…