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的冲刷

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

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

相关文章

华为海思2024春招数字芯片岗机试题(共9套)

huawei海思2024春招数字芯片岗机试题(共9套)(WX:didadidadidida313,加我备注:CSDN huawei数字题目,谢绝白嫖哈) 题目包含数字集成电路、System Verilog、Verilog2001、半导体制造技术、高级ASIC芯片综合、…

SpringCloud Alibaba Sentinel 实现熔断功能

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第十六篇,即使用 Sentinel 实现熔断功能。 二、 Ribbon 系列 首先我们新建两个服务的提供者…

【数据结构与算法】:快速排序和冒泡排序

一,快速排序 快速排序是一种比较复杂的排序算法,它总共有4种实现方式,分别是挖坑法,左右"指针"法,前后"指针"法,以及非递归的快速排序,并且这些算法中也会涉及多种优化措施…

1. 先简单看看项目吧

前言 就目前的前端生态而言,跨端开发基本算是每一个前端开发者必备的技能点之一了,随便看看各大招聘网站上关于前端岗位的招聘要求,几乎都要小程序开发了.... 另外由于Uni-app等这些跨端框架的产生,中小型企业对于Android/Ios等…

APP的UI设计规范

APP的设计规范是一系列原则和标准,旨在确保应用程序提供一致、易用且美观的用户体验。以下是一些关键的APP设计规范。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.一致性: 保持界面元素和交互行为的一致性…

网络协议——HTTP协议

目录 ​编辑 一,HTTP协议基本认识 二,认识URL 三,http协议的格式 1,发送格式 2,回应格式 四,服务端代码 五,http报文细节 1,Post与Get方法 2,Content_lenth 3&…

vscode教程

个人笔记(整理不易,有帮助点个赞) 笔记目录:学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔:工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

zheng项目:从零到一打造全方位J2EE企业级开发解决方案

zheng项目:从零到一打造全方位J2EE企业级开发解决方案 摘要: 在当今快速发展的企业级应用开发领域,一套高效、稳定且可扩展的解决方案对于企业的成功至关重要。zheng项目旨在提供一套全面的J2EE企业级开发解决方案,从前端模板到自…

Leetcode 581. 最短无序连续子数组

心路历程: 本以为这道题要用动态规划求解,因为题目中这几个关键字与动态规划太匹配了,结果想了半天也没发现dp(i)和dp(i-1)的递推关系。 这道题本意考察双指针的做法,也可以用排序后做比较的方式来做。 注意的点: 1…

性能优化 - 你能说一说,为什么做了骨架屏,FCP的指标还是没有提升吗

难度级别:中高级及以上 提问概率:80% FCP的全程是First Contentful Paint,是衡量网页性能的一个重要指标,很多人把FCP理解为元素内容首次渲染到浏览器上的时间。但由于现在比较流行的Vue或是React项目中,HTML文档最初只有一个id为app的DIV…

React18从入门到实战

文章目录 一、React环境的搭建二、项目文件的介绍(1)package.json,他是项目存放依赖包的地方,里面包括了一些项目核心包及下载的其他插件包(2)src文件夹是项目源码目录,平时开发页面就在其中&am…

Linux从入门到精通 --- 4(上).快捷键、软件安装、systemctl、软链接、日期和时区、IP地址

文章目录 第四章(上):4.1 快捷键4.1.1 ctrl c 强制停止4.1.2 ctrl d 退出4.1.3 history4.1.4 历史命令搜索4.1.5 光速移动快捷键4.1.6 清屏 4.2 软件安装4.2.1 yum4.2.2 apt 4.3 systemctl4.4 软链接4.4.1 ln 4.5 日期和时区4.5.1 date命令4.5.2 date进行日期加减…

如何魔改 diffusers 中的 pipelines

如何魔改 diffusers 中的 pipelines 整个 Stable Diffusion 及其 pipeline 长得就很适合 hack 的样子。不管是通过简单地调整采样过程中的一些参数,还是直接魔改 pipeline 内部甚至 UNet 内部的 Attention,都可以实现很多有趣的功能或采样生图结果。 本…

从0到1搭建文档库——sphinx + git + read the docs

sphinx git read the docs 目录 一、sphinx 1 sphinx的安装 2 本地构建文件框架 1)创建基本框架(生成index.rst ;conf.py) conf.py默认内容 index.rst默认内容 2)生成页面(Windows系统下&#xf…

项目:自主实现Boost搜索引擎

文章目录 写在前面开源仓库和项目上线其他文档说明 项目背景项目的宏观原理技术栈与环境搜索引擎原理正排索引倒排索引 去标签和数据清洗模块html文件名路径保存函数html数据解析函数文件写入函数 建立索引模块检索和读取信息建立索引建立正排索引建立倒排索引jieba工具的使用倒…

基于FPGA的按键消抖

按键工作原理 当KEY1按下时,整条电路就会导通,这个时候KEY1就是低电平; 当KEY1松开时,整条电路就会断开,这个时候KEY1就是高定平; 我们可以通过判断KEY1的高低电平来判断按键是否被按下。 为什么按键消…

关于ansible的模块 ③

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 接《关于Ansible的模块①》和《关于Ansible的模块②》,继续学习ansible的user模块。 user模块可以增、删、改linux远…

idea 开发serlvet汽车租赁管理系统idea开发sqlserver数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 汽车租赁管理系统是一套完善的web设计系统sqlserver数据库 系统采用serlvetdaobean mvc 模式开发,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 java se…

移动平台相关(安卓)

目录 安卓开发 Unity打包安卓 ​编辑​编辑 BuildSettings PlayerSettings OtherSettings 身份证明 配置 脚本编译 优化 PublishingSettings 调试 ReMote Android Logcat AndroidStudio的调试 Java语法 ​编辑​编辑​编辑 变量 运算符 ​编辑​编辑​编辑​…

猫咪也爱美食!这款猫粮让你的猫主子欲罢不能!

👋 亲爱的宠友们,最近我也在为家里的猫主子换猫粮的事情犯愁呢!我知道,给猫咪选择一款合适的猫粮真的是个挺重要的事情。我家猫咪现在吃的是福派斯牛肉高脂猫粮,感觉还不错。 🐱 首先说说我家猫咪的情况吧。…