HBase分布式数据库入门到精通

文章目录

HBase分布式数据库入门到精通

一、简单介绍

二、HBase数据模型

三、HBase的架构

四、HBase写操作流程

五、HBase读操作流程

六、HBase minor小合并和major大合并

七、HBase目标表meta表

八、HBase特点

九、HBase的使用场景


HBase分布式数据库入门到精通

一、简单介绍

HBase是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式 NOSQL 数据库。

当你需要随机、实时读/写访问大数据时,请使用 Apache HBase。

作用:主要用来存储非结构化、半结构化和结构化的松散数据(列式存储的 NoSQL 数据库)

名称解释:

  • NameSpace 命名空间,相当于关系型数据库中的 database,每个命名空间下有多个表。Hbase 默认自带的命名空间 hbase 和 default;hbase 中存放的是 HBase 内置的表,default 是用户默认使用的命名空间。

  • Region 类似关系型数据库的表,不同之处在于 HBase 定义表示只需要声明列族,不需要声明具体的列。列可以动态的按需要指定;HBase 更加适合字段经常变更的场景。开始创建表是一个表对应一个 region,当表增大到一定值是会被拆分为两个 region。

  • Row HBase 表中的每行数据被称为 Row,由一个 RowKey 和多个 Column 组成,数据是按照 RowKey 的字典顺序存储的,并且查询是只能根据 RowKey 进行检索,所以 RowKey 的设计很关键。

  • Column 列是由列族(Column Family)和列限定符(Column Qualifier)进行限定,例如: base:name,base:sex。建表示只需定义列族,而列限定符无需预先定义。

  • Cell 某行中的某一列被称为 Cell(单元格),由{rowkey,column family:columnqualifier,timestamp}确定单元。Cell 中没有具体的类型,全部是字节码的形式(字节数组)存储。

  • TimeStamp 用于标识数据的不同版本(version),每条数据写入时,如果不指定时间戳,系统会自动为其加上该字段,值为写入 HBase 的时间。

 

二、HBase数据模型

逻辑上,HBase 的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从底层物理存储结构(Key-Value)来看,HBase 更像一个 Map。

HBase的逻辑结构如下:

HBase的物理存储结构

 

三、HBase的架构

  • client

1)包含访问HBase的接口,对HBase进行访问

2)客户端通过查询zookeeper中信息获取HBase集群信息。

  • zookeeper

1)保证任何时候,集群中只有一个master

2)存贮所有Region的寻址入口。

3)实时监控RegionServer的上线和下线信息,并实时通知HMaster。

4)存储HBase的Schema和table元数据

  • Master

1)为RegionServer分配Region

2)负责RegionServer的负载均衡

3)发现失效的RegionServer并重新分配其上的region

4)管理用户对table的增删改操作

  • RegionServer

1)RegionServer维护region,处理对这些Region的IO请求

2)RegionServer负责切分在运行过程中变得过大的Region 

  • HLog(WAL Log)

1)HLog文件就是一个普通的Hadoop Sequence File,Sequence File的Key是HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和region名字外,同时还包括sequence number和timestamp,timestamp是"写入时间",sequence number的起始值为0,或者是最近一次存入文件系 统中sequence number。

2)HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的KeyValue。

  • Region

1) HBase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据;每个表一开始只有一个region,随着数据不断插入表,Region不断增大,当增大到一个阀值的时候,Region就会等分会两个新的Region(裂变)。

2) 当table中的行不断增多,就会有越来越多的Region。这样一张完整的表被保存在多个Regionserver上。

  • Memstore&StoreFile

1)一个region由多个store组成,一个store对应一个CF(列族)

2)Store包括位于内存中的memstore和位于磁盘的storefile。写操作先写入Memstore,当Memstore中的数据达到某个阈值,HRegionserver会启动flashcache进程写入storefile,每次写入形成单独的一个storefile

3)StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中storefile文件的数量增长到一定阈值后,系统会进行合并(minor、 major compaction),在合并过程中会进行版本合并和删除工作(majar),将对同一个key的修改合并到一起,形成更大的storefile。

4)当一个region所有storefile的大小和超过一定阈值后,会把当前的region分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡。

5)客户端检索数据,先在memstore找,找不到再找storefile。

6) HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表示不同的HRegion可以分布在不同的HRegionServer上。

7)HRegion由一个或者多个Store组成,每个store保存一个columns family。

8)每个Strore又由一个memStore和0至多个StoreFile组成。

四、HBase写操作流程

1、Client发送请求从Zookeeper中获取HMaster的地址及meta表所在的RegionServer地址,向HRegionServer发出写数据请求。

2、数据被写入HRegion的MemStore,同时写入到HLog中。

3、MemStore中的数据被Flush成一个StoreFile

4、当MemStore达到阈值后把数据刷成一个storefile文件,当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,当compact后,逐渐形成越来越大的storefile。

5、StoreFile大小超过一定阈值后,触发Split操作,把当前HRegion Split成2个新的HRegion,父HRegion会下线,新Split出的2个子HRegion会被HMaster分配到相应的HRegionServer上,使得原先1个HRegion的压力得以分流到2个HRegion上。

6、若MemStore中的数据有丢失,则可以从HLog上恢复。

五、HBase读操作流程

1、client首先从zookeeper找到meta表的region的位置,然后读取meta表中的数据。而meta中又存储了用户表的region信息。

2、根据namespace、表名和rowkey根据meta表中的数据找到写入数据对于的region信息

3、找到对应的RegionServer,查找对应的Region,先从Memstore中找数据,如果没有再从StoreFile中读取数据。

六、HBase minor小合并和major大合并

当客户端向HBase中写入数据时,首先写入HLog和Memstore中,在一个Store中,当Memstore内存占满后,数据会写入磁盘形成一个新的数据存储文件(StoreFile),随着 memstore 的刷写会生成很多StoreFile,当一个store中的storefile达到一定的阈值后,就会进行一次合并,将对同一个key的修改合并到一起,形成一个大的storefile,当storefile的大小达到一定阈值后,又会对storefile进行split,划分为两个storefile。

由于对表的更新是不断追加的,合并时,需要访问store中全部的storefile和memstore,将它们按row key进行合并,由于storefile和memstore都是经过排序的,并且storefile带有内存中索引,合并的过程还是比较快的。

因为存储文件不可修改,HBase是无法通过移除某个键/值来简单的删除数据,而是对删除的数据做个删除标记,表明该数据已被删除,检索过程中,删除标记掩盖该数据,客户端读取不到该数据。

随着memstore中数据不断刷写到磁盘中,会产生越来越多的storeFile小文件,HBase内部通过将多个文件合并成一个较大的文件解决这一小文件问题,以上过程涉及两种合并,如下:

minor小合并

minor 合并负责合并Store中的多个storeFile文件,当StoreFile文件数量达到hbase.hstore.compaction.min 值(默认值为3)时,将会合并成一个StoreFile大文件。这种合并主要是将多个小文件重写为数量较少的大文件,减少存储文件数量,因为StoreFile的每个文件都是经过归类的,所以合并速度很快,主要受磁盘IO性能影响。

major大合并

将一个region中的一个列簇(对应一个Store)的若干个经过minor合并后的大的StoreFile重写为一个新的StoreFile。而且major合并能扫描所有的键/值对,顺序重写全部数据,重写过程中会略过做了删除标记的数据。

七、HBase目标表meta表

目录表 hbase:meta 作为HBase表存在,并从 hbase shell 的 list(类似 show tables)命令中过滤掉,但实际上是一个表,就像任何其他表一样。

hbase:meta 表(以前称为.META.),保有系统中所有 region 的列表。hbase:meta位置信息存储在 zookeeper 中,hbase:meta 表示所有查询的入口。

表结构如下:

key:region的key,结构为:[table],[region start key,end key],[region id]
values:info:regioninfo(当前region序列化的HRegionInfo实例)info:server(包含当前region的RegionServer的server:port)info:serverstartcode(包含当前region的RegionServer进程的开始时间)

当表正在拆分时,将创建另外两列,称为 info:splitA 和 info:splitB,这些列代表两个子 region, 这些列的值也是序列化的 HRegionInfo 实例。区域分割后,将删除此行。

a,,endkeya,startkey,endkeya,startkey,

空键用于表示表开始和表结束。具有空开始键的 region 是表中的第一个 region。如果某个 region 同时具有空开始和空结束键,则它是表中唯一的 region。

八、HBase特点

  1. 强的一致性读/写HBase,不是“最终一致”的 数据库(DataStore)。它非常适合高速计数器聚合等任务。

  2. 自动分片:HBase 表通过 region 分布在群集上,并且随着数据的增长,region 会自动分割和重新分配。自动的 RegionServer 故障转移。

  3. Hadoop/HDFS 集成:HBase 支持 HDFS 作为其分布式文件系统。

  4. MapReduce:HBase 支持通过 MapReduce 进行大规模并行处理,将 HBase 当做数据来源和保存数据存储的数据库。

  5. Java 客户端 API:HBase 支持易于使用的 Java API 以进行编程访问。

  6. Thrift/REST API:HBase 还支持非 Java 前端的 Thrift 和 REST。

  7. 块缓存和布隆过滤器:HBase 支持块缓存和布隆过滤器,以实现大容量查询优化。

  8. 运维管理:HBase 提供内置网页,用于运维监控和 JMX 指标。

  9. HBase 不支持行间事务。

九、HBase的使用场景

HBase适用于需要处理海量数据、需要高可靠性和高性能的场景。例如:

  • 对象存储:如新闻、网页、图片等数据的存储。

  • 用户画像:特别是用户的画像,是一个比较大的稀疏矩阵。

  • 消息/订单存储:在电信领域、银行领域,不少的订单查询底层的存储以及通信、消息同步的应用都可以构建在HBase之上。

总的来说,HBase是一个高性能、高可靠性、可扩展的分布式数据库,适用于处理海量非结构化或结构化数据,并能够满足近实时的读写管理需求。


  • 📢博客主页:https://lansonli.blog.csdn.net

  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉

  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

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

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

相关文章

没开玩笑!高速信号不能参考电源网络这条规则,其实很难做到

高速先生成员--黄刚 看到这篇文章的题目,我相信大家心里都呈现出了这么一个场景:高速信号线在L20层,我只要把L19和L21层都铺上完整的地平面,这不就满足了高速信号线不能参考电源平面这条规则了吗?这难道很难做到吗&…

鸿蒙大厂目前政策变现沉淀思考

鸿蒙引擎定制优化 鸿蒙端hotfix: 技术栈太大了,但是鸿蒙需要学习什么呢? 什么最有价值? 这就是接下来需要表达下我的观点: 1、APP开发 2、应用市场技术专员 【游戏、电商重型APP性能的处理 SmartPerf、构建自己的工…

kotlin基础之扩展函数及运算符重载

Kotlin 是一种强大的静态类型编程语言,它特别擅长与 Java 互操作,并提供了许多实用的功能来简化代码和提高可读性。其中,扩展函数和运算符重载是 Kotlin 中的两个强大特性,它们允许你以更加自然和简洁的方式编写代码。 1. 扩展函…

基于SpringBoot的在线文档管理系统源码数据库

基于SpringBoot的在线文档管理系统源码数据库 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,在线文档管理当然也不能排除在外。在线文档管理系统是以实际运用为开发背景&…

JVM、JRE 和 JDK 的区别,及如何解决学习中可能会遇到的问题

在学习Java编程的过程中,理解JVM、JRE和JDK之间的区别是非常重要的。它们是Java开发和运行环境的核心组件,各自扮演不同的角色。 一、JVM(Java Virtual Machine) 定义 JVM(Java虚拟机)是一个虚拟化的计算…

EE trade:如何理解做空黄金

理解做空黄金,其实就是理解卖空操作在黄金市场中的应用。卖空,或称为做空,是指投资者预测某资产(在这个例子中是黄金)的价格会下跌,因此采取的一种投资策略。 下面简要说明做空黄金的过程和相关概念: 借入黄金: 首先…

【problem】解决idea提示Method breakpoints may dramatically slow down debugging

前言 在使用IntelliJ IDEA进行Java开发和调试时,高效和流畅的调试体验对于快速定位和解决问题至关重要。然而,有时我们会遇到因方法断点引起的速度减慢或程序挂起的情况。本文将指导您如何识别并解决这一问题,确保您的调试过程既快速又高效。…

word、excel、ppt文件office在线预览

word、excel、ppt文件在线预览 1.预览地址2.链接属性 1.预览地址 微软office提供在线加载服务: https://view.officeapps.live.com/op/view.aspx?srcxxx.xlsx https://view.officeapps.live.com/op/embed.aspx?srcxxx.xlsx 2.链接属性 src:文件链接&a…

Linux dd命令,希望不常用,但非常有用的命令~

dd 命令在 Linux 中是一个非常强大的工具,用于复制和转换文件。它主要用于低级复制和转换,特别是当涉及块设备(如硬盘分区)时。dd 命令的语法相当灵活,但也因为它的复杂性而有时让新手感到困惑。 程序员秘书 基本语法…

Android 生成正式版密钥库 KeyStore

步骤1:打开生成正式版密钥库设置 点击 Build 菜单,选择 Generate Signed App Bundle or APK: 这是打开后的样子: 步骤2:选择 APK Android App Bundle 是用于上架 Google Play 商店的。 正常情况下选择 APK。 选择…

【面试题】场景考核高频面试

登陆测试用例设计分析 ? 好的,以下是一些常见的登录测试用例设计分析: 1. 输入正确的用户名和密码是否能够成功登录? 2. 输入错误的用户名和密码是否能够正确地验证失败? 3. 如果忘记了密码,是否有重置密…

嵌入式Linux:strerror函数和perror函数

目录 1、strerror函数 2、perror函数 strerror函数和perror函数是C标准库中的两个函数,用于处理和显示错误信息。它们帮助程序员在程序运行过程中了解并诊断错误原因。 strerror函数,返回错误消息字符串,需要程序员自己调用printf等函数来…

Java学习-简单的用户管理系统

用户管理系统 实现基本的用户类,用于抽象出用户的基本信息(编号,姓名,性别,电话,邮件)–Student实现用户工具类,用于实现用户的增、删、改、查–StudentUtils测试类,用于测试使用–StudentTest…

提升(或降低)插入的内容的位置:\raisebox

\raisebox 是 LaTeX 中的一个命令&#xff0c;用于提升&#xff08;或降低&#xff09;插入的内容&#xff08;如文本、图像等&#xff09;的位置。该命令可以用于调整垂直位置&#xff0c;使内容相对于周围内容上下移动。 语法如下&#xff1a; \raisebox{<distance>}…

探秘网页内容提取:教你定位特定标签

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、定位带有ID属性的第二个标签 三、定位具有特定属性值的标签 四、提取含有特…

分类内按规则拆分一行变多行

Excel的A列是分类列&#xff0c;B列是由">"连接起来的多个字符串&#xff0c;可以看成是合并后的明细&#xff1a; AB1IDRule: Condition2470210642217Test3470251569449Doors & Hardware > Door Jambs> 119mm4470251602217Bathroom > Stone Tops &…

Vue 怎么定义插件以及使用这个插件

Vue.js插件是一种增强Vue功能的方式&#xff0c;它允许你向Vue中添加全局功能&#xff0c;比如全局方法、指令、过滤器、混入等 创建Vue插件 export default {install(Vue, options) {// 添加全局方法或属性Vue.myGlobalMethod function() {console.log(全局方法调用, optio…

汇编实现流水灯

1.使能时钟&#xff1a; 1使能GPIO的外设时钟ldr r0,0x50000A28ldr r1,[r0]orr r1,r1,#(0x3<<4)//使能第&#xff14;&#xff0c;&#xff15;位str r1,[r0] 2.设置为输出模式 设置GPIOE10为输出模式ldr r0,0x50006000ldr r1,[r0]bic r1,r1,#(0x3<<20)orr r1,r1…

【同元软控】1~5:两个队列实现栈

5.两个队列实现栈 请你仅使用两个队列实现一个后入先出的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty),输入数据保证 pop、top函数操作时,栈中一定有元素。 void push(int elemen) 将元素 element 压入栈顶。 int pop() 移除并返回栈顶元素。 int top() 返回…

正点原子延时函数delay_ms延时失效的原因

1、问题陈述 今天在测试小车程序的时候使用了如下代码&#xff0c;发现延时并没有达到期望的4s&#xff0c;而是仅仅延时了0.4s左右&#xff0c;本来以为少加了个0&#xff0c;最后在我多次测试下来&#xff0c;发现在延时大约超过2s的时候就会失效。 while(1){Set_Pwm(6000,60…