学习
实践
活动
专区
工具
TVP
写文章
专栏首页大数据技术博文学大数据必懂系列之SSTable

学大数据必懂系列之SSTable

Google SSTable文件格式被用于BIgTable内部数据,SStable是一种不可变的、排序的、持久化的key_value Map,其中key和value都是任意字节的字符串。提供了找寻特定Key值对应的value的操作,以及找寻给定范围内所有key_value的操作。每一个SStale包括一系列的block(一般block大小是64Kb,这个值是可以配置的),在SST的末尾还有一个“block index”,用于定位每一个block(相当于索引),是key_offset(偏移量)的索引。

Sorted Strings Table(SSTable)是HBase、 Cassandra等一些NoSQL数据库使用的一种持久文件格式,用于获取存储在memtables中的内存数据,对其进行排序以实现快速访问,并将其存储在磁盘上的一组持久的、有序的、不可变的文件中。不可变意味着sstable永远不会被修改。它们稍后被合并到新的sstable中,或者在数据更新时被删除。

其中Key和value都可以是任意的byte字符串。使用Key来查找Value,或通过给定Key范围遍历所有的Key/Value对。每个SSTable包含一系列的Block(一般Block大小为64KB,但是它是可配置的),在SSTable的末尾是Block索引,用于定位Block,这些索引在SSTable打开时被加载到内存中,在查找时首先从内存中的索引二分查找找到Block,然后通过一次磁盘寻找即可读取到相应的Block。还有一种方案是将这个SSTable加载到内存中,从而在查找和扫描中不需要读取磁盘

SSTable和LSM-Tree

学大数据必懂系列之LSM-Tree 文章中,我们讲到LSM-Tree是一种能够将批量随机写,转换为顺序写的数据结构,其实本质就是不断产生SSTree结构的Log文件,然后不断Merge以提高文件效率的,它是一种分层的组织数据的结构,具体到实现上就是一些按照逻辑分层的有序文件

一言概述的话 :LSM-Tree的树节点可以分为两种,保存在内存中的称之为MemTable, 保存在磁盘上的称之为SSTable

在学大数据必懂技术之LSM-Tree文章中,我们也提到LSM-Tree是应用与写多读少的场景,对于大数据量的写入性能很好,但是损耗了一些数据读取的性能,那么SSTable的数据结构就是作为一个解决方案来处理这种读取效率低的问题。

1. 磁盘上的 SSTable 索引需要永远加载在内存里

2. 所有写操作,直接写 MemTable (写文件缓存,即内存,保证随机写入速度)

3. 读数据的时候先从 MemTable 检索,然后再从 SSTable 的索引中检索;

4. MemTable 周期性 flush 到磁盘中;

5. 磁盘上的 SSTable 会定期合并

6.落盘的数据不可变更,更新和删除操作并不是真正的物理修改和删除,只是增加版本号

SSTable和LSM-Tree: 更新和删除

在内存中写操作是经常发生的,写操作是直接写入MemTable,当MemTable达到一定的size,就flush到disk内成为一个不可变(immutable)的SSTable。与此同时,我们会保持(maintain)所有SSTable的index在内存中,这样在对给定的key进行搜索的时候,我们首先在MemTable内进行检索,再在每一层的SSTale之间再进行搜索,到这里就介绍了LSMTree存储引擎是如何提高读写效率的了,那对于更新与删除操作呢?

对于更新操作,因为SSTable是不可变的,因此更新与删除操作只发生在内存的MemTable内,如果要对SSTable内的数据进行更新只需要重新写进去一个新的就可以了,因为对于SSTable的访问是顺序的,所以新内容的存在会覆盖旧内容,也就是顺序访问到需要的值的时候就会退出,以下的旧值不被访问到。对于删除操作,也是在MemTable内插入一个“墓碑”标志加值,代表这个值被删除了,然后访问的时候会提前访问到墓碑标志而得知该值已经被删除了

SSTable 压缩和合并

随着数据的不断写入和更新,将创建更多不可变的SSTable文件。每层SSTable的文件到达一定条件之后进行合并操作(hbase.hregion.memstore.flush.size),然后放置到更高层,因此,可以在磁盘上的不同SSTable文件中找到具有不同版本数据的相同记录。系统了解这些记录中的哪些是最新的,并且仅使用最新版本响应查询请求。然而,如果没有某种方法来删除过时的数据,SSTable计数和存储的数据量将非常高,磁盘将被填满。

压缩是一个使用现有SSTables中的数据写入一个全新文件的过程。此过程将消除过时记录的重复数据,并仅将同一密钥的最新更改写入不同的SSTable,从而写入新的SSTALE文件。删除的行(由称为“墓碑”的标记指示)或整个删除的列也会被清除,并且该过程会为压缩的SSTable文件创建新的索引。

SSTable在HBase中的应用

这块可以参考 学大数据必懂系列之LSM-Tree

如上面的架构图设计,把 HBase 套用到 LSM-Tree和SSTable中的话,Memstore 就是上边的 Memtable,SSTables就是上面的HFiles ,除此之外,HBase 也和上边对比有一些区别。

下面给出一些HBase在使用LSM-Tree和SSTable中的一些参数优化:

  • hbase.hregion.memstore.flush.size 单个 memstore 在刷新到磁盘之前允许达到的大小。
  • hbase.hregion.memstore.block.multiplier 临时允许 memstore 增长到最大大小乘以该因子。
  • hbase.regionserver.global.memstore.lowerLimit 在强制刷新某些 memstore 之前,JVM 对聚合 memstore 大小的全局限制(以堆的百分比为单位)。
  • hbase.regionserver.global.memstore.upperLimit JVM memstore 在写入被阻塞之前的大小限制 (以堆的百分比为单位)
  • hbase.hstore.compactionThreshold 当存储达到这么多 HFile 时,HBase 将开始压缩 HFile
  • hbase.hstore.blockingStoreFiles HBase 不允许进一步刷新,直到压缩将 HFile 的数量至少减少到此值。这意味着现在 memstore 需要缓冲所有写入,因此如果压缩无法跟上,最终会成为阻塞客户端。
  • hbase.hstore.compaction.max 单个次要压缩将考虑的最大 HFile 数。
  • hbase.hregion.majorcompaction 定时 - 主要 - 压缩之间的时间间隔。即使没有发生任何更改,HBase 也会以此频率触发压缩。
  • hbase.hstore.blockingWaitTime 客户端被阻止的最长时间。在此时间之后,将再次允许写入。

参考链接:

https://cloud.google.com/bigtable/docs/overview

https://www.scylladb.com/glossary/sstable/

https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/

https://en.wikipedia.org/wiki/Log-structured_merge-tree

文章分享自微信公众号:
大数据技术博文

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:大数据技术博文
原始发表时间:2022-09-01
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 学大数据必懂系列之SkipList

    通俗解释:SKipList 翻译为中文就是 跳跃表,SkipList是一种数据结构,用于快速的查找数据的位置,本质上了来讲是一个List链表。

    用户5252199
  • 学大数据必懂系列之Page Cache

    通俗解释:在应用程序读取磁盘文件时,操作系统内核在读取磁盘时会经过一层Cache,利用这个Cache可以更快速读取数据(毕竟磁盘速度和内存速度还是差了很多)。那...

    用户5252199
  • 学大数据必懂系列之LSM-Tree

    LSM树(Log-Structured-Merge-Tree)(日志结构合并树)是一种能够提升磁盘写入速度的数据结构,它通过将大量的磁盘随机写操作,转换为批量顺...

    用户5252199
  • 学Java分布式和高架构,必懂的两大知识点!

    美的让人心动
  • MarsTalk | 给老婆讲懂数据库系列之原子性

    刚才是串行执行的场景,没有任何问题,转账B成功,转账A失败,总金额不变(都是900元)。

    HelloMin
  • JavaScript系列之JS数据类型,6大基本数据类型

    点击上方蓝字“ITester软件测试小栈“关注我,每周一、三、五早上 09:00准时推送,每月不定期赠送技术书籍。

    ITester软件测试小栈
  • 3分钟搞定 C++ if else 语句 05

    简介:CSDN博客专家,2020年博客之星TOP5,蓝桥签约作者。15-16年曾在网上直播,带领一批程序小白走上程序员之路。

    1_bit
  • 《看聊天记录都学不会C语言?太菜了吧》(18)2分钟搞结构体

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语...

    1_bit
  • 联网数据库 IoTDB —— 存储引擎原理篇

    Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。Apache IoTDB 采用轻量式架构,具有高性能和丰富的功能...

    麒思妙想
  • @@知乎提问数据分析推荐书籍的统计分析2022.11.21

    用户7138673
  • Go之基于LSM的Key-Value数据库实现初篇

    前篇文章对LSM的基本原理,算法流程做了简单的介绍,这篇文章将实现一个简单的基于LSM算法的迷你Key-Value数据库,结合上篇文章的理论与本篇文章的实践使之...

    IT工作者
  • SSTable详解

    几年前在读Google的BigTable论文的时候,当时并没有理解论文里面表达的思想,因而囫囵吞枣,并没有注意到SSTable的概念。再后来开始关注HBase的...

    狼啸风云
  • SSTable 介绍

    如果说Protocol Buffers是Google内部表示独立数据记录的单元,那么排序的字符串表--Sorted String Table(SSTable)-...

    狼啸风云
  • LevelDB 完全解析(8):读操作之 Get

    LevelDB 通过 leveldb::DB::Get 接口对外提供点查询的能力,具体的实现是 leveldb::DBImpl::Get。接口声明如下:

    linjinhe
  • 数据存储结构 LSM Tree PK B TREE (从底层了解数据库设计)

    随着使用数据库的深度和理解能力的提升,有一个问题硬件的提升,与数据量的变化是否对数据库底层的架构有冲击。 我们公认的BTREE B+TREE 是否还能面对现在...

    AustinDatabases
  • 《看聊天记录都学不会C语言?太菜了吧》(21)(必懂!题解)在现实生活中,打擂台比赛争名次竟用的是冒泡排序?

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语...

    1_bit
  • 聊起 BigTable,让你不再胆怯

    GFS 作为其中一驾宝车,解决了大数据存储的难题。它能够把大量廉价的普通机器,聚在一起,充分让每台廉价的机器发挥光和热。其中在《从谷歌 GFS 架构设计聊开去》...

    一猿小讲
  • 《看聊天记录都学不会C语言?太菜了吧》(1)我在大佬群里问基础问题没人理?

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语...

    1_bit
  • 【数据挖掘】系统地学习数据挖掘

    问题:如何系统地学习数据挖掘? 虽然是本科毕业,但是在看数据挖掘方面的算法理论时经常感觉一些公式的推导过程如天书一般,例如看svm的数学证明,EM算法..,感觉...

    陆勤_数据人网

扫码关注腾讯云开发者

领取腾讯云代金券