首页 > 其他分享 >三大操作之--flush操作

三大操作之--flush操作

时间:2023-12-11 22:02:16浏览次数:36  
标签:触发 -- Region Memstore flush HBase hbase 三大

  Memstore是HBase框架中非常重要的组成部分之一,是HBase能够实现高性能随机读写至关重要的一环。深入理解Memstore的工作原理、运行机制以及相关配置,对hbase集群管理、性能调优都有着非常重要的帮助。

一、Memstore 概述

HBase中,Region是集群节点上最小的数据服务单元,用户数据表由一个或多个Region组成。在Region中每个ColumnFamily的数据组成一个Store。每个Store由一个Memstore和多个HFile组成,如下图所示:

 

之前我们提到,HBase是基于LSM-Tree模型的,所有的数据更新插入操作都首先写入Memstore中(同时会顺序写到日志HLog中),达到指定大小之后再将这些修改操作批量写入磁盘,生成一个新的HFile文件,这种设计可以极大地提升HBase的写入性能;另外,HBase为了方便按照RowKey进行检索,要求HFile中数据都按照RowKey进行排序,Memstore数据在flush为HFile之前会进行一次排序,将数据有序化;还有,根据局部性原理,新写入的数据会更大概率被读取,因此HBase在读取数据的时候首先检查请求的数据是否在Memstore,写缓存未命中的话再到读缓存中查找,读缓存还未命中才会到HFile文件中查找,最终返回merged的一个结果给用户。

可见,Memstore无论是对HBase的写入性能还是读取性能都至关重要。其中flush操作又是Memstore最核心的操作,接下来重点针对Memstore的flush操作进行深入地解析:首先分析HBase在哪些场景下会触发flush,然后结合源代码分析整个flush的操作流程,最后再重点整理总结和flush相关的配置参数,这些参数对于性能调优、问题定位都非常重要。

 二、Memstore Flush触发条件

  HBase会在如下几种情况下触发flush操作,需要注意的是MemStore的最小flush单元是HRegion而不是单个MemStore。可想而知,如果一个HRegion中Memstore过多,每次flush的开销必然会很大,因此我们也建议在进行表设计的时候尽量减少ColumnFamily的个数。 

  1. Memstore级别限制:当Region中任意一个MemStore的大小达到了上限(hbase.hregion.memstore.flush.size,默认128MB),会触发Memstore刷新。
  2. Region级别限制:当Region中所有Memstore的大小总和达到了上限(hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 2* 128M = 256M),会触发memstore刷新。
  3. 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内存使用量)。
  4. 当一个Region Server中HLog数量达到上限(可通过参数hbase.regionserver.maxlogs配置)时,系统会选取最早的一个 HLog对应的一个或多个Region进行flush
  5. HBase定期刷新Memstore:默认周期为1小时,确保Memstore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致的问题,定期的flush操作有20000左右的随机延时。
  6. 手动执行flush:用户可以通过shell命令 flush ‘tablename’或者flush ‘region name’分别对一个表或者一个Region进行flush。

三、Memstore Flush流程

为了减少flush过程对读写的影响,HBase采用了类似于两阶段提交的方式,将整个flush过程分为三个阶段:

  1. prepare阶段:遍历当前Region中的所有Memstore,将Memstore中当前数据集kvset做一个快照snapshot,然后再新建一个新的kvset。后期的所有写入操作都会写入新的kvset中,而整个flush阶段读操作会首先分别遍历kvset和snapshot,如果查找不到再会到HFile中查找。prepare阶段需要加一把updateLock对写请求阻塞,结束之后会释放该锁。因为此阶段没有任何费时操作,因此持锁时间很短。
  2. flush阶段:遍历所有Memstore,将prepare阶段生成的snapshot持久化为临时文件,临时文件会统一放到目录.tmp下。这个过程因为涉及到磁盘IO操作,因此相对比较耗时。
  3. commit阶段:遍历所有的Memstore,将flush阶段生成的临时文件移到指定的ColumnFamily目录下,针对HFile生成对应的storefile和Reader,把storefile添加到HStore的storefiles列表中,最后再清空prepare阶段生成的snapshot。 

上述flush流程可以通过日志信息查看:

/******* prepare阶段 ********/
2016-02-04 03:32:41,516 INFO  [MemStoreFlusher.1] regionserver.HRegion: Started memstore flush for sentry_sgroup1_data,{\xD4\x00\x00\x01|\x00\x00\x03\x82\x00\x00\x00?\x06\xDA`\x13\xCAE\xD3C\xA3:_1\xD6\x99:\x88\x7F\xAA_\xD6[L\xF0\x92\xA6\xFB^\xC7\xA4\xC7\xD7\x8Fv\xCAT\xD2\xAF,1452217805884.572ddf0e8cf0b11aee2273a95bd07879., current region memstore size 128.9 M

/******* flush阶段 ********/
2016-02-04 03:32:42,423 INFO  [MemStoreFlusher.1] regionserver.DefaultStoreFlusher: Flushed, sequenceid=1726212642, memsize=128.9 M, hasBloomFilter=true, into tmp file hdfs://hbase1/hbase/data/default/sentry_sgroup1_data/572ddf0e8cf0b11aee2273a95bd07879/.tmp/021a430940244993a9450dccdfdcb91d

/******* commit阶段 ********/
2016-02-04 03:32:42,464 INFO  [MemStoreFlusher.1] regionserver.HStore: Added hdfs://hbase1/hbase/data/default/sentry_sgroup1_data/572ddf0e8cf0b11aee2273a95bd07879/d/021a430940244993a9450dccdfdcb91d, entries=643656, sequenceid=1726212642, filesize=7.1 M

整个flush过程可能涉及到compact操作和split操作,因为过于复杂,在此暂时略过不表。

四、Memstore Flush对业务读写的影响

上文介绍了HBase在什么场景下会触发flush操作以及flush操作的基本流程,想必对于HBase用户来说,最关心的是flush行为会对读写请求造成哪些影响以及如何避免。因为不同触发方式下的flush操作对用户请求影响不尽相同,因此下面会根据flush的不同触发方式分别进行总结,并且会根据影响大小进行归类:

影响甚微

正常情况下,大部分Memstore Flush操作都不会对业务读写产生太大影响,比如这几种场景:HBase定期刷新Memstore、手动执行flush操作、触发Memstore级别限制、触发HLog数量限制以及触发Region级别限制等,这几种场景只会阻塞对应Region上的写请求,阻塞时间很短,毫秒级别。

影响较大

然而一旦触发Region Server级别限制导致flush,就会对用户请求产生较大的影响。会阻塞所有落在该Region Server上的更新操作,阻塞时间很长,甚至可以达到分钟级别。一般情况下Region Server级别限制很难触发,但在一些极端情况下也不排除有触发的可能,下面分析一种可能触发这种flush操作的场景:

相关JVM配置以及HBase配置:

maxHeap = 71
hbase.regionserver.global.memstore.upperLimit = 0.35
hbase.regionserver.global.memstore.lowerLimit = 0.30 

基于上述配置,可以得到触发Region Server级别的总Memstore内存和为24.9G,如下所示: 

2015-10-12 13:05:16,232 INFO  [regionserver60020] regionserver.MemStoreFlusher: globalMemStoreLimit=24.9 G, globalMemStoreLimitLowMark=21.3 G, maxHeap=71 G

  假设每个Memstore大小为默认128M,在上述配置下如果每个Region有两个Memstore,整个Region Server上运行了100个region,根据计算可得总消耗内存 = 128M * 100 * 2 = 25.6G > 24.9G,很显然,这种情况下就会触发Region Server级别限制,对用户影响相当大。

  根据上面的分析,导致触发Region Server级别限制的因素主要有一个Region Server上运行的Region总数,一个是Region上的Store数(即表的ColumnFamily数)。对于前者,根据读写请求量一般建议线上一个Region Server上运行的Region保持在50~80个左右,太小的话会浪费资源,太大的话有可能触发其他异常;对于后者,建议ColumnFamily越少越好,如果从逻辑上确实需要多个ColumnFamily,最好控制在3个以内。

 

总结

本文主要介绍了HBase引擎中至关重要的一个组件-Memstore,主要介绍了Memstore Flush的几种触发条件、Flush完整流程以及各种不同场景下Flush对业务读写的影响。希望通过此篇文章可以对Memstore有一个更深入的了解。

 

标签:触发,--,Region,Memstore,flush,HBase,hbase,三大
From: https://www.cnblogs.com/guoyu1/p/17895666.html

相关文章

  • 调度器统计 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/scheduler/sched-stats.html调度器统计版本15的schedstats删除了一些sched_yield的计数器:yld_exp_empty、yld_act_empty和yld_both_empty。除此之外,它与版本14完全相同。版本14的schedstats包括对sched_domains的支持,......
  • Kilikilinode2
    自做网页2(优化,补充)前言之前做的网页还有许多需要优化的地方,比如用户登录退出,认证方式.....等等。下面一个一个来优化一下,下面只做主要代码目录自做网页2(优化,补充)1.注册用户优化2.登录页面优化3.首页头像的优化随机显示头像和退出功能4.试下使用B站的嵌入代码,再加个背景音乐......
  • JSON .NET SERIALIZE exploitation
    exploitingjsonserializationin.NETcore当使用特定的配置的时候,将在NewtonSoftJSON中会有json的反序列化漏洞。更加具体化一些就是当jsonserializationsettings中的typenamehandling这个属性不是None的时候。因为默认来说typenamehandling是设置成none的。当配置文......
  • 调度器调试文件说明 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/scheduler/sched-debug.html调度器调试文件说明numa_balancing目录numa_balancing目录用于保存控制NUMA平衡功能的文件。如果来自该功能的系统开销过高,则可以通过scan_period_min_ms、scan_delay_ms、scan_period_max_ms和scan_......
  • 【新工具】从零配置Vim+Latex提升写作效率(Windows)
    1.首先安装gvimwelcomehome:vimonline2.接着安装vimplugGitHub-junegunn/vim-plug::hibiscus:MinimalistVimPluginManager或终端直接运行iwr-usebhttps://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim|`ni$HOME/vimfiles/autoload/plu......
  • Scheduler pelt c program 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/scheduler/text_files.html/**Thefollowingprogramisusedtogeneratetheconstantsfor*computingschedaverages.**==============================================================* Cprogram(compilewith......
  • Dest0g3-web部分wp
    最近的大赛很多,但是在群里也不会做,而且事比较多,所以就找点简单的小比赛查漏补缺一下,因为感觉自己基础不是很牢固。phpdest<?phphighlight_file(__FILE__);require_once'flag.php';if(isset($_GET['file'])){require_once$_GET['file'];}require_once跟直接include......
  • 杂项与密码7
    misc1.jpg 先用工具看看 没有出现其他压缩包,但有文件。。搜搜 要手动分离 出来啦 2.bmp 没见过的文件尾 不需要改 哈?!! 3.文件分离 根据题意用winhex看看 没有。。分离文件 有文件 dd4这个文件。。有 4.文件属性 没有 题目说这个......
  • 调度器 Nice 设计 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/scheduler/sched-nice-design.html调度器Nice设计本文档解释了在新的Linux调度器中重新设计和简化nice-levels实现的思路。在Linux下,nicelevels一直比较弱,人们不断地纠缠我们,希望让nice+19的任务使用更少的CPU时间。不......
  • 重构笔记4
    提炼函数时机:当我们觉得一段大函数内某一部分代码在做的事情是同一件事,并且自成体系,不与其他掺杂时当代码展示的意图和真正想做的事情不是同一件时候,如作者提到的例子。想要高亮,代码意思为反色,这样就不容易让人误解,印证了作者前面说的:当你需要写一行注释时候,就适合重构了做法:一个......