hbase属于什么类型数据库,分布式列数据库--理解hbase列存储机制、架构、表结构设计、命令操作

 2023-09-24 阅读 17 评论 0

摘要:1. HBase简介 HBase是Hadoop Database的简称,是建立在Hadoop文件系统之上的分布式面向列的数据库。 HBase和HDFS HDFS适用于存储大容量文件的分布式文件系统,不支持快速单独记录查找,提供了高延迟批量处理,但是没有批处理的概念;提供的数据

1. HBase简介

HBase是Hadoop Database的简称,是建立在Hadoop文件系统之上的分布式面向列的数据库。

HBase和HDFS

HDFS适用于存储大容量文件的分布式文件系统,不支持快速单独记录查找,提供了高延迟批量处理,但是没有批处理的概念;提供的数据只能够顺序访问;

HBase是建立在HDFS之上的数据库,提供在较大的表快速查找,提供了数十亿记录低延迟访问单个行记录(随机存储),HBase内部使用哈希表和提供随机接入,并且其存储索引,可以将在HDFS文件中的数据进行快速查找。

HBase存储机制

HBase是一个面向列的数据库。
hbase 面向列的数据库
可以把Hbase的表想象成一个多(两)维Map(Map套Map)。列族是第一维,列修饰符是第二维。
在Hbase中一个列族(Column Family)和一个列修饰符(Column Qualifier)组合起来才叫一个列(Column),使用冒号(:)分割,列族:列修饰符,如下图:
列族和列修饰符

Rowkey

hbase属于什么类型数据库?传统数据库中每一行的唯一标识符叫做主键,在Hbase中叫做row key(行键)。
在HBase 内部,rowkey 保存为字节数组。HBase会对表中的数据按照 rowkey 排序 (字典顺序)

时间戳

数据在进入Hbase时都会被打上一个时间戳,这个时间戳可以作为版本号来使用。

在t1时间我存入一个人的基本信息,之后发现姓名错了,在t2时间又更新了姓名,此时并不会去更新原来的那条数据,而是又插入了一条新数据且打上新的时间戳。

此时去查询获取的是新数据,仿佛是更新了,但其实只是默认返回了最新版本的数据而已。
hbase

Region

Region的概念和关系型数据库的分区或者分片差不多。

hbase虚拟分布式模式需要几个节点。Hbase会将一个大表的数据基于Rowkey的不同范围分配到不通的Region中,每个Region负责一定范围的数据访问和存储。这样即使是一张巨大的表,由于被切割到不通的region,访问起来的时延也很低。

HBase特点

在这里插入图片描述
数据库要点

  1. 介于NoSQL和RDBMS之间,仅能通过主键(rowkey)和主键的range来检索数据;
  2. HBase查询数据功能很简单,不支持join等复杂操作;
  3. 不支持复杂事务,只支持行级事务(可通过hive支持来实现多表join等复杂操作)
  4. HBase中支持的数据类型:byte
  5. 主要用来存储结构化和半结构化的松散数据;

结构化、半结构化和非结构化

  1. 结构化:数据结构字段含义确定,清晰,典型的如数据库中的表结构
  2. 半结构化:具有一定结构,但语义不够确定,典型的如 HTML 网页,有些字段是确定的(title),有些不确定(table)
  3. 非结构化:杂乱无章的数据,很难按照一个概念去进行抽取,无规律性。

HBase中的表特点

  1. 大:一个表可以有上十亿行,上百万列
  2. 面向列:面向列(族)的存储和权限控制,列(簇)独立检索。
  3. 稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
  4. 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列。

极易扩展
Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。

hdfs架构、通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。

备注:RegionServer的作用是管理region、承接业务的访问。

通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。

高并发
由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发、低延迟的服务。

稀疏
稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。

HBASE数据库、使用场景
HBase适用于海量数据存储和准实时查询。HBase能够应用在上百亿行*上百万列,实现百毫秒的查询;

HBase只有当数据量非常大的时候,才能发挥其良好的性能,如果只是百万或者千万数据,完全可以使用MySQL的分库分表实现。但是关系型数据库的字段列数需要在30以内,否则就是表的设计有问题。

查询简单(基于rowkey或者rowkey查询范围)、不涉及复杂关联的环境,如:交通(红绿灯信息采集)、海量订单流水数据(长久保存)、交易记录、数据库历史数据。

2. HBase架构

在HBase中,表被分割成区域,并由区域服务器提供服务。
区域被列族垂直分为“Stores”。Stores被保存在HDFS文件。

  • 依赖于HDFS做底层的数据存储
  • 依赖于MapReduce做数据计算
  • 依赖于ZooKeeper做服务协调

hbase

hbase是nosql数据库吗?HBase有三个主要组成部分:客户端库,主服务器和区域服务器。区域服务器可以按要求添加或删除。

主服务器

主服务器用于:

  • 分配区域给区域服务器。
  • 处理跨区域的服务器区域的负载均衡。它卸载繁忙的服务器和转移区域较少占用的服务器。
  • 通过判定负载均衡以维护集群的状态。
  • 负责模式变化和其他元数据操作,如创建表和列。

区域服务器

区域只不过是表被拆分,并分布在区域服务器。
区域服务器:包含区域和存储
hbase 区域和存储
HregionServer直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:

  1. RegionServer维护Master分配给它的Region,处理对这些Region的IO请求
  2. RegionServer负责Split在运行过程中变得过大的Region,负责Compact操作
  3. 负责和底层HDFS交互,存储数据到HDFS
  4. 负责Storefile合并工作

可以看到,client访问HBase上数据的过程并不需要master参与(寻址访问zookeeper和RegioneServer,数据读写访问RegioneServer),Master仅仅维护者Table和Region的元数据信息,负载很低。

HRegion

Region是HBase中分布式存储和负载均衡的最小单元,即不同的region可以分别在不同的Region Server上,但同一个Region是不会拆分到多个server上。

hbase架构?Region按大小分隔,每个表一般是只有一个region。随着数据不断插入表,region不断增大,当region的某个列族达到一个阈值时就会分成两个新的region。

每个region由以下信息标识:< 表名,startRowkey,创建时间>

Store

每一个region由一个或多个store组成,至少是一个store。

hbase会把一起访问的数据放在一个store里面,即为每个 ColumnFamily建一个store,如果有几个ColumnFamily,也就有几个Store。

一个Store由一个memStore和0或者 多个StoreFile组成。HBase以store的大小来判断是否需要切分region

hbase列族。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。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 字节的整数倍利用操作系统的最佳特性。

hbase应用架构,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: 禁用,删除和重新创建一个指定的表

过滤器

hdfs架构原理,基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter。

Filter可以根据簇、列、版本等更多的条件来对数据进行过滤,基于Hbase本身提供的三维有序(主键有序、列有序、版本有序),这些Filter可以高效的完成查询过滤的任务。

带有Filter条件的RPC查询请求会把Filter分发到各个RegionServer,是一个服务器端(Server-side)的过滤器,这样也可以降低网络传输的压力。

参考

轻松理解Hbase面向列的存储

HBase学习——1.HBase基础

hbase三层结构及其作用?HBase学习——3.HBase表设计

HBase学习——4.HBase过滤器

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/92926.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息