Hbase核心原理及优劣分析

一、Hbase的特点

Apache Hbase是一个基于Hdfs构建的分布式,可扩展的NoSQL数据库。

Hbase一般应用于需要存储海量数据,又不需要复杂多维度查询检索,不频繁更新的场景。例如阿里用来备份存储海量历史订单明细,用户历史数据报表,备份商品信息等。

先讲讲我对Hbase优劣分析的思考,后面在结合原理进一步剖析根本原因。

Hbase优势

  • 分布式数据库,可以存储几10亿行,数百万列数据的巨大table。
  • 非常高效的随机读写性能,单行数据写入、单RowKey读取ms级别,并发可达到几十万qps。比Hive要快很多。
  • 动态列存储,相比于mysql、oracle一类关系数据库,Hbase可以在不锁表的情况下随意增加、去除数据列。

Hbase劣势

  • 需要多维检索存储数据的场景难以胜任。比如用户需从订单号,订单状态,时间范围,商品标题...各种维度搜索订单这类场景。阿里内部早期这类使用Hbase的场景基本都放弃了Hbase转到别的技术架构上了。主要原因有2个:
    • 一条数据写入会放大成若干条不同RowKey数据,造成写入放大,数据一致性保证考验
    • Hbase查询时。计算节点RegionServer、存储节点Hdfs是分离的,范围查询scan如果路由到多个RegionServer、Hdfs物理机时,因为会有大量网络损耗,导致性能急剧下降。我们在生产使用中Hbase会有很多毛刺就是这个原因。
  • Hfile中会冗余存储很多RowKey、列簇,字段名称等信息。另外当存储的数据频繁更新时,使用不当会存在大量历史版本数据冗余。导致Hbase存储成本会比较高。
  • 不支持关系数据库中的事务功能。
  • Hbase访问数据API相比关系数据库SQL灵活性太差了。虽然可以在Hbase上集成一层Phoenix、Hive支持,但这样操作会以损失高效查询访问性能为代价。
  • 客户端链接创建时要读取大量集群meta信息很慢。

二、Hbase数据模型&概念

Name Space命名空间

类似于关系数据库的 DatabBase 概念,每个命名空间下有多个表。

Table表

和关系数据库表类似。不过Hbase创建表时只需要指定列族Column family即可,无需指定具体字段,字段可以动态添加。

另外Hbase更新数据时是通过增加版本号来实现,不改历史数据,所以创建表时可以指定保存历史版本数量。

建表语句:

create '<table_name>', '<column_family1>', '<column_family2>', ... [{NAME => '<attribute_name>', VERSIONS => <number_of_versions>}]
<table_name>:表的名称,需要是引号括起来的字符串。
<column_family1>, <column_family2>:列族名称,也需要是引号括起来的字符串。列族是 HBase 表的基本存储单元。
{NAME => '<attribute_name>', VERSIONS => <number_of_versions>}:可选的属性,用于指定列族的配置参数。例如,VERSIONS 指定存储的版本数。

如下图所示,Table表中的每行(Row)数据都由一个行键(RowKey) 和一个或多个列族(Column family)组成、 1个列族(Column family)又包含一个或多个Column(列)

Rowkey(行键)

Hbase数据物理上是按照RowKey(行键)的字典顺序存储的,并且查询数据时只能根据 RowKey进行检索,所以 RowKey 的设计十分重要。例子:

  • 要按订单id查询,就得将订单id设置为RowKey。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值