HBase详解(2)

HBase

结构

HRegion

概述
  1. 在HBase中,会从行键方向上对表来进行切分,切分出来的每一个结构称之为是一个HRegion

  2. 切分之后,每一个HRegion会交给某一个HRegionServer来进行管理。HRegionServer是HBase的从节点,每一个HRegionServer可以管理多个HRegion

  3. 如果新建了一个表,那么这个表中只包含1个HRegion

  4. 在HBase中,因为行键是有序(字典序)的,所以切分出来的每一个HRegion之间的数据是不交叉的,因此HBase可以将接收到的不同的请求分发到不同的HRegionServer来进行处理,从而能够有效的避免请求集中到一个节点上

  5. 随着运行时间的推移,每一个HRegion中管理的数据都会越来越多,当HRegion管理的数据达到指定大小的时候,会进行分裂,分裂为两个HRegion

  6. 刚分裂完成之后,两个HRegion还暂时处于同一个HRegionServer上。但是HBase为了节点之间的负载均衡,可能会将其中一个HRegion转移给其他的HRegionServer来进行管理。注意:此时不会发生大量的数据迁移!HBase的数据是存储在HDFS上的,HRegion只是HBase提供的一个用于管理数据的结构!

  7. 每一个HRegion中,会包含至少1个HStore,可以包含多个HStore。HStore的数量是由列族的数量来决定 - 每一个列队都对应了一个HStore

  8. 每一个HStore中会包含1个memStore以及0到多个StoreFile/HFile

分裂策略
  1. 在HBase2.x中,支持7中分裂策略:ConstantSizeRegionSplitPolicyIncreasingToUpperBoundRegionSplitPolicyKeyPrefixRegionSplitPolicyDelimitedKeyPrefixRegionSplitPolicySteppingSplitPolicyBusyRegionSplitPolicyDisabledRegionSplitPolicy

  2. ConstantSizeRegionSplitPolicy:固定大小分裂,默认情况下,这个策略下,当HRegion的大小达到10G的时候,会均分为两个HRegion。可以通过属性hbase.hregion.max.filesize来调节,单位是字节,默认值是10737418240

  3. IncreasingToUpperBoundRegionSplitPolicy:HBase1.2及之前版本默认采用的就是这个策略。这个策略的特点:前几次分裂不是固定的数据,而是需要通过计算来获取

    1. 如果HRegion的数量超过了100,那么就按照hbase.hregion.max.filesize(默认值是10G)大小来分裂

    2. 如果HRegion的数量在1-100之间,那么按照min(hbase.hregion.max.filesize, regionCount^3 * initialSize)来计算,其中regionCount表示HRegion的个数,initialSize是HRegion的大小,initialSize的默认值是2 * hbase.hregion.memstreo.flush.size(默认值是134217728B)

    3. initialSize的值可以通过属性hbase.increasing.policy.initial.size来指定,单位是字节

  4. KeyPrefixRegionSplitPolicyIncreasingToUpperBoundRegionSplitPolicy的子类,在IncreasingToUpperBoundRegionSplitPolicy的基础上,添加了行键的判断,会将行键前缀相同(默认读取行键的前五个字节)的数据拆分到同一个HRegion中。这种分裂策略会导致拆分之后的两个HRegion之间不等大

  5. DelimitedKeyPrefixRegionSplitPolicy:例如当行键是video_001txt_001log_003等,此时希望行键是以_作为拆分单位,那么此时就需要使用DelimitedKeyPrefixRegionSplitPolicy

  6. SteppingSplitPolicy:HBase2.X默认使用的就是这个策略

    1. 如果这个表中只有1个HRegion,那么按照2 * hbase.hregion.memstreo.flush.size来进行分裂

    2. 如果这个表中HRegion的个数超过1个,那么按照hbase.hregion.max.filesize来进行分类

  7. BusyRegionSplitPolicy:这个策略只有在HBase2.x中可以使用,是IncreasingToUpperBoundRegionSplitPolicy的子类

    1. IncreasingToUpperBoundRegionSplitPolicy的基础上,添加了热点策略。热点指的是在一段时间内被频繁访问的数据。如果某一个写数据是热点数据,那么HRegion会将这些数据拆分到同一个HRegion中

    2. 判断一个HRegion是否是热点的HRegion,计算方式

      1. 判断条件:当前时间-上一次检测时间≥hbase.busy.policy.aggWindow,这样做的目的是为了控制后续计算的频率

      2. 计算请求的被阻塞率:aggBlockedRate = 一段时间内被阻塞的请求数 / 总的请求数量

      3. 判断条件:如果aggBlockedRate > hbase.busy.policy.blockedRequests,且该HRegion的繁忙时间 ≥ hbase.busy.policy.minAge,那么判定这个HRegion就是一个热点HRegion

    3. hbase.busy.policy.aggWindow的值默认是300000,单位是毫秒,即5min;hbase.busy.policy.blockedRequests的值默认是0.2fhbase.busy.policy.minAge的默认值是600000,单位是毫秒,即10min

    4. 默认情况下,每隔5min进行一次检测计算,如果该HRegion被频繁访问了10min,且该HRegion的阻塞率超过了20%,那么此时就认为这个HRegion是一个热点HRegion

  8. DisabledRegionSplitPolicy:禁用分裂策略,禁止HRegion的自动分裂。实际过程中较少使用,除非能够预估数据量

HBase的结构

Zookeeper的作用
  1. Zookeeper在HBase中充当了注册中心,即HBase集群中每一个节点启动之后,都会在Zookeeper来注册节点

  2. HBase集群启动之后,会在Zookeeper上来注册一个/hbase节点

  3. 当Active HMaster启动之后,会自动的在Zookeeper上注册一个临时节点/hbase/master

  4. 当Backup HMaster启动之后,会自动的在Zookeeper上的/hbase/backup-masters下来注册临时子节点。例如hadoop02上启动Backup HMaster,那么在Zookeeper上注册的节点/hbase/backup-masters/hadoop02,16000,1712459407965

  5. 当HRegionServer启动之后,会自动的在Zookeeper上的/hbase/rs下来注册临时子节点。例如hadoop01上启动HRegionServer,那么在Zookeeper上注册的节点/hbase/rs/hadoop01,16020,1712459960698

HMaster
  1. HBase是一个典型的主从结构,主节点是HMaster,从节点是HRegionServer。在HBase中,并不限制HMaster的个数,可以在任意一台安装了HBase的节点上来启动HMaster

    hbase-daemon.sh start master
  2. 因此HBase不限制HMaster的个数,所以理论上而言,HMaster不存在单点故障

  3. 当HBase集群中存在多个HMaster的时候,此时多个HMaster之间会存在ActiveBackup状态

  4. 为了保证数据的一致性,Active HMaster在接收到请求之后,会将信息同步给其他的Backup HMasters,同步的节点数量越多,效率会越低。也因此,虽然HBase中不限制HMaster的个数 ,但是实际过程中HMaster的数量一般不超过3个(1个Active HMaster + 2个Backup HMaster)

  5. Active HMaster会实时监控Zookeeper上/hbase/backup-masters下的子节点变化,以确定下一次需要将数据同步给哪些节点

  6. 当Zookeeper发现/hbase/master节点消失的时候,意味着Active HMaster宕机,那么此时Zookeeper会从/hbase/backup-masters的子节点中挑选一个切换为Active状态

  7. HMaster的作用

    1. 管理HRegionServer,但是不同于NameNode对于DataNode的掌控,HMaster主要是负责HRegion在HRegionServer之间的分布和转移,即HRegion交给HRegionServer来管理,由HMaster决定

    2. 记录和管理元数据。HBase中的元数据包含:namespace的信息,表信息,列族信息等。也因此,凡是产生元数据的操作(DDL,createdropalterlistenabledisable等)会经过HMaster,凡是不产生元数据的操作(DML,例如putappendgetscandeletedeleteall等)不会经过HMaster

HBase架构的读写流程
  1. 客户端先访问Zookeeper,从Zookeeper中获取hbase:meta文件的存储位置

  2. 客户端获取到hbase:meta文件的位置之后,访问HRegionServer,读取hbase:meta文件

  3. 客户端会从hbase:meta文件中获取到要操作的HRegion所在的位置

  4. 客户端获取到HRegion的位置之后,会访问对应的HRegionServer,来试着操作这个HRegion

  5. 注意:HBase为了提高访问效率,还大量的应用了缓存机制

    1. 在客户端第一次访问Zookeeper之后,会缓存hbase:meta文件的位置,那么后续这个客户端在发起请求的时候,就可以不用访问Zookeeper

    2. 客户端在获取到HRegion的位置之后,还会缓存这个HRegion的位置,那么后续如果操作的是同一个HRegion,还可以减少对元数据的读取

    3. 如果这个过程中,发生了内存崩溃或者HRegion的分裂或者转移,会导致缓存失效

HRegionServer
  1. HRegionServer是HBase的从节点,负责管理HRegion。根据官方文档给定,每一个HRegionServer大约可以管理1000个HRegion

  2. 每一个HRegionServer中包含1到多个WAL,1个BlockCache以及0到多个HRegion

  3. WAL(Write Ahead Log):发生在写操作之前的日志,在早期的版本中也称之为HLog

    1. WAL类似于HDFS中的edits文件。当HRegionServer接收到写操作之后,会先将这个命令记录到WAL中,然后再将数据更新到对应的HRegion的HStore的memStore中

    2. 在HBase0.94版本之前,WAL采用的是串行写机制。从HBase0.94开始,引入了NIO中的Channel,从而支持了并行写机制,因此能够提高WAL的写入效率,从而提升HBase的并发量

    3. 通过WAL机制,能够有效的保证数据不会产生丢失,因为WAL是落地到的磁盘上的,因此会一定程度上降低写入效率。实际过程中,如果能够接收一定程度的数据丢失,那么可以关闭WAL

    4. 当WAL写满之后,会产生一个新的WAL。单个WAL文件的大小由属性hbase.regionserver.hlog.blocksize * hbase.regionserver.logroll.multiplier来决定

      1. 早期的时候,hbase.regionserver.hlog.blocksize的值默认和HDFS的Block等大,从HBase2.5开始,hbase.regionserver.hlog.blocksize的值默认是HDFS Block的2倍大

      2. 早期的时候,hbase.regionserver.logroll.multiplier的,默认值是0.95,从HBase2.5开始,hbase.regionserver.logroll.multiplier的值是0.5

    5. 随着运行时间的推移,WAL的数量会越来越多,占用的磁盘会越来越多。因此,当WAL文件的个数超过指定数量的时候,按照时间顺序将产生的比较早的WAL清理掉。早期的时候,WAL的数量由hbase.regionserver.max.logs来决定,默认值是32;从HBase2.x开始,这个属性被废弃掉,固定值就是32

  4. BlockCache:数据块缓存

    1. 本质上就是一个读缓存,维系在内存中。早期的时候,BlockCache的大小是128M,从HBase2.x开始,是通过属性hfile.block.cache.size来调节,默认值是0.4,即最多占用服务器内存的40%

    2. 需要注意的是,如果hbase.regionserver.global.memstore.size + hfile.block.cache.size > 0.8,即这个HRegionServer上所有的memStore所占内存之和 + BlockCache占用的内存大小 > 服务器内存 * 0.8,那么HRegionServer就会报错

    3. 当从HRegionServer来读取数据的时候,数据会先缓存到BlockCache中,然后再返回给客户端;客户端下一次读取的时候,可以直接从BlockCache中获取数据

    4. BlockCache在进行缓存的时候,还会采用"局部性"原理。所谓的"局部性"原理本质上就是根据时间或者空间规律来提高猜测的命中率

      1. 时间局部性:当一条数据被读取之后,HRegionServer会认为这条数据被再次读取的概率要高于其他没有被读取过的数据,那么此时HRegionServer就会将这条数据放入BlockCache中

      2. 空间局部性:当一条数据被读取之后,HRegionServer会认为与这条数据相邻的数据被读取的概率要高于其他的数据,那么此时HRegionServer会将与这条数据相邻的数据也放入BlockCache中

    5. BlockCache还采用了LRU(Least Recently Used,最近最少使用)策略。除了LRUBlockCache以外,HBase还支持SlabBlockCache和BucketBlockCache

  5. HRegion:HBase中分布式存储和管理的基本单位

    1. 每一个HRegion中包含1个到多个HStore,HStore的数量由列族数量来决定

    2. 每一个HStore中会包含1个memStore以及0到多个HFile/StoreFile

    3. memStore本质上是一个写缓存

      1. HStore在接收到数据之后,会将数据临时存储到memStore中

      2. memStore是维系在内存中,由属性hbase.regionserver.memstore.flush.size来决定,默认值是134217728B

      3. 当达到一定条件的时候,HRegionServer会将memStore中的数据进行flush(冲刷)操作,每次冲刷都会产生一个新的HFile

      4. HFile最终会以Block形式落地到HDFS上

    4. memStore的flush条件

      1. 当某一个memStore被用满之后,这个memStore所在的HRegion中的所有的memStore都会进行冲刷

      2. 当HRegionServer上,所有memStore所占内存之和 ≥ java_heapsize * hbase.regionserver.global.memstore.size * hbase.regionserver.global.memstore.upperLimit,按照memStore的大小来依次冲刷,直到不满足上述条件为止。

        1. java_heapsize:java的堆内存大小

        2. hbase.regionserver.global.memstore.size:所有的memStore所能占用的内存比例,默认是0.4

        3. hbase.regionserver.global.memstore.upperLimit:上限,默认是0.95

        4. 假设服务器内存是128G,如果所有的memStore所占内存之和≥128G*0.4*0.95,将memStore从大到小依次冲刷,直到不满足条件为止

      3. 如果WAL的数量达到指定值,由于WAL会被清理掉,所以为了保证数据不丢失,那么会按照时间顺序,将memStore来依次冲刷

      4. 当距离上一次冲刷达到指定的时间间隔(可以通过属性hbase.regionserver.optionalflushinterval来指定,单位是毫秒,默认值是3600000)的时候,也会自动的触发memStore的冲刷

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙内核源码分析 (双向链表篇) | 谁是内核最重要结构体

双向链表是什么&#xff1f; 谁是鸿蒙内核最重要的结构体 &#xff1f; 一定是: LOS_DL_LIST(双向链表)&#xff0c; 它长这样。 typedef struct LOS_DL_LIST {struct LOS_DL_LIST *pstPrev; /**< Current nodes pointer to the previous node | 前驱节点(左手)*/struct L…

【开发环境搭建篇】安装Anaconda

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;介绍Python编程入门相关的内容&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、下载三、安装四、配置环境变量五、创建虚拟环境六、总结 一、前言 学习Python编程&#xff0c;…

什么是MQ ?为什么用MQ?

什么是MQ&#xff1f; MQ(message queue)&#xff08;消息队列&#xff09;&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO先入先出&#xff0c;只不过队列中存放的内容是message而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息…

C++分析程序各模块耗时-perf火焰图

C分析程序各模块耗时-perf火焰图 1. 简介2. 安装3. 测试示例4. 从火焰图可以获得的信息5. 生成火焰图常见问题 Reference: Perf Wiki【性能】perf 火焰图分析软件性能瓶颈【火焰图&#x1f525;】Linux C/C性能优化分析工具Perf使用教程 perf: Linux profiling with perform…

如何用Java后端处理JS.XHR请求

Touching searching engine destroies dream to utilize php in tomcat vector.The brave isn’t knocked down&#xff0c;turn its path to java back-end. Java Servlet Bible schematic of interaction between JS front-end and Java back-end Question 如何利用Java…

SKF的便携式分析系统简介

1.系统简介 SKF是知名的轴承供应商。它的行业知识文档非常丰富。这里摘录一下它的当前的振动分析系统。可以在构建自己的振动分析系统时参考。它的手机应用不知道是否与传感器绑定。国内下载不方便&#xff0c;我回头找找上传后把App链接留在这里。 SKF的振动分析系统&#x…

JAVA—抽象—定义抽象类Converter及其子类WeightConverter

同样&#xff0c;我们由这道题引出抽象类&#xff0c;抽象方法这个概念。 按下面要求定义类Converter及其子类WeightConverter 定义抽象类&#xff1a;Converter&#xff1a; 定义一个抽象类Converter&#xff0c;表示换算器&#xff0c;其定义的如下&#xff1a; 一个私有…

SV学习笔记(五)

文章目录 线程的使用程序和模块什么是线程线程的概念澄清 线程的控制fork并行线程语句块fork…joinfork…join_any等待所有衍生线程停止单个线程停止多个线程停止被多次调用的任务 线程的通信写在前面event事件通知的需求semaphore旗语mailbox信箱三种通信的比较和应用 参考资料…

免疫检查点信号转导和癌症免疫治疗(文献)

目录 基础 介绍 免疫检查点的表面调控&#xff08;细胞膜层面&#xff09; ​编辑 PD-1调节 PD-L1调节 CTLA-4 调节 检查点信号通路 关于靶点研究 展望 Immune checkpoint signaling and cancer immunotherapy - PubMed (nih.gov) 基础 【中英字幕】肿瘤免疫疗法之免…

Java开发测试(第一篇):Java测试框架JUnit5

目录 1.基本介绍 2.maven中安装JUnit5 3.使用 4.JUnit5命名规则 5.JUnit5常用注解 6.JUnit5断言 7.JUnit5多个类之间的继承关系 8.JUnit5参数化 &#xff08;1&#xff09;使用场景&#xff1a; &#xff08;2&#xff09;使用前需在pom.xml文件中导入依赖 &#xff…

蓝桥杯刷题-13-子矩阵-二维滑动窗口 ಥ_ಥ

给定一个 n m &#xff08;n 行 m 列&#xff09;的矩阵。 设一个矩阵的价值为其所有数中的最大值和最小值的乘积。求给定矩阵的所有大小为 a b &#xff08;a 行 b 列&#xff09;的子矩阵的价值的和。 答案可能很大&#xff0c;你只需要输出答案对 998244353 取模后的结果。…

电力行业智能升级:IEC104网关在电网中的作用

IEC104是国际电工委员会&#xff08;IEC&#xff09;制定的一套用于电力自动化的通信协议。通过IEC104规约可以实现实时监测电力系统的状态、采集各种数据、控制设备的运行和保护等功能&#xff0c;为电力系统的安全稳定运行提供了重要的支持。 钡铼技术IEC104网关可实现对IEC-…

Java零基础入门-综合案例(File类+递归)

一、概述 java零基础教学也讲了一阵子了&#xff0c;从jdk安装到第一个java程序再到如今的java File类&#xff0c;递归思想等&#xff0c;不知道你们对于此教学有没有啥建议&#xff0c;毕竟看着浏览量不是很可人&#xff0c;所以在开启此篇前&#xff0c;我想统计一下&#x…

MyBatis操作数据库(1)

前言 在应用分层的学习时, 我们了解到web应用程序一般分为三层,即Controller, Service, Dao. 之前的案例中, 请求流程如下: 浏览器发起请求, 先请求Controller, Controller接受到请求后,调用Service进行业务逻辑处理, Service再调用Dao, 但是Dao层的数据是Mock的, 真实的数据…

JavaWeb后端——Mybatis

概述 Mybatis&#xff1a;Java程序来对数据库进行操作&#xff0c;一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 SSM&#xff1a;SpringMVC、Spring、Mybatis 快速入门 步骤2&#xff1a;注意数据库连接的四要素 application.properties&#xff1a;springboot 的默…

pytorch 演示 tensor并行

pytorch 演示 tensor并行 一.原理二.实现代码 本文演示了tensor并行的原理。如何将二个mlp切分到多张GPU上分别计算自己的分块,最后做一次reduce。 1.为了避免中间数据产生集合通信,A矩阵只能列切分,只计算全部batch*seqlen的部分feature 2.因为上面的步骤每张GPU只有部分featu…

布隆过滤器详解及java实现

什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种数据结构&#xff0c;用于判断一个元素是否属于一个集合。它的特点是高效地判断一个元素是否可能存在于集合中&#xff0c;但是存在一定的误判率。 布隆过滤器的基本原理是使用一个位数组…

【STL学习】(4)vector的模拟

前言 本文将模拟实现vector的常用功能&#xff0c;目的在于更深入理解vector。 一、前置知识 在模拟之前先对vector的结构和常用接口学习&#xff0c;有一个大致了解。看源码&#xff0c;本文参考的源码是SGI版本的stl3.0。 技巧&#xff1a; 看源码不要一行一行的看&#xff…

Severt

severt是让我们自己写一些类,然后把这些类给加载Tomcat中&#xff0c;后续Tomcat收到HTTP请求(来自于浏览器)&#xff0c;就会执行到咱们上面写的代码.从而通过这些代码,完成一定的业务逻辑. 创建项目 此处创建的是一种新的项目的形式称为Maven项目,Maven是Java 中的一个的构建…

libVLC 音频立体声模式切换

在libVLC中&#xff0c;可以使用libvlc_audio_set_channel函数来设置音频的立体声模式。这个函数允许选择不同的音频通道&#xff0c;例如立体声、左声道、右声道、环绕声等。 /*** Set current audio channel.** \param p_mi media player* \param channel the audio channel…