HBase Java API 管理功能
初始化 Admin 实例
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
HBase 提供了一种高级功能:计数器(counter)。HBase 计数器可以用于实时统计,无需延时较高的批量处理操作。HBase 有一种机制可以将列当作计数器:即读取并修改(其实就是一种 CAS 模式),其保证了在一次操作中的原子性。否则,用户需要对一行数据加锁,然后读取数据,再对当前数据做加法,最后写回 HBase 并释放行锁,这一系列操作会引起大量的资源竞争问题。
早期的 HBase 版本会在每次计数器更新操作调用一次 RPC 请求,新版本中可以在一次 RPC 请求中完成多个计数器的更新操作,但是多个计数器必须在同一行。
HBase 是一个面向 列
的数据库管理系统,这里更为确切的而说,HBase 是一个面向 列族
的数据库管理系统。表 schema 仅定义列族,表具有多个列族,每个列族可以包含任意数量的列,列由多个单元格(cell)组成,单元格可以存储多个版本的数据,多个版本数据以时间戳进行区分。
Table
:Table 由 Row 和 Column 组成。Row
:Row 是列族(Column Family)的集合。Row Key
:Row Key
是用来检索记录的主键。
Row Key
是未解释的字节数组,所以理论上,任何数据都可以通过序列化表示成字符串或二进制,从而存为 HBase 的键值。Row Key
的字典序进行排序。这里需要注意以下两点:
Row Key
进行访问;Row Key
的 range 进行访问,即访问指定范围内的行;Column Family
:即列族。HBase 表中的每个列,都归属于某个列族。列族是表的 Schema 的一部分,所以列族需要在创建表时进行定义。
info:format
,info:geo
都属于 info
这个列族。Column Qualifier
:列限定符。可以理解为是具体的列名,例如 info:format
,info:geo
都属于 info
这个列族,它们的列限定符分别是 format
和 geo
。列族和列限定符之间始终以冒号分隔。需要注意的是列限定符不是表 Schema 的一部分,你可以在插入数据的过程中动态创建列。Column
:HBase 中的列由列族和列限定符组成,由 :
(冒号) 进行分隔,即一个完整的列名应该表述为 列族名 :列限定符
。Cell
:Cell
是行,列族和列限定符的组合,并包含值和时间戳。HBase 中通过 row key
和 column
确定的为一个存储单元称为 Cell
,你可以等价理解为关系型数据库中由指定行和指定列确定的一个单元格,但不同的是 HBase 中的一个单元格是由多个版本的数据组成的,每个版本的数据用时间戳进行区分。
Cell
由行和列的坐标交叉决定,是有版本的。默认情况下,版本号是自动分配的,为 HBase 插入 Cell
时的时间戳。Cell
的内容是未解释的字节数组。Timestamp
:Cell
的版本通过时间戳来索引,时间戳的类型是 64 位整型,时间戳可以由 HBase 在数据写入时自动赋值,也可以由客户显式指定。每个 Cell
中,不同版本的数据按照时间戳倒序排列,即最新的数据排在最前面。在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求。在这种情况下,协处理器(Coprocessors)应运而生。它允许你将业务计算代码放入在 RegionServer 的协处理器中,将处理好的数据再返回给客户端,这可以极大地降低需要传输的数据量,从而获得性能上的提升。同时协处理器也允许用户扩展实现 HBase 目前所不具备的功能,如权限校验、二级索引、完整性约束等。
HBase 中两种主要的数据读取方法是 get()
和 scan()
,它们都支持直接访问数据和通过指定起止 row key 访问数据。此外,可以指定列族、列、时间戳和版本号来进行条件查询。它们的缺点是不支持细粒度的筛选功能。为了弥补这种不足,Get
和 Scan
支持通过过滤器(Filter
)对 row key、列或列值进行过滤。
HBase 提供了一些内置过滤器,也允许用户通过继承 Filter
类来自定义过滤器。所有的过滤器都在服务端生效,称为 谓词下推。这样可以保证被过滤掉的数据不会被传到客户端。
引入依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.1.4</version>
</dependency>
高昂的维护成本
时间性能“达不到”用户的期待
不同量级 TOP K 算法的解决方案不同:
小规模:Hash 即可
大规模:由于单机的处理量不足以处理全量数据,势必分而治之:分片统计,然后聚合(即先 map 后 reduce)
大数据技术,起源于 Google 在 2004 年前后发表的三篇论文: