分布式列数据库--理解hbase列存储机制、架构、表结构设计、命令操作
1. HBase简介
HBase是Hadoop Database的简称,是建立在Hadoop文件系统之上的分布式面向列的数据库。
HBase和HDFS
HDFS适用于存储大容量文件的分布式文件系统,不支持快速单独记录查找,提供了高延迟批量处理,但是没有批处理的概念;提供的数据只能够顺序访问;
HBase是建立在HDFS之上的数据库,提供在较大的表快速查找,提供了数十亿记录低延迟访问单个行记录(随机存储),HBase内部使用哈希表和提供随机接入,并且其存储索引,可以将在HDFS文件中的数据进行快速查找。
HBase存储机制
列
HBase是一个面向列的数据库。
可以把Hbase的表想象成一个多(两)维Map(Map套Map)。列族是第一维,列修饰符是第二维。
在Hbase中一个列族(Column Family)和一个列修饰符(Column Qualifier)组合起来才叫一个列(Column),使用冒号(:)分割,列族:列修饰符,如下图:
Rowkey
传统数据库中每一行的唯一标识符叫做主键,在Hbase中叫做row key(行键)。
在HBase 内部,rowkey 保存为字节数组。HBase会对表中的数据按照 rowkey 排序 (字典顺序)
时间戳
数据在进入Hbase时都会被打上一个时间戳,这个时间戳可以作为版本号来使用。
在t1时间我存入一个人的基本信息,之后发现姓名错了,在t2时间又更新了姓名,此时并不会去更新原来的那条数据,而是又插入了一条新数据且打上新的时间戳。
此时去查询获取的是新数据,仿佛是更新了,但其实只是默认返回了最新版本的数据而已。
Region
Region的概念和关系型数据库的分区或者分片差不多。
Hbase会将一个大表的数据基于Rowkey的不同范围分配到不通的Region中,每个Region负责一定范围的数据访问和存储。这样即使是一张巨大的表,由于被切割到不通的region,访问起来的时延也很低。
HBase特点
数据库要点
- 介于NoSQL和RDBMS之间,仅能通过主键(rowkey)和主键的range来检索数据;
- HBase查询数据功能很简单,不支持join等复杂操作;
- 不支持复杂事务,只支持行级事务(可通过hive支持来实现多表join等复杂操作)
- HBase中支持的数据类型:byte
- 主要用来存储结构化和半结构化的松散数据;
结构化、半结构化和非结构化
- 结构化:数据结构字段含义确定,清晰,典型的如数据库中的表结构
- 半结构化:具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title),有些不确定(table)
- 非结构化:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性。
HBase中的表特点
- 大:一个表可以有上十亿行,上百万列
- 面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
- 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
- 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列。
极易扩展
Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。
备注:RegionServer的作用是管理region、承接业务的访问。
通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。
高并发
由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。
稀疏
稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
使用场景
HBase适用于海量数据存储和准实时查询。HBase能够应用在上百亿行*上百万列,实现百毫秒的查询;
HBase只有当数据量非常大的时候,才能发挥其良好的性能,如果只是百万或者千万数据,完全可以使用MySQL的分库分表实现。但是关系型数据库的字段列数需要在30以内,否则就是表的设计有问题。
查询简单(基于rowkey或者rowkey查询范围)、不涉及复杂关联的环境,如:交通(红绿灯信息采集)、海量订单流水数据(长久保存)、交易记录、数据库历史数据。
2. HBase架构
在HBase中,表被分割成区域,并由区域服务器提供服务。
区域被列族垂直分为“Stores”。Stores被保存在HDFS文件。
- 依赖于HDFS做底层的数据存储
- 依赖于MapReduce做数据计算
- 依赖于ZooKeeper做服务协调
HBase有三个主要组成部分:客户端库,主服务器和区域服务器。区域服务器可以按要求添加或删除。
主服务器
主服务器用于:
- 分配区域给区域服务器。
- 处理跨区域的服务器区域的负载均衡。它卸载繁忙的服务器和转移区域较少占用的服务器。
- 通过判定负载均衡以维护集群的状态。
- 负责模式变化和其他元数据操作,如创建表和列。
区域服务器
区域只不过是表被拆分,并分布在区域服务器。
区域服务器:包含区域和存储
HregionServer直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:
- RegionServer维护Master分配给它的Region,处理对这些Region的IO请求
- RegionServer负责Split在运行过程中变得过大的Region,负责Compact操作
- 负责和底层HDFS交互,存储数据到HDFS
- 负责Storefile合并工作
可以看到,client访问HBase上数据的过程并不需要master参与(寻址访问zookeeper和RegioneServer,数据读写访问RegioneServer),Master仅仅维护者Table和Region的元数据信息,负载很低。
HRegion
Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。
Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值时就会分成两个新的region。
每个region由以下信息标识:< 表名,startRowkey,创建时间>
Store
每一个region由一个或多个store组成,至少是一个store。
hbase会把一起访问的数据放在一个store里面,即为每个 ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。
一个Store由一个memStore和0或者 多个StoreFile组成。HBase以store的大小来判断是否需要切分region
MemStore
memStore 是放在内存里的。保存修改的数据即keyValues。当memStore的大小达到一个阀值(默认128MB)时,memStore会被flush到文件,即生成一个快照。目前hbase会有一个线程来负责memStore的flush操作。
StoreFile
memStore内存中的数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存。
HFile
HBase中KeyValue数据的存储格式,HFile是Hadoop的二进制格式文件,实际上StoreFile就是对Hfile做了轻量级包装,即StoreFile底层就是HFile
3. HBase表结构设计
列簇设计
追求的原则是:在合理范围内能尽量少的减少列簇就尽量减少列簇。
最优设计是:将所有相关性很强的key-value都放在同一个列簇下,这样既能做到查询效率最高,也能保持尽可能少的访问不同的磁盘文件。以用户信息为例,可以将必须的基本信息存放在一个列族,而一些附加的额外信息可以放在另一列族。
RowKey 设计
HBase 中,表会被划分为 1…n 个 Region,被托管在 RegionServer中。
Region 二个重要的属性:StartKey与EndKey表示这个Region维护的rowKey范围,当我们要读/写数据时,如果rowKey落在某个start-endkey范围内,那么就会定位到目标 region 并且读/写到相关的数据
Rowkey 设计三原则:
1. rowkey 长度原则
Rowkey 是一个二进制码流,Rowkey 的长度被很多开发者建议说设计在 10~100 个字节,不过建议是越短越好,不要超过 16 个字节。
原因如下:
- 数据的持久化文件 HFile 中是按照 KeyValue存储的,如果Rowkey过长比如 100 个字 节,1000 万列数据光 Rowkey 就要占用100*1000万=10亿个字节,将近 1G 数据,这会极大影响 HFile 的存储效率
- MemStore 将缓存部分数据到内存,如果Rowkey字段过长内存的有效利用率会降低, 系统将无法缓存更多的数据,这会降低检索效率。因此Rowkey的字节长度越短越好。
- 目前操作系统是都是 64 位系统,内存 8 字节对齐。控制在 16 个字节,8 字节的整数倍利用操作系统的最佳特性。
2. rowkey 散列原则
如果 Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将 Rowkey 的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个 Regionserver实现负载均衡的几率。
如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个RegionServer上堆积的热点现象,这样在做数据检索的时候负载将会集中 在个别 RegionServer,降低查询效率。
3. rowkey 唯一原则
必须在设计上保证其唯一性。rowkey 是按照字典顺序排序存储的,因此,设计 rowkey 的时候,要充分利用这个排序的特点,将经常读取的数据存储到一块,将最近可能会被访问的数据放到一块。
4. HBase 命令
表操作
关于表的操作包括(创建create,查看表列表list。查看表的详细信息desc,删除表drop,清空表truncate,修改表的定义alter)
数据操作
put: 把指定列在指定的行中单元格的值在一个特定的表。
get: 取行或单元格的内容。
delete: 删除表中的单元格值。
deleteall: 删除给定行的所有单元格。
scan: 扫描并返回表数据。
count: 计数并返回表中的行的数目。
truncate: 禁用,删除和重新创建一个指定的表
过滤器
基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter。
Filter可以根据簇、列、版本等更多的条件来对数据进行过滤,基于Hbase本身提供的三维有序(主键有序、列有序、版本有序),这些Filter可以高效的完成查询过滤的任务。
带有Filter条件的RPC查询请求会把Filter分发到各个RegionServer,是一个服务器端(Server-side)的过滤器,这样也可以降低网络传输的压力。
参考
轻松理解Hbase面向列的存储
HBase学习——1.HBase基础
HBase学习——3.HBase表设计
HBase学习——4.HBase过滤器
分布式列数据库--理解hbase列存储机制、架构、表结构设计、命令操作相关推荐
- 时序数据库连载系列: 时序数据库一哥InfluxDB之存储机制解析
InfluxDB 的存储机制解析 本文介绍了InfluxDB对于时序数据的存储/索引的设计.由于InfluxDB的集群版已在0.12版就不再开源,因此如无特殊说明,本文的介绍对象都是指 InfluxD ...
- 时序数据库连载系列: 时序数据库一哥InfluxDB之存储机制解析 1
2019独角兽企业重金招聘Python工程师标准>>> InfluxDB 的存储机制解析 本文介绍了InfluxDB对于时序数据的存储/索引的设计.由于InfluxDB的集群版已在0 ...
- 数据库设计:关于枚举类型的表结构设计法,个人拙见
枚举,一种数据类型(相对于C#语言而言,当然,Java,PHP也有).项目中使用枚举有以下一些优点. 第一:定义直观,使用方便. 第二:便于维护与扩展(实际上还是直观) 对于枚举类型的数据的显示,一般 ...
- 分布式监控系统开发【day38】:监控trigger表结构设计(一)
一.需求讨论 1.zabbix触发器的模板截图 1.zabbix2.4.7 2.zabbix3.0 2.模板与触发器关联的好处 好处就是可以批量处理,比如我说我有1000机器都要监控cpu.内存.IO ...
- 理解HBase zookeeper和-Root-/.MET表
1 探究Zookeeper 安装过HBase的开发者一定知道,HBase本身就嵌入了Zookeeper,你可以选择安装嵌入的Zookeeper,也可以安装一个分布式的Zookeeper集群.具体的安装 ...
- 浅谈 MySQL 的存储引擎(表类型)
什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其实是 ...
- 列存储相关概念和常见列式存储数据库(Hbase、德鲁依)
Table of Contents 列式存储数据库 Examples of Column Store DBMSs Hbase Table Row Column Column Family Column ...
- 大数据-NoSQL数据库:HBase【基于Zookeeper/HDFS的分布式、高并发、可扩展的NoSQL数据库;支持“十亿行”ד百万列”海量数据的实时随机读写;仅支持单表查询;不擅长数据分析】
HBase适合场景:单表超千万,上亿,且高并发! HBase不适合场景:主要需求是数据分析,比如做报表.数据量规模不大,对实时性要求高! HBase的查询工具有很多,如:Hive.Tez.Impala ...
- 理解HBase面向列存储
从严格的列式存储的定义来看,Hbase并不属于列式存储,有人称它为面向列的存储.行式存储 传统的数据库是关系型的,且是按行来存储的.如下图: 其中只有张三把一行数据填满了,李四王五赵六的行都没有填满. ...
最新文章
- 单链表-删除单链表L中奇数号节点(双指针法)
- 纯CSS3画出小黄人并实现动画效果
- python程序设计基础实战教程_Python程序设计基础实战教程
- Servlet中过滤器的实现原理(源码实现)
- spring boot jar包替换报错之Unable to open nested entry 'BOOT-INF/lib/cache-api-0.4.jar'.
- 第二节 安装CentOS
- 不插网线 开机速度加快
- python 实现SOM:代码注释与应用示例
- Mac Excel 次坐标轴/双坐标轴/柱状图+折线图
- USB2.0系列(锆石科技FPGA)
- 谷粒学院 Day12.登录页面模式、整合JWT、整合QQ邮箱、用户登录注册接口【后端】、用户登录注册【前端】
- JavaScript滚动条插件源码
- 【转】SD Card - UHS-I UHS Speed Class 1
- 《程序员修炼之道:从小工到专家》The Pragmatic Programmer: From Journey to Master
- 湖南省政务云灾备_全省唯一的省级政务云灾备基地在内江正式启动
- 数据库在网站中的作用
- UML中各种图形的关系和用法
- 数学建模算法与应用:综合评价与决策方法(1)理想解法
- LeetCode(871):最低加油次数 Minimum Number of Refueling Stops(Java)
- java 手动垃圾回收_java如何进行垃圾回收的
热门文章
- python教程七牛云_python-django框架中使用七牛云
- python中的switch语句_python技巧 switch case语句
- 个人计算机系统构造方式,计算机系统构造概要归纳.doc
- RocketMQ的安装与启动
- Java NIO学习篇之缓冲区ByteBuffer详解
- ubuntu用户目录安装pip(无root权限)
- qt qthead里如何响应信号_Qt之QThread(深入理解)
- 大学生能从计算机游戏中受益,2017年12月英语四级作文范文:大学生玩游戏
- datetimepicker中文不生效_搜索引擎技术(二十)- elasticsearch - 中文分词器
- tsm如何备份oracle原理,征文:TSM备份Oracle脚本及策略说明