hbase 查询固定条数_HBase原理深入

HBase读数据流程

c172bdc2aa0769b64810aabacf4d9e73.png
HBase读数据流程.png
96d25a33f4b195433c7b5118f9a39401.png
HBase元数据信息.png
HBase读操作
  1. 首先从zk中找到meta表的region信息,然后meta表中的数据,meta表中存储了用户的region信息

  2. 根据要查询的namespace、表名和rowkey信息,找到对应的真正存储要查询的数据的region信息

  3. 找到这个region对应的regionServer,然后发送请求

  4. 查找对应的region

  5. 先从metastore查找数据,如果没有,再从BlockCache读取。

  • HBase上的RegionServer的内存分为两个部分

    • 一部分作为Memstore,主要用来写

    • 另一部分作为BlockCache,主要用来读数据

  1. 如果BlockCache中也没有找到,再到StoreFile上进行读取

从storeFile中读取到数据之后,不是直接把结果数据返回给客户端, 而是把数据先写⼊入到BlockCache中,目的是为了加快后续的查询;然后在返回结果给客户端。

HBase写数据流程

fb54ababd73c45b81f80cffcf5de1fc9.png
HBase写数据流程.png
HBase写操作
  1. 首先从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息

  2. 根据要查询的namespace、表名和rowkey信息,找到对应的真正存储要查询的数据的region信息

  3. 找到这个region对应的regionServer,然后发送请求

  4. 把数据写到HLog(write ahead log。WAL:预写入日志)和memstore各一份(写到Region里列族对应的Store的内存)

  5. Memstore 达到阈值后把数据刷到磁盘,生产storeFile

  6. 删除HLog中的历史数据

HBase的flush(刷写)及compact(合并)机制

Flush机制
  • 当memstore的大小超过这个值的时候会flush到磁盘,默认是128M

    <property>
    <name>hbase.hregion.memstore.flush.sizename>
    <value>134217728value>
    property>
  • 当memstore中的数据时间超过1小时,会flush到磁盘

    <property>
    <name>hbase.regionserver.optionalcacheflushintervalname
    <value>3600000value>
    property>
  • Hregion的所有的memstore的大小(一个RegionServer会有多个Region,一个Region会有多个store,也就有多个memstore),所有的memstore的大小超过堆大小的一定比例会触发flush到磁盘的操作,默认是堆大小的40%

    <property>
    <name>hbase.regionserver.global.memstore.sizename>
    <value>0.4value>
    property>
  • 手动flush

    flush tableName
阻塞机制

以上介绍的是Store中memstore数据刷写磁盘的标准,但是Hbase中是周期性(定时,默认是10S)的检查是否满足以上标准,满⾜则进⾏刷写,但是如果在下次检查到来之前,数据疯狂写入Memstore中,会出现什什么问题呢?

会触发阻塞机制,此时无法写⼊数据到Memstore,数据无法写入Hbase集群。

  • memstore中数据达到512MB

  • 计算公式:hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier

  • hbase.hregion.memstore.flush.size刷写的阀值,默认是 134217728,即128MB

  • hbase.hregion.memstore.block.multiplier是一个倍数,默认是4。

  • RegionServer全部memstore达到规定值

  • hbase.regionserver.global.memstore.size.lower.limit是0.95

  • hbase.regionserver.global.memstore.size是0.4,

  • 堆内存总共是 16G,

  • 触发刷写的阈值是:(0.95 * 0.4 * 16) = 6.08GB

  • 触发阻塞的阈值是:(0.4 * 16) = 6.4GB

当发生阻塞的时候,无法写入HBase,那么如何解决?

  • 调大memstore的hbase.hregion.memstore.flush.size内存大小设置

  • 让RegionServer占有JVM堆大小更多一些

Compact合并机制

合并的原因:减少文件的数量,提高查询的时候扫描的性能

在HBase中主要存在两种类型的Compact合并

  • minor compact ⼩合并

  • 会将Store中多个HFile(StoreFile)合并成一个大的HFile(默认最少3个,最多10个)

    这个过程中,删除和更新的数据仅只是做了标记,并没有物理移除,这种合并的触发频率很高。

  • minor compact⽂件选择标准由以下⼏个参数共同决定:


    <property>
        <name>hbase.hstore.compaction.minname>
        <value>3value>
    property>

    <property>
        <name>hbase.hstore.compaction.maxname>
        <value>10value>
    property>

    <property>
        <name>hbase.hstore.compaction.min.sizename>
        <value>134217728value>
    property>

    <property>
        <name>hbase.hstore.compaction.max.sizename>
        <value>9223372036854775807value>
    property>
  • 触发条件

    • memstore flush

      在进行memstore flush前后都会进行判断是否触发compact

    • 定期检查线程

      周期性检查是否需要进行compaction操作,由参数:hbase.server.thread.wakefrequency决定,默认值是10000 millseconds

  • major compact 大合并

  • 合并Store中所有的HFile为一个HFile

    这个过程有删除标记的数据会被真正移除,同时超过单元格maxVersion的版本记录也会被删除。合并频率⽐较低,默认7天执⾏⼀次,并且性能消耗非常大,建议⽣产关闭(设置为0),在应用空闲时间手动触发。⼀般可以是手动控制进行合并,防⽌出现在业务高峰期。

  • major compaction触发时间条件


    <property>
        <name>hbase.hregion.majorcompactionname>
        <value>604800000value>
    property>
  • 手动触发

    ##使⽤major_compact命令
    major_compact tableName

Region拆分机制

Region中存储的是⼤量的rowkey数据 ,当Region中的数据条数过多的时候,直接影响查询效率.当Region过大的时候.HBase会拆分Region , 这也是Hbase的⼀个优点

d03ce6ecfd7fb37d2bd2592086f62820.png
Region拆分机制.png
拆分策略

Hbase拆分策略一共有以下几种:

  1. ConstantSizeRegionSplitPolicy(0.9版本以前默认的切分策略。)

    当region⼤小⼤于某个阈值(hbase.hregion.max.filesize=10G)之后就会触发切分,一个region等分为2个region。

    但是在生产线上这种切分策略却有相当大的弊端:切分策略对于大表和小表没有明显的区分。阈值(hbase.hregion.max.filesize)设置较大对大表⽐比较友好,但是小表就有可能不会触发分裂,极端情况下可能就1个,这对业务来说并不是什么好事。如果设置较小则对⼩表友好,但一个大表就会在整个集群产⽣大量的region,这对于集群的管理、资源使用、failover来说都不是一件好事。

  2. IncreasingToUpperBoundRegionSplitPolicy(0.94版本~2.0版本默认切分策略)

    切分策略稍微有点复杂,总体看和ConstantSizeRegionSplitPolicy思路相同,一个region⼤小⼤于设置阈值就会触发切分。但是这个阈值并不像 ConstantSizeRegionSplitPolicy是一个固定的值,而是会在一定条件下不断调整,调整规则和region所属表在当前regionserver上的region个数有关系.

    region split的计算公式是:
    regioncount^3 * 128M * 2,当region达到该size的时候进⾏split 例如:
    第一次split:1^3 * 256 = 256MB
    第二次split:2^3 * 256 = 2048MB
    第三次split:3^3 * 256 = 6912MB
    第四次split:4^3 * 256 = 16384MB > 10GB,因此取较⼩的值10GB 后面每次split的size都是10GB了

  3. SteppingSplitPolicy(2.0版本默认切分策略略)

    这种切分策略的切分阈值⼜发生了变化,相比 IncreasingToUpperBoundRegionSplitPolicy 简单了一些,依然和待分裂region所属表在当前 regionserver上的region个数有关系,如果region个数等于1,切分阈值为flush size(默认128M) * 2,否则为MaxRegionFileSize(10G)。这种切分策略对于⼤集群中的大表、小表会⽐比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,⼩表不不会再产⽣⼤量的⼩region,⽽是适可⽽止。

  4. KeyPrefixRegionSplitPolicy

    根据rowKey的前缀对数据进行分组,这里是指定rowKey的前多少位作为前缀,⽐如rowKey都是16位的,指定前5位是前缀,那么前5位相同的rowKey在进⾏region split的时候会分到相同的region中。

  5. DelimitedKeyPrefixRegionSplitPolicy

    保证相同前缀的数据在同一个region中,例如rowKey的格式为:userid_eventtype_eventid,指定的delimiter为 _ ,则split的的时候会确保userid 相同的数据在同一个region中。

  6. DisabledRegionSplitPolicy

    不启用⾃动拆分, 需要指定⼿动拆分

RegionSplitPolicy的应⽤

Region拆分策略可以全局统一配置,也可以为单独的表指定拆分策略。

  1. 通过hbase-site.xml全局统一配置(对hbase所有表生效)

    <property>
    <name>hbase.regionserver.region.split.policyname>
    <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicyvalue>
    property>
  2. 通过Java API为单独的表指定Region拆分策略

    HTableDescriptor tableDesc = new HTableDescriptor("test1"); tableDesc.setValue(HTableDescriptor.SPLIT_POLICY, IncreasingToUpperBoundRegionSplitPolicy.class.getName()); tableDesc.addFamily(new HColumnDescriptor(Bytes.toBytes("cf1")));
    admin.createTable(tableDesc);
  3. 通过HBase Shell为单个表指定Region拆分策略

    create 'test2', {METADATA => {'SPLIT_POLICY' =>
    'org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy'}},{NAME => 'cf1'}

HBase表的预分区

为什么要预分区

当⼀个table刚被创建的时候,Hbase默认的分配⼀个region给table。也就是说这个时候,所有的读写请求都会访问到同一个regionServer的同一个region中,这个时候就达不到负载均衡的效果了,集群中的其他regionServer就可能会处于比较空闲的状态。解决这个问题可以用pre-splitting,在创建table的时候就配置好,生成多个 region。

  • 增加数据读写效率

  • 负载均衡,防⽌数据倾斜

  • ⽅便集群容灾调度region

    每⼀个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护

手动指定预分区
create 'person','info1','info2',SPLITS => ['1000','2000','3000']

也可以把分区规则创建于文件中

 vim split.txt

文件内容

 aaa
 bbb
 ccc
 ddd

执⾏

 create 'student','info',SPLITS_FILE => '/root/hbase/split.txt'

Region合并

Region合并说明

Region的合并不是为了性能,而是为了出于维护的目的

如何进行Region的合并
  1. 通过Merge类冷合并Region

  • 需要先关闭集群

  • 需求:需要把Student表中的2个Region数据进行合并

    这⾥通过org.apache.hadoop.hbase.util.Merge类来实现,不需要进入hbase shell,直接执⾏(需要先关闭hbase集群):

    hbase org.apache.hadoop.hbase.util.Merge student \ student,,1595256696737.fc3eff4765709e66a8524d3c3ab42d59. \ student,aaa,1595256696737.1d53d6c1ce0c1bed269b16b6514131d0.
  1. 通过online_merge热合并Region

  • 不需要关闭集群

    与冷合并不同的是,online_merge的传参是Region的hash值,而Region的hash值就是Region名称的最后那段在两个.之间的字符串部分。
    需求:需要把lagou_s表中的2个region数据进行合并: student,,1587392159085.9ca8689901008946793b8d5fa5898e06. \ student,aaa,1587392159085.601d5741608cedb677634f8f7257e000.
    需要进⼊入hbase shell:
    merge_region 'c8bc666507d9e45523aebaffa88ffdd6','02a9dfdf6ff42ae9f0524a3d8f4c7777'

成功后在观察页面

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

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

相关文章

win10 没有计算机策略,Win10家庭版没有组策略怎么办?Win10家庭版打开组策略方法...

Win10主要分为专业版、家庭版和企业版三个版本&#xff0c;其中大多数普通用户用的基本是专业版或家庭版。其中Win10家庭版中并不包含组策略&#xff0c;这意味着对于使用家庭版用户来说&#xff0c;无法借助组策略来优化维护系统。那么&#xff0c;Win10家庭版没有组策略怎么办…

2021 icme_重磅 | 2021年U.S. News 全美院校排名发布,疫情之下,排名大洗牌?!

希望你每天都来看我&#xff01;点击上方“PH留学”-->点击右上角“...” -->点选“设为星标?”小编前言上周Times发布了2021高等教育世界大学排名重磅 | 2021年THE世界大学排名发布&#xff0c;美国高校依然站在留学鄙视链顶端&#xff01;当时我们说四大权威世界大学排…

武侠乂服务器位置在哪,武侠乂手游秘境在哪里 地图秘境宝藏分布位置大全

吃鸡游戏就是前期各种捡东西&#xff0c;然后打家劫舍&#xff0c;后期才有几率吃鸡&#xff0c;而这款游戏除了物资点&#xff0c;还有秘境宝藏&#xff0c;来随小编看看武侠乂手游秘境在哪里吧。宏镇秘境杨家村深潭杨家村深潭直接从高处跳进水潭&#xff0c;里面有个打坐的地…

判断按键值_ALIENTEK 阿波罗 STM32F767 开发板资料连载第七章 按键输入实验

1)实验平台&#xff1a;alientek 阿波罗 STM32F767 开发板2)摘自《STM32F7 开发指南(HAL 库版)》关注官方微信号公众号&#xff0c;获取更多资料&#xff1a;正点原子第七章 按键输入实验上一章&#xff0c;我们介绍了 STM32F7 的 IO 口作为输出的使用&#xff0c;这一章&#…

ajax能运用到app吗,Jquery之Ajax运用 学习运用篇

还是先说一些基础知识&#xff1a;语法&#xff1a;$.ajax({option})option表示参数。以key/value形式出现。常用参数&#xff1a;type:post/get。url:发送请求的地址。data:{object:object} 发送到服务器的数据&#xff0c;必须为key/value格式。可以设置processData属性&…

四线接近开关接线图_开关、电机、断路器、电热偶、电表接线图!非常齐全,快囤起来吧...

这是非常齐全的一篇电工接线图的文章&#xff0c;包含开关接线图断路器、接触器控制回路接线图&#xff0c;电机逆转、正转原理接线图&#xff0c;电表进出接线图&#xff0c;电路开关接线图&#xff0c;电热偶接线图&#xff0c;希望能帮到想学这些专业的朋友&#xff0c;不是…

cpu开机就是60℃_铅锤哥:十五种电脑开机黑屏的原因与解决思路

点击上面↑玩转电脑关注铅锤哥&#xff0c;轻松学电脑最近&#xff0c;很多朋友联系铅锤哥&#xff0c;由于疫情影响不能出门&#xff0c;很多同学只能把家里闲置很久的电脑拿出来办公或者上课&#xff0c;但是一开机&#xff0c;发现电脑黑屏没法用了。一般常说的黑屏故障分为…

文件 云存储服务器配置,文件和存储服务器配置

文件和存储服务器配置 内容精选换一换本课程主要针对openEuler操作系统工程师在基础运维工作&#xff0c;以文件共享服务器的搭建和运维为案例&#xff0c;讲解openEuler操作系统的基础知识&#xff0c;并培养基础运维操作能力。通过该课程的学习&#xff0c;能掌握openEuler操…

delphi 企业微信消息机器人_企业微信—群聊机器人

在企业微信群聊机器人接口对接天气API使用过程中&#xff0c;遇到 过一个问题&#xff0c;就是对于嵌套json数据如何进行嵌套的|一&#xff1a;"msgtype": "text",curl http://qyapi.weixin.qq.com/cgi-bin/webhook/send?key633a31f6-7f9c-4bc4-97a0-0ec1…

docker卸载命令_Docker入门篇

Docker简介Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口Docker优…

属于服务器操作系统的是,属于服务器操作系统的是

属于服务器操作系统的是 内容精选换一换裸金属服务器操作系统无法正常启动&#xff0c;操作系统中毒&#xff0c;或裸金属服务器系统运行正常&#xff0c;但需要对系统进行优化&#xff0c;使其在最优状态下工作时&#xff0c;用户可以使用重装裸金属服务器的操作系统功能。重装…

lds天线技术流程图_音箱耳机入门,蓝牙真无线耳机中的LDS天线 「Soomal」

在2019年新一代的真无线耳机中&#xff0c;我们听到了比较多关于“LDS”天线的概念&#xff0c;它到底是什么样子的呢&#xff1f;我们通过漫步者TWS1和TWS5两款真无线耳机拆解&#xff0c;来看看真无线蓝牙耳机天线的样子。其中&#xff0c;TWS1不是LDS天线&#xff0c;而TWS5…

ubuntu修改服务器端口,服务器环境之4:ubuntu14.04安装tomcat,端口修改

一、下载tomcat二、上传服务器并解压1.创建文件夹mkdir /usr/java/tomcatcd /usr/java/tomcat2.上传rz -e弹出窗口中选择下载好的tar.gz文件&#xff0c;点击确认 3.解压tar -xzf apache-tomcat-8.0.36.tar.gz4.修改文件夹名(习惯&#xff0c;可跳过mv apache-tomcat-8.0.36 to…

hashmap为什么线程不安全_什么时候线程不安全?怎样做到线程安全?怎么扩展线程安全的类?...

本文同名博客老炮说Java&#xff1a;https://www.laopaojava.com/&#xff0c;每天更新Spring/SpringMvc/SpringBoot/实战项目等文章资料顺便再给大家推荐一套SpringCloud微服务教程&#xff0c;方便学习&#xff1a;SpringCloud微服务电商项目教程 - 老炮说Java-程序员编程资料…

光遇服务器维护都在干什么,光遇:全图毕业后该做什么?老玩家建议,这四件事不做会后悔...

原标题&#xff1a;光遇&#xff1a;全图毕业后该做什么&#xff1f;老玩家建议&#xff0c;这四件事不做会后悔光遇&#xff1a;全图毕业后该做什么&#xff1f;老玩家建议&#xff0c;这四件事不做会后悔前言&#xff1a;大家好&#xff0c;我是喜欢玩游戏、聊游戏的孟婆小叔…

加仓减仓口诀_做短线必备口诀

October短线口诀早上大跌可加仓&#xff0c;早上大涨要减仓下午大涨要减仓&#xff0c;下午大跌次日买上午下跌不买股&#xff0c;逢低加仓T0下午拉高不追涨&#xff0c;逢高减仓T1量价买卖口诀高位无量就拿&#xff0c;就算拿错也要拿高位放量趁早跑&#xff0c;哪怕跑错也要跑…

包无法安装_R语言基础教程——第2章:R下载安装和环境搭建

R语言安装包下载 官网下载R安装包 下载地址为&#xff1a;https://cran.r-project.org 进入链接&#xff0c;如下图所示&#xff0c;在页面顶部提供了三个下载链接&#xff0c;分别对应三种操作系统&#xff1a;Windows、Mac和Linux。请选择自己操作系统对应的链接。这里以Wind…

charat越界返回什么_Java基本语法方法修饰符返回类型参数列表异常列表

方法[method name]定义方法[method]是类的成员之一&#xff0c;(因为在java中&#xff0c;方法不能单独定义&#xff0c;它必须在类之中)。修饰符 返回类型 方法名()[throws 异常类型]{ //方法体}方法名字&#xff1a;只要是一个合法的名字就可以&#xff0c;尽可能有意义。如&…

打包指令_Linux系统常用指令总结

来源 | CSDN 博客作者 | 不撸代码闲得慌&#xff0c;责编 | Carol出品 | CSDN云计算(ID&#xff1a;CSDNcloud)系统的运行级别0&#xff1a;关机1&#xff1a;单用户模式(可以找回丢失的密码)2&#xff1a;多用户状态没有网络服务3&#xff1a;多用户状态有网络服务4&#xff1…

cmd管道无法接收特定程序返回值_渗透不会反弹shell?来教你写一个cmd的shell

渗透不会反弹shell&#xff1f;来教你写一个cmd的shell包含的库&#xff1a;#include #include #include #include #include #pragma comment(lib, "Ws2_32.lib")#define DEFAULT_BUFLEN 1024winsock2和ws2tcpip两个库文件是用来初始化网络套接字的。windows用来初始…