Hbase Memstore刷新方式与Region的数目上限

目录

Region数目上限

Region大小上限

MemStore的刷新方式(触发条件)

HLog (WAL) Size & Memstore Flush

频繁的Memstore Flushes


Region数目上限

RegionServer的region数目取决于memstore的内存使用,每个region拥有一组memstore(memstore的数量有hstore决定,hstore的数据由创建表时的指定的列族个数决定,所以 每个region的memstore的个数 = 表的列族的个数 ),可以通过配置来修改memstore占用内存的大小,一般设置在 128 M – 256M之间。

RegionServer 分配一定比例的内存给它下面的所有memstore( 该比例大小 可通过hbase.regionserver.global.memstore.upperLimit 进行修改 ), 如果内存溢出(使用了太多的memstore),它可能会导致严重的后果,如服务器反应迟钝 或compact风暴。比较好的计算每RS(假设一个表)region的数量的公式为:

((RS memory) * (total memstore fraction)) / ((memstore size)*(# column families))

(RegionServer内存  *  分配给MemStore比例) / (Memstore 大小 * 列簇数量)

 

参数说明
分配给MemStore比例hbase.regionserver.global.memstore.upperLimit单个Region内所有的memstore大小总和,超过则flush到磁盘
Memstore 大小hbase.hregion.memstore.flush.size如 memstore 大小超过此值(字节数),Memstore 将刷新到磁盘。通过运行由 hbase.server.thread.wakefrequency 指定的频率的线程检查此值。
 hbase.regionserver.global.memstore.lowerLimit如下
 hbase.hregion.memstore.block.multiplier超过memstore大小的倍数达到该值则block所有写入请求,自我保护

参数说明:

hbase.regionserver.global.memstore.upperLimit/lowerLimit
默认值:0.4/0.35


upperlimit说明:hbase.hregion.memstore.flush.size 这个参数的作用是当单个Region内所有的memstore大小总和超过指定值时,flush该region的所有memstore。RegionServer的flush是通过将请求添加一个队列,模拟生产消费模式来异步处理的。那这里就有一个问题,当队列来不及消费,产生大量积压请求时,可能会导致内存陡增,最坏的情况是触发OOM。
这个参数的作用是防止内存占用过大,当ReigonServer内所有region的memstores所占用内存总和达到heap的40%时,HBase会强制block所有的更新并flush这些region以释放所有memstore占用的内存。


lowerLimit说明: 同upperLimit,只不过lowerLimit在所有region的memstores所占用内存达到Heap的35%时,不flush所有的memstore。它会找一个memstore内存占用最大的region,做个别flush,此时写更新还是会被block。lowerLimit算是一个在所有region强制flush导致性能降低前的补救措施。在日志中,表现为 “** Flush thread woke up with memory above low water.”
调优:这是一个Heap内存保护参数,默认值已经能适用大多数场景。
参数调整会影响读写,如果写的压力大导致经常超过这个阀值,则调小读缓存hfile.block.cache.size增大该阀值,或者Heap余量较多时,不修改读缓存大小。
如果在高压情况下,也没超过这个阀值,那么建议你适当调小这个阀值再做压测,确保触发次数不要太多,然后还有较多Heap余量的时候,调大hfile.block.cache.size提高读性能。
还有一种可能性是?hbase.hregion.memstore.flush.size保持不变,但RS维护了过多的region,要知道 region数量直接影响占用内存的大小。

hfile.block.cache.size

默认值:0.2
说明:storefile的读缓存占用Heap的大小百分比,0.2表示20%。该值直接影响数据读的性能。
调优:当然是越大越好,如果写比读少很多,开到0.4-0.5也没问题。如果读写较均衡,0.3左右。如果写比读多,果断默认吧。设置这个值的时候,你同时要参考?hbase.regionserver.global.memstore.upperLimit?,该值是memstore占heap的最大百分比,两个参数一个影响读,一个影响写。如果两值加起来超过80-90%,会有OOM的风险,谨慎设置。

 

hbase.hregion.memstore.block.multiplier

指单个MemStore超过 hbase.hregion.memstore.block.multiplier 的倍数,就阻止写入操作。

当一个集群批量导入数据时,写入速度过快导致异常可调整 hbase.hregion.memstore.block.multiplier 参数。

    e.g. 异常处理:https://blog.csdn.net/zhangshenghang/article/details/82621101

Memstore手动flush

hbase(main):001:0> help 'flush'
Flush all regions in passed table or pass a region row to
flush an individual region.  For example:hbase> flush 'TABLENAME'hbase> flush 'REGIONNAME'hbase> flush 'ENCODED_REGIONNAME'hbase(main):004:0> flush 'user'
0 row(s) in 0.2640 seconds

 

 

例如: 如果 一个RegionServer配置的内存是16g,使用默认配置( hbase默认regionserver分给memstore的比例是0.4 , 默认的menstore的占用128M内存 ), 一个CF,那么这个regionServer下的region的个数大约为 16384 * 0.4 / (128*1) = 51个,实际测试大于这个数 一两倍 也没太大的问题。 一个HBase表包含一至多个region,那么表的数目上限也是可以估算出来的。

 

Region大小上限

   对于生产场景中大表,最大的region大小主要是受compactions 的限制,大量大HFile的compact会降低群集性能。目前,该建议的最大region大小为10-20GB,而5-10GB是最优

 

 

MemStore的刷新方式(触发条件)

1、hbase.hregion.memstore.flush.size

默认值 128M,单个 MemStore 大小超过该阈值就会触发 Flush。如果当前集群 Flush 比较频繁,并且内存资源比较充裕,建议适当调整为 256M。调大的副作用可能是造成宕机时需要分裂的 HLog 数量变多,从而延长故障恢复时间。

2、hbase.hregion.memstore.block.multiplier

默认值 4,Region 中所有 MemStore 超过单个 MemStore 大小的倍数达到该参数值时,就会阻塞写请求并强制 Flush。一般不建议调整,但对于写入过快且内存充裕的场景,为避免写阻塞,可以适当调整到5~8。

3、hbase.regionserver.global.memstore.size

默认值 0.4,RegionServer 中所有 MemStore 大小总和最多占 RegionServer 堆内存的 40%。这是写缓存的总比例,可以根据实际场景适当调整,且要与 HBase 读缓存参数 hfile.block.cache.size(默认也是0.4)配合调整。旧版本参数名称为 hbase.regionserver.global.memstore.upperLimit。

4、hbase.regionserver.global.memstore.size.lower.limit

默认值 0.95,表示 RegionServer 中所有 MemStore 大小的低水位是 hbase.regionserver.global.memstore.size 的 95%,超过该比例就会强制 Flush。一般不建议调整。旧版本参数名称为 hbase.regionserver.global.memstore.lowerLimit。

5、hbase.regionserver.optionalcacheflushinterval

默认值 3600000(即 1 小时),HBase 定期 Flush 所有 MemStore 的时间间隔。一般建议调大,比如 10 小时,因为很多场景下 1 小时 Flush 一次会产生很多小文件,一方面导致 Flush 比较频繁,另一方面导致小文件很多,影响随机读性能,因此建议设置较大值。

  • Memstore级别限制:当Region中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128MB),会触发Memstore刷新。
  • Region级别限制:当Region中所有Memstore的大小总和达到了上限(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 2* 128M = 256M),会触发memstore刷新。
  • Region Server级别限制:当一个Region Server中所有Memstore的大小总和达到了上限(hbase.regionserver.global.memstore.upperLimit * hbase_heapsize,默认 40%的JVM内存使用量),会触发部分Memstore刷新。Flush顺序是按照Memstore由大到小执行,先Flush Memstore最大的Region,再执行次大的,直至总体Memstore内存使用量低于阈值(hbase.regionserver.global.memstore.lowerLimit * hbase_heapsize,默认 38%的JVM内存使用量)。
  • 当一个Region Server中HLog数量达到上限(可通过参数hbase.regionserver.maxlogs配置)时,系统会选取最早的一个 HLog对应的一个或多个Region进行flush
  • HBase定期刷新Memstore:默认周期为1小时,确保Memstore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致的问题,定期的flush操作有20000左右的随机延时。
  • 手动执行flush:用户可以通过shell命令 flush ‘tablename’或者flush ‘region name’分别对一个表或者一个Region进行flush。

 

HLog (WAL) Size & Memstore Flush

当数据被写入时会默认先写入Write-ahead Log(WAL)。WAL中包含了所有已经写入Memstore但还未Flush到HFile的更改(edits)。在Memstore中数据还没有持久化,当RegionSever宕掉的时候,可以使用WAL恢复数据。

当WAL(在HBase中成为HLog)变得很大的时候,在恢复的时候就需要很长的时间。因此,对WAL的大小也有一些限制,当达到这些限制的时候,就会触发Memstore的flush。Memstore flush会使WAL 减少,因为数据持久化之后(写入到HFile),就没有必要在WAL中再保存这些修改。有两个属性可以配置:

  • hbase.regionserver.hlog.blocksize
  • hbase.regionserver.maxlogs

你可能已经发现,WAL的最大值由hbase.regionserver.maxlogs * hbase.regionserver.hlog.blocksize (2GB by default)决定。一旦达到这个值,Memstore flush就会被触发。所以,当你增加Memstore的大小以及调整其他的Memstore的设置项时,你也需要去调整HLog的配置项。否则,WAL的大小限制可能会首先被触发,因而,你将利用不到其他专门为Memstore而设计的优化。抛开这些不说,通过WAL限制来触发Memstore的flush并非最佳方式,这样做可能会会一次flush很多Region,尽管“写数据”是很好的分布于整个集群,进而很有可能会引发flush“大风暴”。

提示:最好将hbase.regionserver.hlog.blocksize * hbase.regionserver.maxlogs 设置为稍微大于hbase.regionserver.global.memstore.lowerLimit * HBASE_HEAPSIZE.

 

频繁的Memstore Flushes

要避免“写阻塞”,貌似让Flush操作尽量的早于达到触发“写操作”的阈值为宜。但是,这将导致频繁的Flush操作,而由此带来的后果便是读性能下降以及额外的负载。

每次的Memstore Flush都会为每个CF创建一个HFile。频繁的Flush就会创建大量的HFile。这样HBase在检索的时候,就不得不读取大量的HFile,读性能会受很大影响。

为预防打开过多HFile及避免读性能恶化,HBase有专门的HFile合并处理(HFile Compaction Process)。HBase会周期性的合并数个小HFile为一个大的HFile。明显的,有Memstore Flush产生的HFile越多,集群系统就要做更多的合并操作(额外负载)。更糟糕的是:Compaction处理是跟集群上的其他请求并行进行的。当HBase不能够跟上Compaction的时候(同样有阈值设置项),会在RS上出现“写阻塞”。像上面说到的,这是最最不希望的。

Compaction操作尽量取消自动Compaction,使用空闲时间手动执行,已减少对服务的影响

 

参考资料:

http://blog.csdn.net/oozie123

http://hbasefly.com/2016/03/23/hbase-memstore-flush/

《Hbase权威指南》

https://blog.csdn.net/joeyon1985/article/details/71511891

其他的是之前做的笔记,没有记录当时参考文章~~~~

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

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

相关文章

CDH- Hive HWI 配置

目录 一、HWI安装 二、其中遇到一些问题: 1.遇到如下问题,将jre环境中的toos.jar 服务到lib目录下 2.CDH中没有hwi相关配置参数,手动加入并修改端口为9998,发现并未生效,暂时未找到原因所在。 一、HWI安装 通过查看…

ubuntu 安装PCL

如果你对PCL版本没有要求可以根据下面的方式安装: sudo apt-get install libpcl-dev 编译工程的时候可能会出现两个错误: 1. *** No rule to make target /usr/lib/x86_64-linux-gnu/libproj.so, needed by pcl_test. Stop 解决方式: s…

html之添加注释

为文档添加注释 <!--这里是注释--> 或者 <!--这里也是注释 并且可以分为多行-->

Hive - HWI 简单使用

进入HWI web页面 查看数据库中的表&#xff1a; 单击Create Session&#xff0c;并输入任务名称&#xff08;自定义&#xff09; 输入相关信息 Result File:结果输出文件 Error File:错误输出文件(可不填) Query&#xff1a;需要执行的语句,一些需要设置的参数也在这里面进…

ubuntu16.04安装ROS

参考博客: https://blog.csdn.net/weixin_43159148/article/details/83375218

HDFS balancer 异常处理

Hbase批量导入数据时&#xff0c;服务器负载较高&#xff0c;导致HDFS数据没有及时均衡&#xff0c;导致有一个DataNode数据暴增&#xff0c;手动进行balancer。 增加HDFS DataNode节点&#xff0c;想要均衡数据存储&#xff0c;执行 hdfs balancer -threshold 10 突然有一些…

html之关于空白和空白字符

分为&#xff1a;有意义空白和无意义空白2.71关于断行符<p> </p>2.72空白字符四种。。。记住&#xff1a;应该将空白置于开始标签之前&#xff0c;而不是紧跟着开始标签之后&#xff08;eg&#xff1a;<p>hello <a hre...>world</a> 避免<p&g…

“__popcnt64 is undefined

添加头文件&#xff1a; #include <intrin.h>

html之特殊字符表

特殊符号命名实体十进制编码特殊符号命名实体十进制编码Α&Alpha;Β&Beta;Γ&Gamma;Δ&Delta;Ε&Epsilon;Ζ&Zeta;Η&Eta;Θ&Theta;Ι&Iota;Κ&Kappa;Λ&Lambda;Μ&Mu;Ν&Nu;Ξ&Xi;Ο&Omicron;Π&Pi;Ρ&R…

cmake 学习笔记

1.路径 _mkdir(ROOT_DIR "/data/"); if (NOT ROOT_DIR_DEFINED) add_definitions(-DROOT_DIR"${PROJECT_SOURCE_DIR}") set(ROOT_DIR_DEFINED ON) endif() if (NOT ROOT_DIR_DEFINED) set(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) if (AR…

HDFS查看异常:Operation category READ is not supported in state standby. Visit

跨集群访问hdfs失败 $ hdfs dfs -ls hdfs://test:8020/hbase ls: Operation category READ is not supported in state standby. Visit https://s.apache.org/sbnn-error 意思是namenode不可用&#xff0c;查看namenode状态 hdfs-site.xml<property><name>dfs.h…

html之插入图片

GIF、JPEG、PNG是最符合在网页设计中使用的格式&#xff0c;但是要想将它们呈现在网页中&#xff0c;必须将它们链接在网页&#xff0c;这是通过HTML中添加到图片的路径链接来实现的。 使用html中的img可以实现该功能 图片的源地址(src属性) <img src"文件路径"…

ubuntu16.04 计算视觉算法相关软件安装 亲测可用

1.安装nvidia 驱动 1.1下载官方驱动程序 http://www.geforce.cn/drivers 根据自己的显卡显卡型号选择相应的驱动 1.2屏蔽nouveau驱动 输入 cd /lib/modules 输入 ls 会显示4.13.0-37-generic&#xff0c;4.13.0-36-generic,我们目标是最新的那个版本&#xff0c;每个人可能…

数据库中的模式分解与无损连接性

无损连接分解的普通判别方法——表格法 设关系模式RA1,…,An&#xff0c;R上成立的FD集F&#xff0c;R的一个分解p{R1,…,Rk}。无损连接分解的判断步骤如下&#xff1a; (1)构造一张k行n列的表格&#xff0c;每列对应一个属性Aj(1≤j≤n)&#xff0c;每行对应一个模式Ri(1≤i≤…

html之figure元素和figcaption元素为图片声明标题

figure和figcaption元素结合来为图片、视频、表格或者嵌入元素声明标题。以前使用如下方式为图片添加标题&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&g…

数据库设计过程

需求分析->概念结构设计->逻辑结构设计->物理设计 需求分析&#xff1a;数据流图&#xff0c;数据字典&#xff0c;需求说明书 概念结构设计&#xff1a;ER模型 逻辑结构设计&#xff1a;关系模式

tensorflow2.0学习(一)

环境配置我就不再这赘述了 1利用kares搭建分类模型 import tensorflow as tf import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib inline import numpy as np import sklearn import pandas as pd import os import sys import time from tensorlow impo…

常用数学符号大全、关系代数符号

http://www.dataguru.cn/thread-247437-1-1.html 常用数学符号大全、关系代数符号 1、几何符号   ⊥ ∥ ∠ ⌒ ⊙ ≡ ≌ △   2、代数符号   ∝ ∧ ∨ &#xff5e; ∫ ≠ ≤ ≥ ≈ ∞ ∶   3、运算符号   如加号&#xff08;&a…

现在完成时与过去完成时的区别

http://wenku.baidu.com/link?url-9u_JYMav-j6mhWJkEeQjKUsfKg4_7LCEvreL8fs4AXtdCn6VqAak66PNbSCRF3foilN80FulCHsbCFJB_hQZd7HIw3y8Z4jq0Mnga4O9YG