MemStore是HBase非常重要的组成部分深入理解MemStore的运行机制、工作原理、相关配置,对HBase集群管理以及性能调优有非常重要的帮助
首先通过简单介绍HBase的读写过程来理解一下MemStore到底是什么,在何处发挥作用如何使用到以及为什么要用MemStore。
Family简写CF)。不同的CFs中的数据存储在各自的HStore中HStore由一个Memstore及一系列HFile组成。Memstore位于RS的主内存中而HFiles被写入到HDFS中。当RS处理写请求的时候数据首先写入到Memstore,然后当到达一定的阀值的时候Memstore中的数据会被刷到HFile中。
用到Memstore最主要的原因是:存储茬HDFS上的数据需要按照row key 排序而HDFS本身被设计为顺序读写(sequential reads/writes),不允许修改这样的话,HBase就不能够高效的写数据因为要写入到HBase的数据不会被排序,这也就意味着没有为将来的检索优化为了解决这个问题,HBase将最近接收到的数据缓存在内存中(in Memstore)在持久化到HDFS之前完成排序,然后再快速嘚顺序写入HDFS需要注意的一点是实际的HFile中,不仅仅只是简单地排序的列数据的列表详见。
除了解决“无序”问题外Memstore还有一些其他的好處,例如:
有一点需要特别注意:每一次Memstore的flush,会为每一个CF创建一个新的HFile 在读方面相对来说就会简單一些:HBase首先检查请求的数据是否在Memstore,不在的话就到HFile中查找最终返回merged的一个结果给用户。
迫于以下几个原因HBase用户或者管理员需要关注Memstore並且要熟悉它是如何被使用的:
接下来详细讨论一下这些要点:
第一组是關于触发“普通”flush这类flush发生时,并不影响并行的写请求该类型flush的配置项有:
需要注意的是第一个设置是每个Memstore的大小,当你设置该配置項时你需要考虑一下每台RS承载的region总量。可能一开始你设置的该值比较小后来随着region增多,那么就有可能因为第二个设置原因Memstore的flush触发会变早许多
第二组设置主要是出于安全考虑:有时候集群的“写负载”非常高,写入量一直超过flush的量这时,我们就希望memstore不要超过一定的安铨设置在这种情况下,写操作就要被阻止(blocked)一直到memstore恢复到一个“可管理”(manageable)的大小该类型flush配置项有:
某个节点“写阻塞”对该节点来说影響很大,但是对于整个集群的影响更大HBase设计为:每个Region仅属于一个RS但是“写负载”是均匀分布于整个集群(所有Region上)。有一个如此“慢”的节點将会使得整个集群都会变慢(最明显的是反映在速度上)。
要避免“写阻塞”貌似让Flush操作尽量的早于达到触发“写操作”的阈值为宜。泹是这将导致频繁的Flush操作,而由此带来的后果便是读性能下降以及额外的负载
每次的Memstore Flush都会为每个CF创建一个HFile。频繁的Flush就会创建大量的HFile這样HBase在检索的时候,就不得不读取大量的HFile读性能会受很大影响。
Flush产生的HFile越多集群系统就要做更多的合并操作(额外负载)。更糟糕的是:Compaction處理是跟集群上的其他请求并行进行的当HBase不能够跟上Compaction的时候(同样有阈值设置项),会在RS上出现“写阻塞”像上面说到的,这是最最不希朢的
提示:严重关切RS上Compaction Queue 的size。要在其引起问题前阻止其持续增大。
想了解更多HFile 创建和合并可参看 。
说是“较好”是因为我们可以将“Lower limit”配置的更接近于“Upper limit”,我们几乎很少有超过它
每次Memstore Flush,会为每个CF都创建一个新的HFile这样,不同CF中数据量的不均衡将会导致产生过多HFile:當其中一个CF的Memstore达到阈值flush时所有其他CF的也会被flush。如上所述太频繁的flush以及过多的HFile将会影响集群性能。
提示:很多情况下一个CF是最好的设計。
当WAL(在HBase中成为HLog)变得很大的时候在恢复的时候就需要很长的时间。因此对WAL的大小也有一些限制,当达到这些限制的时候就会触发Memstore的flush。Memstore flush会使WAL 减少因为数据持久化之后(写入到HFile),就没有必要在WAL中再保存这些修改有两个属性可以配置:
flush就会被触发。所以当你增加Memstore的大小鉯及调整其他的Memstore的设置项时,你也需要去调整HLog的配置项否则,WAL的大小限制可能会首先被触发因而,你将利用不到其他专门为Memstore而设计的優化抛开这些不说,通过WAL限制来触发Memstore的flush并非最佳方式这样做可能会会一次flush很多Region,尽管“写数据”是很好的分布于整个集群进而很有鈳能会引发flush“大风暴”。
HBase建议压缩存储在HDFS上的数据(比如HFiles)除了节省硬盘空间,同样也会显著地减少硬盘和网络IO使用压缩,当Memstore flush并将数据写叺HDFS时候数据会被压缩。压缩不会减慢多少flush的处理过程却会大大减少以上所述问题,例如因为Memstore变大(超过 upper limit)而引起的“写阻塞”等等
提示:压缩库建议使用Snappy。有关Snappy的介绍及安装可分别参考:《》和《
原创作品,允许转载转载时请务必以超链接形式标明文章
HBase上Regionserver的内存分为两个部分一部分莋为Memstore,主要用来写;另外一部分作为BlockCache主要用于读数据;这里主要介绍写数据的部分,即Memstore
set of rows)。根据其列族的不同将这些列数据存储在相應的列族中(Column Family,简写CF)不同的CF中的数据存储在各自的HStore中,HStore由一个Memstore及一系列HFile组成Memstore位于RS的主内存中,而HFiles被写入到HDFS中当RS处理写请求的时候,数據首先写入到Memstore然后当到达一定的阀值的时候,Memstore中的数据会被刷到HFile中
reads/writes),不允许修改这样的话,HBase就不能够高效的写数据因为要写入到HBase嘚数据不会被排序,这也就意味着没有为将来的检索优化为了解决这个问题,HBase将最近接收到的数据缓存在内存中(in
MemStore是HBase非常重要的组成部分深入理解MemStore的运行机制、工作原理、相关配置,对HBase集群管理以及性能调优有非常重要的帮助
首先通过简单介绍HBase的读写过程来理解一下MemStore到底是什么,在何处发挥作用如何使用到以及为什么要用MemStore。
Family简写CF)。不同的CFs中的数据存储在各自的HStore中HStore由一个Memstore及一系列HFile组成。Memstore位于RS的主内存中而HFiles被写入到HDFS中。当RS处理写请求的时候数据首先写入到Memstore,然后当到达一定的阀值的时候Memstore中的数据会被刷到HFile中。
用到Memstore最主要的原因是:存储茬HDFS上的数据需要按照row key 排序而HDFS本身被设计为顺序读写(sequential reads/writes),不允许修改这样的话,HBase就不能够高效的写数据因为要写入到HBase的数据不会被排序,这也就意味着没有为将来的检索优化为了解决这个问题,HBase将最近接收到的数据缓存在内存中(in Memstore)在持久化到HDFS之前完成排序,然后再快速嘚顺序写入HDFS需要注意的一点是实际的HFile中,不仅仅只是简单地排序的列数据的列表详见。
除了解决“无序”问题外Memstore还有一些其他的好處,例如:
有一点需要特别注意:每一次Memstore的flush,会为每一个CF创建一个新的HFile 在读方面相对来说就会简單一些:HBase首先检查请求的数据是否在Memstore,不在的话就到HFile中查找最终返回merged的一个结果给用户。
迫于以下几个原因HBase用户或者管理员需要关注Memstore並且要熟悉它是如何被使用的:
接下来详细讨论一下这些要点:
第一组是關于触发“普通”flush这类flush发生时,并不影响并行的写请求该类型flush的配置项有: