速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

HBase ORM SimpleHBase 设计

  • 2014-06-05
  • 本文字数:3285 字

    阅读完需:约 11 分钟

目前企业软件开发占据主流的开发模式为面向对象模式。无论是建立在集合论之上的传统关系型数据库,还是以 CAP 定理 /Hadoop/BigTable 为基石的 HBase,都面临以下的基本问题:

  • 如何保存对象到数据存储?
  • 如何从数据存储获取对象?
  • 如何更新数据存储中的现有数据?数据存储的类型系统和开发语言(Java)的类型系统之间如何相互转换?

简而言之,数据存储如何提供增、删、改、查的服务能力,应用如何方便的使用该能力。关系型数据库给出的答案为 SQL,JDBC 和各种 ORM 框架(典型例子为 Hibernate 和 MyBatis)。

HBase ORM

ORM 即 Object-Relational mapping,对于 HBase 而言不存在 Relational,因此该名称不准确,只是 ORM 做为一个术语使用太过广泛,这里泛指数据存储和 Object 之间的映射。

HBase 的设计和 RDBMS 差异较大,因此除了上一小节的问题外,还需要解决如下问题:

  • 如何映射 HTable 的 RowKey?
  • 如何映射 HTable 的 bytes 到 Java 类型?
  • 如何映射 HTable 的多版本能力?

本文着重介绍 HBase ORM SimpleHBase 框架,并和另一个 HBase ORM Phoenix( http://phoenix.incubator.apache.org/ )做比较。

SimpleHBase 简介

SimpleHBase( https://github.com/zhang-xzhi/simplehbase )是 Java 和 HBase 之间的轻量级中间件,主要包含以下功能:

  • 数据类型映射:Java 类型和 HBase 的 bytes 之间的数据转换。
  • 简单操作封装:封装了 HBase 的 put,get,scan 等操作为简单的 Java 操作方式。
  • HBase query 封装:封装了 HBase 的 filter,可以使用 SQL-like 的方式操作 HBase。
  • 动态 query 封装:类似于 mybatis,可以使用 xml 配置动态语句查询 hbase。
  • insert,update 支持: 建立在 HBase 的 checkAndPut 之上。
  • HBase 多版本支持:提供接口可以对 HBase 多版本数据进行查询, 映射。
  • HBase 原生接口支持。
  • HTablePool 管理。

设计理念

Phoenix 的设计理念为:We put the SQL back into NoSql。该理念的优点如下:

  1. SQL 做为大众熟悉的 API,用户学习成本较低。
  2. 减少程序员的代码开发量。
  3. 性能优化对用户透明。
  4. 兼容既有的基于 SQL 的工具。

该理念的缺点如下:

  1. SQL 屏蔽了 HBase 和 RDBMS 设计上的差别,抽象泄露的风险较高。关于抽象泄露参考 http://www.joelonsoftware.com/articles/LeakyAbstractions.html
  2. 为了 SQL 兼容,引入了 JDBC 层。由于 RDBM 和 HBase 的设计与模型本身差异较大,引入 JDBC 后,导致部分 HBase 的特性难以友好的支持。
  3. 大部分的应用不会直接使用 JDBC,而是使用 ORM,技术栈较深,导致抽象泄露问题更加严重。

SimpleHBase 的设计理念为:贴近 HBase 的 ORM 设计,简化 HBase 之上的 Java app 开发。

该理念的优点如下:

  1. 设计紧贴 HBase 的逻辑模型,提供一站式 HBase ORM 解决方案。
  2. 减少程序员的代码开发量。
  3. 用户友好的 HBase 特征支持。

该理念的缺点如下:

1. 不兼容 SQL,有一定的学习成本。

SimpleHBase 和 Phoenix 的技术栈如下所示。

类型转换

Phoenix 支持如下类型,目前不支持自定义类型。每种类型的序列化 (转化为 bytes 保存到 HBase 中) 和反序列化为固定的方式。

INTEGER

UNSIGNED_INT

BIGINT

UNSIGNED_LONG

TINYINT

UNSIGNED_TINYINT

SMALLINT

UNSIGNED_SMALLINT

FLOAT

UNSIGNED_FLOAT

DOUBLE

UNSIGNED_DOUBLE

DECIMAL

BOOLEAN

TIME

DATE

TIMESTAMP

UNSIGNED_TIME

UNSIGNED_DATE

UNSIGNED_TIMESTAMP

VARCHAR

CHAR

BINARY

VARBINARY

SimpleHBase 支持如下类型。每种类型的序列化和反序列化方式,可以使用 SimpleHBas 提供的默认方式,也可以用户自定义。

boolean

byte

short

char

int

long

float

double

String

Date

Enum

用户自定义类型:

通过 TypeHandler 支持自定义类型扩展。

SimpleHBase 的 rowkey 和类型映射如下:

RowKey 支持

Phoenix 把 rowkey 内化为 table 的 PRIMARY KEY 处理。

CREATE TABLE IF NOT EXISTS us_population ( state CHAR(2) NOT NULL, city VARCHAR NOT NULL, population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city));

同时,Phoenix 的 Salted Tables 技术可以解决 region server 的热点问题。

SimpleHBase 认为 rowkey 的设计是 HBase 应用设计中最重要的一环。因此,对于 RowKey 单独建模,给用户提供较高的灵活性。实际上,对于 HBase 而言,任何可以转换为 bytes 的对象都可以做为 rowkey 使用。

简单场景支持

对于简单的 put,scan,delete 场景。

Phoenix 提供的方案为:

Java app -> ORM(可选) -> SQL -> phoenix -> HBase

SimpleHBase 提供的方案为:

Java app -> SimpleHBase-> HBase

无需 SQL 这一层,直接用类似如下代码即可实现。

simpleHbaseClient.putObject(new PersonRowKey(1), person);

Person result = simpleHbaseClient.findObject(new PersonRowKey(1),

Person.class);

简单 SQL 支持

Phoenix 做为 HBase 上面的 SQL 封装,这块的功能比较丰富。SimpleHBase 提供 SQL-Like 方式的查询。支持常见的简单查询场景。目前,SimpleHBase 提供的运算符如下:

lessequal

less

greaterequal

greater

notequal

equal

notmatch

match

in

notin

between

notbetween

isnull

Isnotnull

Ismissing

isnotmissing

and

or

()

复杂 SQL 支持

对于 group by, join 等较为复杂的 SQL 语法,Phoenix 支持,SimpleHBase 目前不支持。

动态 SQL 支持

动态查询可以避免应用代码中大量 if-else 之类的判断,拼接查询条件,提高代码质量。

Phoenix 的方案:

引入其他 ORM 框架 (如 hibernate 或 mybatis)。

Simplehbase 的方案:

类似 mybatis,提供动态查询能力。

目前 simplehbase 提供的动态查询标签如下:

isNull

isNotNull

isEmpty

isNotEmpty

isPropertyAvailable

isNotPropertyAvailable

isEqual

isNotEqual

isGreaterThan

isGreaterEqual

isLessThan

isLessEqual

Dynamic

HBase 时间戳和多版本支持

Phoenix 方案:

时间戳,由 HBase 管理,或在 connection 建立时指定一个时间戳,该 connection 上所有操作就是基于该时间戳。

不支持多版本,只能支持最新值。

Simplehbase 方案:

时间戳可以由 HBase 管理,或者由应用自行指定。版本数,可以选择最新版本,或者多版本支持,由应用指定。

rowkey

timestamp

name

Age

key1

t4

d

复制代码
key1

t3

c

3

key1

t2

复制代码
2

key1

t1

a

1

假设 name 和 age 映射为一个 Person 类型对象。SimpleHBase 支持如下映射方式:

  • 一个 rowkey 对应的所有最新值映射为一个 object。
    例:该数据被映射为 Person(name=d,age=3)。

  • 一个 rowkey 对应的时间戳范围内 (由用户指定) 的最新值映射为一个 object (Phoenix 只提供一个时间戳,而不是时间戳范围) 。
    例:指定时间戳范围 (左闭右开) 为 [t1,t3),该数据被映射为 Person(name=a,age=2)。 - 一个 rowkey 对应的所有值,以时间戳为维度,映射成一个 object list。
    例:指定 maxVersion(控制最大版本数) 为 4, 该数据被映射为一个 person 的列表,按照时间戳排序。 ```

    Person(name=d)
    Person(name=c,age=3)
    Person(age=2)
    Person(name=a,age=1)

复制代码
- 一个 rowkey 对应的时间戳范围内的所有值,以时间戳为维度,映射成一个 object list
例:指定时间戳范围为 \[t1,t3),maxVersion 为 4, 该数据被映射为一个 person 的列表,按照时间戳排序。 ```
Person(age=2)
Person(name=a,age=1)

其他

SimpleHBase 中包含了一些 HBase 特性的封装或增强。

如:

SimpleHBase 支持批量 put 操作,以提升性能。

HTable 的 autoflush 设置为 false,同时,有一个线程定期做 flush。既可以提高应用的吞吐能力,也可以有一定的 flush 保证。

小结

目前,SimpleHBase 已经在阿里的多个项目中得到应用。从设计理念看,SimpleHBase 并不是 Phoenix 的一个重复轮子,而是有着自己清晰的目标。即贴近 HBase 的 ORM 设计,简化 HBase 之上的 Java app 开发。同时,又可以把 HBase 的一些核心概念暴露给用户,方便用户对 HBase 特性的使用。

关于作者:

张信之,支付宝高级工程师,目前负责支付宝消费数据组,西安交通大学计算机科学与技术专业硕士。兴趣广泛,近期工作聚焦在 HBase ORM 框架 Simplehbase 上。


感谢谢良,梁堰波对本文的审校,包研对本文的策划。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-06-05 23:235657

评论

发布
暂无评论
发现更多内容

Detailed comparison of MT7915 and MT7916 chips: Technical parameters and application scenario analysis

wifi6-yiyi

wifi

从0到1:AI与低代码如何推动企业创新

天津汇柏科技有限公司

低代码 AI 人工智能

“JVM” 上的AOP:Java Agent 实战

阿里技术

Java spring 阿里 aop

【技术分享】用AWS EC2搭建WordPress

伊克罗德信息科技

亚马逊云科技 EC2 MYSCALE

简化工作流程:选择最佳项目管理系统的5大要点

爱吃小舅的鱼

HTAP 数据库在国有大行反洗钱场景的应用

TiDB 社区干货传送门

TCL 实业 x TiDB丨从分销转向零售,如何考虑中台建设和数据库选型?

TiDB 社区干货传送门

更强模型、更低价格、更易落地,豆包大模型日均tokens使用量超5,000 亿,落地实践再进阶

新消费日报

photoshop 运行弹窗This non-genuine Adobe app has been disabled 详细的解决方法

Rose

Tipard Blu-ray Converter for Mac (蓝光视频转换软件) v10.0.72激活版

理理

体育赛况资讯直播app开发搭建部署

V\TG【ch3nguang】

体育赛况资讯直播app开发

AI驱动的商品企划软件 零售企业市场致胜的智能化利器

第七在线

数业智能心大陆 AI解答如何应对焦虑

心大陆多智能体

智能体 焦虑 AI大模型 心理健康 数字心理

全球化浪潮下的数据库革新:嘉里物流 TiDB 实践价值的设想

TiDB 社区干货传送门

华为云重磅参会 KubeCon China 2024,精彩议程揭晓 !

华为云原生团队

云计算 容器 云原生

sync-diff-inspector比对表结构,索引

TiDB 社区干货传送门

从 MySQL 迁移到 TiDB:使用 SQL-Replay 工具进行真实线上流量回放测试 SOP

TiDB 社区干货传送门

企业该怎么适应数字化转型?

优秀

数字化转型

亚信安慧AntDB-M聚合下推—加速你的数据分析查询

亚信AntDB数据库

AntDB

从供应商深度绑定,到走向真正的云原生,他们是这样做的

阿里云云效

阿里云 云原生 云效

​​万界星空科技低代码云mes,更适合中小企业的mes系统

万界星空科技

低代码 低代码平台 mes 云mes 万界星空科技

火山引擎ByteHouse助力车企实现高性能数据分析

字节跳动数据平台

大数据 数据仓库 云原生 Clickhouse

智谱AI与和鲸科技签署战略合作协议,共拓大模型产业应用与人才培养新未来

ModelWhale

人工智能 大模型 ChatGLM

TiKV存储节点计划内外停机,如何去处理?

TiDB 社区干货传送门

故障排查/诊断 TiKV 底层架构 7.x 实践

从供应商深度绑定,到走向真正的云原生,他们是这样做的

阿里巴巴云原生

阿里云 云原生 云效

1688代采集运系统:跨境电商世界的神奇魔法棒

tbapi

1688代采系统 1688代采集运系统

如何挑选最适合你的免费文档管理系统?

爱吃小舅的鱼

文档管理 免费

新增姿态估计标注,以及模型应用优化|ModelWhale 版本更新

ModelWhale

鉴权 模型应用 模型服务

万亿城商行如何借助 TiDB 构建面向未来的金融核心系统

TiDB 社区干货传送门

实践案例

谈一谈数据虚拟化的技术核心和应用架构

Aloudata

RP Data Fabric 逻辑数据编织

Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程

汀丶人工智能

人工智能 大模型 xinference

HBase ORM SimpleHBase设计_大数据_张信之_InfoQ精选文章