- Java207
- 编程14
- 设计78
- DevOps8
- 数据结构和算法16
- 数据库108
- 网络19
- 分布式76
- 大数据33
- 软件工程3
- 工作8
- 笔记47
- JavaCore64
- JavaEE15
- 软件20
- 工具37
- 框架68
- 中间件9
- 编程范式4
- 编程语言3
- Python6
- 架构31
- 设计模式27
- 重构7
- DDD2
- UML4
- 综合20
- 监控2
- 线性表4
- 树6
- 数据库综合3
- 数据库中间件4
- 关系型数据库18
- 文档数据库12
- KV数据库19
- 列式数据库14
- 搜索引擎数据库24
- 网络综合8
- 网络协议6
- 网络技术4
- 操作系统13
- 操作系统应用2
- 分布式综合3
- 分布式理论12
- 分布式协同14
- 分布式调度7
- 分布式高可用1
- 分布式通信31
- 分布式存储7
- hadoop7
- hive8
- spark1
- flink9
- 其他15
- 人工智能1
- 基础特性18
- 高级特性7
- 容器7
- IO9
- 并发11
- JVM9
- 面试11
- JavaWeb6
- 服务器8
- 构建9
- IDE4
- 监控诊断6
- JavaBean2
- 模板引擎4
- 测试5
- Spring61
- ORM3
- 安全8
- 缓存5
- 流量控制2
- 微服务5
- 解决方案8
- Git3
- Shardingsphere2
- Mysql10
- MongoDB11
- Redis17
- HBase12
- Elasticsearch15
- Elastic8
- Linux11
- 命令1
- 分布式协同综合7
- ZooKeeper6
- RPC8
- MQ17
- hdfs4
- 效能6
- 方法论2
- 规范3
- Tomcat6
- Maven7
- Spring综合5
- Spring核心24
- Spring数据10
- SpringWeb8
- SpringIO4
- Spring集成4
- Spring安全1
- Spring其他4
- RPC综合4
- Dubbo2
- MQ综合2
- Kafka9
- RocketMQ4
- 其他MQ1
HBase Java API 管理功能
初始化 Admin 实例
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
HBase Java API 其他高级特性
计数器
HBase 提供了一种高级功能:计数器(counter)。HBase 计数器可以用于实时统计,无需延时较高的批量处理操作。HBase 有一种机制可以将列当作计数器:即读取并修改(其实就是一种 CAS 模式),其保证了在一次操作中的原子性。否则,用户需要对一行数据加锁,然后读取数据,再对当前数据做加法,最后写回 HBase 并释放行锁,这一系列操作会引起大量的资源竞争问题。
早期的 HBase 版本会在每次计数器更新操作调用一次 RPC 请求,新版本中可以在一次 RPC 请求中完成多个计数器的更新操作,但是多个计数器必须在同一行。
HBase 数据模型
HBase 是一个面向 列
的数据库管理系统,这里更为确切的而说,HBase 是一个面向 列族
的数据库管理系统。表 schema 仅定义列族,表具有多个列族,每个列族可以包含任意数量的列,列由多个单元格(cell)组成,单元格可以存储多个版本的数据,多个版本数据以时间戳进行区分。
HBase 逻辑存储结构
Table
:Table 由 Row 和 Column 组成。Row
:Row 是列族(Column Family)的集合。Row Key
:Row Key
是用来检索记录的主键。Row Key
是未解释的字节数组,所以理论上,任何数据都可以通过序列化表示成字符串或二进制,从而存为 HBase 的键值。- 表中的行,是按照
Row Key
的字典序进行排序。这里需要注意以下两点:- 因为字典序对 Int 排序的结果是 1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。如果你使用整型的字符串作为行键,那么为了保持整型的自然序,行键必须用 0 作左填充。
- 行的一次读写操作是原子性的 (不论一次读写多少列)。
- 所有对表的访问都要通过 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 Java API 高级特性之协处理器
简述
在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求。在这种情况下,协处理器(Coprocessors)应运而生。它允许你将业务计算代码放入在 RegionServer 的协处理器中,将处理好的数据再返回给客户端,这可以极大地降低需要传输的数据量,从而获得性能上的提升。同时协处理器也允许用户扩展实现 HBase 目前所不具备的功能,如权限校验、二级索引、完整性约束等。
参考资料
HBase Java API 高级特性之过滤器
HBase 中两种主要的数据读取方法是 get()
和 scan()
,它们都支持直接访问数据和通过指定起止 row key 访问数据。此外,可以指定列族、列、时间戳和版本号来进行条件查询。它们的缺点是不支持细粒度的筛选功能。为了弥补这种不足,Get
和 Scan
支持通过过滤器(Filter
)对 row key、列或列值进行过滤。
HBase 提供了一些内置过滤器,也允许用户通过继承 Filter
类来自定义过滤器。所有的过滤器都在服务端生效,称为 谓词下推。这样可以保证被过滤掉的数据不会被传到客户端。
HBase Schema 设计
HBase Schema 设计要素
- 这个表应该有多少 Column Family
- Column Family 使用什么数据
- 每个 Column Family 有有多少列
- 列名是什么,尽管列名不必在建表时定义,但读写数据是要知道的
- 单元应该存放什么数据
- 每个单元存储多少时间版本
- 行健(rowKey)结构是什么,应该包含什么信息
Row Key 设计
Row Key 的作用
HBase Java API 基础特性
HBase Client API
HBase Java API 示例
引入依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.1.4</version>
</dependency>
HBase 教程
📖 内容
HBase 架构
HBase 是一个在 HDFS 上开发的面向列的分布式数据库。
HBase 存储架构
在 HBase 中,表被分割成多个更小的块然后分散的存储在不同的服务器上,这些小块叫做 Regions,存放 Regions 的地方叫做 RegionServer。Master 进程负责处理不同的 RegionServer 之间的 Region 的分发。