LSM树由来、设计思想以及应用到HBase的索引

2023-11-13

讲LSM树之前,需要提下三种基本的存储引擎,这样才能清楚LSM树的由来

  • 哈希存储引擎  是哈希表的持久化实现,支持增、删、改以及随机读取操作,但不支持顺序扫描,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快,如果不需要有序的遍历数据,哈希表就是your Mr.Right
  • B树存储引擎是B树(关于B树的由来,数据结构以及应用场景可以看之前一篇博文)的持久化实现,不仅支持单条记录的增、删、读、改操作,还支持顺序扫描(B+树的叶子节点之间的指针),对应的存储系统就是关系数据库(Mysql等)。
  • LSM树(Log-Structured Merge Tree)存储引擎和B树存储引擎一样,同样支持增、删、读、改、顺序扫描操作。而且通过批量存储技术规避磁盘随机写入问题。当然凡事有利有弊,LSM树和B+树相比,LSM树牺牲了部分读性能,用来大幅提高写性能。

通过以上的分析,应该知道LSM树的由来了,LSM树的设计思想非常朴素:将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件。极端的说,基于LSM树实现的HBase的写性能比Mysql高了一个数量级,读性能低了一个数量级。

LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能。

 

以上这些大概就是HBase存储的设计主要思想,这里分别对应说明下:

  • 因为小树先写到内存中,为了防止内存数据丢失,写内存的同时需要暂时持久化到磁盘,对应了HBase的MemStore和HLog
  • MemStore上的树达到一定大小之后,需要flush到HRegion磁盘中(一般是Hadoop DataNode),这样MemStore就变成了DataNode上的磁盘文件StoreFile,定期HRegionServer对DataNode的数据做merge操作,彻底删除无效空间,多棵小树在这个时机合并成大树,来增强读性能。

 

关于LSM Tree,对于最简单的二层LSM Tree而言,内存中的数据和磁盘你中的数据merge操作,如下图

图来自lsm论文

lsm tree,理论上,可以是内存中树的一部分和磁盘中第一层树做merge,对于磁盘中的树直接做update操作有可能会破坏物理block的连续性,但是实际应用中,一般lsm有多层,当磁盘中的小树合并成一个大树的时候,可以重新排好顺序,使得block连续,优化读性能。

hbase在实现中,是把整个内存在一定阈值后,flush到disk中,形成一个file,这个file的存储也就是一个小的B+树,因为hbase一般是部署在hdfs上,hdfs不支持对文件的update操作,所以hbase这么整体内存flush,而不是和磁盘中的小树merge update,这个设计也就能讲通了。内存flush到磁盘上的小树,定期也会合并成一个大树。整体上hbase就是用了lsm tree的思路。

 

  

 

E-mail: huahuiyang@gmail.com https://cn.linkedin.com/pub/huahui-yang/91/13a/105



https://www.cnblogs.com/yanghuahui/p/3483754.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LSM树由来、设计思想以及应用到HBase的索引 的相关文章

  • ORACLE中通过SQL语句(alter table)来增加、删除、修改字段

    ORACLE中通过SQL语句 alter table 来增加 删除 修改字段 1 添加字段 alter table 表名 add 字段 字段类型 default 输入默认值 null not null 2 添加备注 comment on c
  • Git合并代码流程——2023.05

    本文介绍一下如何将git上面的代码合并 一 把分支代码合并到master 首先切换到分支hello git checkout hello 使用git pull 把分支代码pull下来 git pull 切换到主分支 git checkout
  • 【收藏】开发人员看过来:11 个免费的开源 IDE

    1 Komodo Edit Windows Mac Linux Komodo Edit 是开源的 支持PHP Python Ruby JavaScript Perl Tcl XML HTML 5 and CSS 3 它具备语法着色 折叠 背
  • SSTI-2 继承关系 & 魔术方法

    主要内容学习自 B站 重庆橙子科技 SSTI 模板注入 我力推橙子科技的所有 CTF 课程 由于在模板注入时 我们能够注入的地方 终究只是一个变量 而不是 Python 语句 所以直接注入 Python 语句是不能执行的 需要一些特殊操作让
  • training set, validation set, test set的区别

    首先安利一下一个机器学习的入门在线课程 台湾大学机器学习 以及关于上面这个问题的一个解答 解答 大四做毕设的时候就有这个问题 当时没想明白 后面一直疑惑不解 直到今天才搞懂 首先写一下结论 training set 用来训练模型 valid
  • idea通过wsdl文件自动生成webservice客户端java代码

    今天做项目要从门户后台调用一个webservice接口获取角色对应的菜单列表 门户提供一个wsdl的url 之前没调过webservice接口 因为知道可以根据wsdl链接自动生成客户端代码 网上搜了一下 可以用idea自动生成 就试了一下
  • ssh放行端口_ssh 连接需要开放哪些端口

    目前的iptables如附 A OUTPUT o lo j ACCEPT A OUTPUT m state state RELATED ESTABLISHED j ACCEPT A OUTPUT m state state INVALID
  • 如何用Microsoft Office Visio画时序图

    文件 新建 软件和数据库 UML模型图 然后在左侧的形状中点击 UML序列
  • 爬取全国各地区汽车销量情况并用中国地图可视化展示

    爬取全国各地区汽车销量情况并用中国地图可视化展示 项目介绍 网页详情 代码 爬取数据代码 将爬取的数据保存到文档中 中国地图可视化 运行效果 项目介绍 爬取2017年全国各省份的汽车销量情况 由于数据源的问题 不包含台湾省的数据情况 并且利
  • dedecms sql批量导入文章

    dede addonarticle 附加文章表 dede archives 文档主表 dede arctiny 文档微 sql 直接存入文章 INSERT INTO dede archives id typeid typeid2 sortr
  • sql查询无结果返回空_Java Mybaties In查询无法返回结果映射对象

    问题描述 在Springboot mybaties mapper xml下 使用in查询参数由Java后台拼接字符串而来 执行查询后 Java后台收到的响应结果为null 但是将sql放至数据库查询时 发现能查到数据 列表未完全展示 最终效
  • 【刷题笔记4】LeetCode 82. 删除排序链表中的重复元素 II (链表处理经典题目)

    系列索引 刷题笔记0 系列目录索引 持续更新 推荐收藏 本题题目 LeetCode 82 删除排序链表中的重复元素 II 分类 链表 难度 中等 老规矩 先上AC图 题目 82 删除排序链表中的重复元素 II 点击直达原网站 示例 1 输入
  • js删除服务器上文件,js删除服务器文件

    js删除服务器文件 内容精选 换一换 目标服务器已安装操作系统 并且处于联网状态 目标服务器已安装鲲鹏编译插件 保护组生产站点服务器为SUSE操作系统 对该云服务器开启容灾保护后 执行切换操作 云服务器EIP无法ping通 执行切换操作后
  • ASP.NET立即上手教程(2)

    什么是asp net的Web Forms Asp net Web Forms 页面框架是可升级的通用语言运行时刻 CLR 程序模型 用来在服务器端动态生成WEB页面 美国人说话就是别扭 其实Web Forms就是asp net编写的页面 作
  • 本征正交分解(POD)入门(详解)

    思来想去还是把题目从 简介 改成了 入门 详解 其实详解主要就是针对可能没接触过矩阵论的同学 我也是研一才学的 入门是指的我会解释一些名词 方便理解 另外PCA 主成分分析 本质上就是POD 只是我最近翻的热工学论文大部分都用的POD这个名
  • 楠姐技术漫话:接着唠唠社区发现

    halo 大家好很开心又和大家见面了 在第一篇 楠姐技术漫画 图计算的那些事 发布之后 楠姐收到了很多建议 鼓励和支持 非常感谢大家的喜欢 所以楠姐尽自己所能马不停蹄开始第二篇的创作 虽迟但到 本篇依然是风控算法分享 其实也依然算是图算法系
  • 从零开始搭建物联网平台(四)EMQ-X消息中间件

    物联网的消息中间件有很多 如ActiveMq RabbitMq Emq 以及自己实现的netty borker 这里为什么要选择EMQ呢 首先 在使用emqx之前我用过ActiveMq由于是国外开发的 对国内产品的支持不够好 文档和社区也远

随机推荐

  • c++ 使用libcurl下载网络图像

    include
  • 解决ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.7

    前言 最近因项目需要 部署区块链的网络时候 需要一个问题 运行下载的install sh脚本时候 提示出错 然后找到该脚本文件 找到对应报错的语句 发现是python的pip没有下载好的缘故 解决 问题原因知道了 然后就下载一个Pip就好
  • 家政服务小程序制作:提升生活质量、解决烦恼

    在现代快节奏的生活中 家政服务扮演着越来越重要的角色 借助家政服务小程序的制作 为用户提供便捷可靠的家务帮助已成为一种新的选择 那么家政服务小程序的制作过程是怎么样的呢 带来的好处有哪些呢 1 家政服务小程序的定义与优势 小程序是微信里面的
  • 第十八讲:神州三层交换机DHCP中继服务的配置

    当DHCP客户机和DHCP服务器不在同一个网段时 由DHCP中继传递DHCP报文 增加DHCP中继功能的好处是不必为每个网段都设置DHCP服务器 同一个DHCP服务器可以为很多个子网的客户机提供网络配置参数 即节约了成本又方便了管理 这就是
  • 流水灯实验过程

    流水灯 1 基本思路 先让P1口全为高电平 灯不亮 通过为左移 位右移动来实现依次点亮LED灯一个具有注脚的文本 1 用for循环语句嵌套 写程序 include
  • 在SpringBoot中整合其它技术

    在SpringBoot中整合其它技术 前言 一 SpringBoot整合SpringMVC 1 修改web端口 2 访问静态资源 3 添加拦截器 4 更详细的日志 二 SpringBoot整合MyBatis 1 整合连接池 2 整合myba
  • 老板说,可以在家办公,顿时办公室沸腾了……

    在美国的IT行业中 在家办公 WFH 仍然不是普遍现象 这有点匪夷所思 因为 1 员工渴望在家办公 2 有些雇主已经提供在家办公 3 反对在家办公的意见不能成立 在家办公 并不意味着 100 在家工作 从不需要去办公室 而是公司应该提供这些
  • opencv进行简单的裂缝检测

    师弟最近要使用四旋翼进行桥梁探伤 主要是用运动相机搭载在四轴上检测裂缝 就顺便搞了一下有关于裂缝检测的图像处理 算法比较简单 没有考虑太多复杂情况 在简单墙面背景下基本可以找到裂缝并框定 基本思路为 先转换彩色图为灰度图 然后进行自适应局部
  • 区块链能解决媒体行业哪些问题?

    对于最近炙手可热的区块链技术 最近流行起这样一句笑言 没有什么问题是人工智能解决不了的 如果有 那就用区块链解决 这句话虽然略显夸张 但也反映出人们对于区块链技术的高度期待 区块链有三个显著的特点 去中心化 可追溯 不可篡改 这三个特点为它
  • Linux 中不适用功能键切换TTY

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本简要指南介绍了在类 Unix 操作系统中如何在不使用功能键的情况下切换 TTY 在进一步讨论之前 我们将了解 TTY 是什么 正如在 AskUbuntu 论坛的一个答案
  • C#中关于在一个数据库同时修改2个数据的语法使用!

    SqlCommand cmd new SqlCommand update Student set Sname updateName where Sno Sno con SqlCommand cmd2 new SqlCommand updat
  • AES对称加密工具类(GCM)

    import java io UnsupportedEncodingException import java security InvalidAlgorithmParameterException import java security
  • Java实现图片格式转换(通过ImageIO)

    文章目录 粗略介绍ImageIO 一 遍历文件夹 二 转换图片格式 视频效果演示 粗略介绍ImageIO ImageIO是javax imageio包下的一个类 用于实现Java中关于图片输入输出的一种类 这个类中所有方法均为静态方法 因此
  • 2.9 UiPath中断活动Continue的介绍和使用

    Continue的介绍 跳过当前For Each 循环内的迭代 结束本次循环 Continue控件只能用于For Each 循环中 Continue在UiPath中结合For Each循环的使用 打开设计器 在设计库中新建一个Flowcha
  • ODrive踩坑(四)AS5047P-SPI绝对值磁编码器,不需每次上电校准无刷电机,直接上电可用

    前几篇介绍了ODrive在Windows下的使用环境搭建 以及TLE5012B AS5047P的ABI配置 ODrive教程资源导航 ODrive踩坑 一 windows下使用环境的搭建 odrivetool及USB驱动的安装 ODrive
  • 软件版本比较之——Java算法实现软件版本比较

    最近遇到一个开发中的小问题 软件版本比较 例如2 12 3和2 2 1这两个版本号 哪个更新 其实 客户端版本检测更新 检测后台是否有更新版本可更新 Java中最简单的一种方法便是获取当前客户端版本号 与服务端提供的最新版本号做equals
  • 被难倒了! 针对高级前端的八个级JavaScript面试问题

    JavaScript 是一种功能强大的语言 也是构建现代 Web 的基础之一 这种强大的语言也有一些自己的怪癖 例如 你知道 0 0 会计算为 true 或者 Number 会返回 0 吗 有时候 这些怪癖会让你百思不得其解 甚至让你怀疑
  • 如何查看Windows 桌面壁纸的位置

    有3个位置 默认系统壁纸的位置 主题壁纸图片位置 系统主题文件位置 1 系统壁纸位置 windir Web Wallpaper 2 主题壁纸图片位置 userprofile AppData Local Microsoft Windows T
  • libevent(6)windows上使用iocp网络模型

    windows操作系统上不能使用epoll模型 只能使用iocp网络模型 这里我把怎么在windows上使用iocp的代码直接贴上 include
  • LSM树由来、设计思想以及应用到HBase的索引

    讲LSM树之前 需要提下三种基本的存储引擎 这样才能清楚LSM树的由来 哈希存储引擎 是哈希表的持久化实现 支持增 删 改以及随机读取操作 但不支持顺序扫描 对应的存储系统为key value存储系统 对于key value的插入以及查询