HBase 中 Memstore-Local Allocation Buffer
在0.90 版本后的 HBase,引入了一个高级机制用于缓解堆内存碎片的问题。此内存碎片问题的产生的主要原因是由于 memstore 上的扰动(频繁的分配与释放内存空间)导致。对应解决此问题的机制为Memstore-Local Allocation Buffer,简称MSLAB。
在一个memstore 满了后,RegionServer会将它flush到hdfs。这样对于长期存在的Key-Value pair(存在于Old Generation 中),则会在堆内存中产生holes(孔洞)。之后若是需要分配新内存,但是没有足够的连续堆内存空间的话,则会触发Full GC,也就会导致stop-the-world 暂停。继而GC机制会重写整个堆内存,若是使用的默认的 CMS算法,则用的是mark-sweep-compact方式进行。此过程会暂停较长时间,影响系统性能。
减少这部分compacting-collection带来影响的重点是:减少碎片。也就是MSLAB做的事情。它主要的思想是:只允许在堆中分配相同大小的对象。一旦这些对象提升到Old Generation,并且最终被回收后,它们会在堆中留下固定大小的holes。而接下来分配的新对象,由于也是相同大小,则可以直接使用这些holes。也就不会产生promotion errors(或是有关空间不足的报错)。因此也就不会产生这类stop-the-world compacting collection。
MSLAB是许多固定大小的缓冲区,用于存储不同大小的KeyValue实例。当一个缓冲区无法完全承载一个新加入的KeyValue时,则会认为此缓冲区已满,并且创建一个新的固定大小的缓冲区。
MSLAB的功能默认在0.92以及之后的版本中已启用。可以使用hbase.hregion.memstore.mslab.enabled 的配置进行修改。每个分配的固定缓冲大小由hbase.hregion.memstore.mslab.chunksize 决定,默认为2MB。这个参数可以根据KeyValue的大小进行调整,例如若是KeyValue的大小为100KB,则可以适当增加MSLAB的大小,以让一个缓冲区可以存储更多的KeyValue。
在缓冲区中,也有一个可存储大小的上边界。由 hbase.hregion.memstore.mslab.max.allocation 指定,默认为256KB。任何比此值大的KeyValue会被直接存储到JVM堆内存。如果我们存储大量比256KB大的KeyValue,则会更早遇到碎片相关的问题导致的暂停。
当然,使用MSLAB也是有代价的:它们会造成对内存的浪费,因为不可能每个buffer都会完全使用完所有字节。所以一个buffer中没有使用到的内存则会被浪费。所以这里是一个权衡:使用MSLABs 从GC中获益,减少碎片导致的暂停,但是内存的使用率不会很高效。若是不使用MSLABs,则可以获取更高效的内存使用率,但是需要处理GC暂停造成的问题。
不过需要注意的是:GC 算法的实现现在已经越来越好,所以在某些算法中,禁用MSLABs后带来的益处可能更大。因为这些算法可以高效并行地维护堆内存以及碎片整理。特别是G1 GC中,已经有用户表示:若是使用G1 GC,则可以关闭MSLABs 功能,而不会导致任何性功能下降。
最后,由于MSLAB buffers需要额外的byte array 复制操作,所以使用缓冲区会比直接使用KeyValue实例稍慢一些。有些客户会根据实际生产环境中的性能表现,衡量是否要开启MSLAB的功能。不过一般是建议开启此功能,因为它用于解决的是GC的长时间暂停。如果没有特定原因,一般不要关闭此功能。
HBase 中 Memstore-Local Allocation Buffer的更多相关文章
- 线程TLAB局部缓存区域(Thread Local Allocation Buffer)
TLAB(Thread Local Allocation Buffer) 1,堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的 2,Sun ...
- HBase中Memstore存在的意义以及多列族引起的问题和设计
Memstore存在的意义 HBase在WAL机制开启的情况下,不考虑块缓存,数据日志会先写入HLog,然后进入Memstore,最后持久化到HFile中.HFile是存储在hdfs上的,WAL预写日 ...
- 堆中的线程私有缓存区域TLAB(Thread Local Allocation Buffer)
TLAB产生的原因 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地址,需要 ...
- 关于hbase中的hbase-site.xml 配置详解
该文档是用Hbase默认配置文件生成的,文件源是 hbase-default.xml hbase.rootdir 这个目录是region server的共享目录,用来持久化HBase.URL需要是'完 ...
- 为什么不建议在 HBase 中使用过多的列族
我们知道,一张 HBase 表包含一个或多个列族.HBase 的官方文档中关于 HBase 表的列族的个数有两处描述: A typical schema has between 1 and 3 col ...
- HBase 中读 HDFS 调优
HDFS Read调优 在基于 HDFS 存储的 HBase 中,主要有两种调优方式: 绕过RPC的选项,称为short circuit reads 开启让HDFS推测性地从多个datanode读数据 ...
- HBase中MVCC的实现机制及应用情况
MVCC(Multi-Version Concurrent Control),即多版本并发控制协议,广泛使用于数据库系统.本文将介绍HBase中对于MVCC的实现及应用情况. MVCC基本原理 在介绍 ...
- HBase中的备份和故障恢复方法
本文将对Apache HBase可用的数据备份机制和大量数据的故障恢复/容灾机制做简要介绍. 随着HBase在重要的商业系统中应用的大量添加,很多企业须要通过对它们的HBase集群建立健壮的备份和故障 ...
- [翻译]HBase 中的 ACID
同前面翻译的一篇关联的,同作者的另一篇:ACID in HBase 这一篇不是单纯地描述一个问题,而是以 ACID 为主题,介绍了其在 HBase 中各个部分的体现及实现. ACID,即:原子性(At ...
随机推荐
- 《C++面向对象程序设计》第6章课后编程题2拓展
设计一个程序,其中有3个类CBank.BBank.GBank,分别为中国银行类,工商银行类和农业银行类.每个类都包含一个私有数据成员balance用于存放储户在该行的存款数,另有一个友元函数Total ...
- React Hooks 笔记1
useState const [state, setSate] = useState(initialState) 特征: setState 标识稳定,组件重新渲染时不会变化,useState 返回的第 ...
- LeetCodeTwo Sum IV 树的遍历+Hash大法好
题意 给定一颗二叉搜索树,返回是否存在两个节点的值之和为给定值K. 思路 同Two Sum.使用Hash表解决.只是要写个树的遍历而已,选取DFS. 源码 class Solution { publi ...
- 常用网络命令 在windows下
1.增加一条临时静态路由 格式:route add <目的网络地址> mask <目的网络子网掩码> <网关> 实例:route add 0.0.0.0 mask ...
- 曼孚科技:数据标注,AI背后的百亿市场
1. 两年前,来自山东农村的王磊成为了一位数据标注员.彼时的他,工作内容非常简单且枯燥:识别图片中人的性别. 然而,一段时间之后,他注意到分配给他的任务开始变得越来越复杂:从识别性别到年龄,从框选 ...
- Vuejs开发环境的搭建
Windows系统上搭建VueJS开发环境 1.安装node.js:在node.js官网下载对应系统的msi包并安装 注:node的安装分全局和本地模式.一般情况下会以本地模式运行,包会被安装到和你的 ...
- linux用户管理相关命令
查看用户以及用户组: cat /etc/group [root@izuf60kjjii4iwkhdsly3bz html]# cat /etc/group 内容具体分析 /etc/group ...
- PP: Tripoles: A new class of relationships in time series data
Problem: ?? mining relationships in time series data; A new class of relationships in time series da ...
- RN开发-IDE和API
一.开发工具 1.Visual Studio Code:微软IDE,轻量级,只有30+M大小 2.nuclide :仅支持Mac 3.WebStorm : JavaScript开发工具(IDE) 二. ...
- CSS 自适应导航菜单
文章目录 以前我写了一篇关于如何为自适应网页制作教程手机导航菜单,现在我又摸索出一种无需JS脚本的自适应导航菜单,它采用纯粹的语义化HTML5标签来完成.该菜单可以左对齐,居中或右对齐,也不像上一种方 ...