微信号:infoqchina

介绍:有内容的技术社区媒体

【深度】HBase ORM SimpleHBase设计

2014-06-10 21:07 InfoQ

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

  • 如何保存对象到数据存储?

  • 如何从数据存储获取对象?

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

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

HBase ORM

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

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

  • 如何映射HTableRowKey

  • 如何映射HTablebytesJava类型?

  • 如何映射HTable的多版本能力?

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

SimpleHBase简介

SimpleHBasehttps://github.com/zhang-xzhi/simplehbase)是JavaHBase之间的轻量级中间件,主要包含以下功能:

  • 数据类型映射:Java类型和HBasebytes之间的数据转换。

  • 简单操作封装:封装了HBaseput,get,scan等操作为简单的Java操作方式。

  • HBase query封装:封装了HBasefilter,可以使用SQL-like的方式操作HBase

  • 动态query封装:类似于mybatis,可以使用xml配置动态语句查询hbase

  • insert,update支持: 建立在HBasecheckAndPut之上。

  • HBase多版本支持:提供接口可以对HBase多版本数据进行查询,映射。

  • HBase原生接口支持。

  • HTablePool管理。

设计理念

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

  1. SQL做为大众熟悉的API,用户学习成本较低。

  2. 减少程序员的代码开发量。

  3. 性能优化对用户透明。

  4. 兼容既有的基于SQL的工具。

该理念的缺点如下:

  1. SQL屏蔽了HBaseRDBMS设计上的差别,抽象泄露的风险较高。

  2. 为了SQL兼容,引入了JDBC层。由于RDBMHBase的设计与模型本身差异较大,引入JDBC后,导致部分HBase的特性难以友好的支持。

  3. 大部分的应用不会直接使用JDBC,而是使用ORM,技术栈较深,导致抽象泄露问题更加严重。

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

该理念的优点如下:

  1. 设计紧贴HBase的逻辑模型,提供一站式HBase ORM解决方案。

  2. 减少程序员的代码开发量。

  3. 用户友好的HBase特征支持。

该理念的缺点:不兼容SQL,有一定的学习成本。

类型转换

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

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

RowKey支持

Phoenixrowkey内化为tablePRIMARY KEY处理。

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

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

简单SQL支持

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

复杂SQL支持

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

HBase时间戳和多版本支持

Phoenix方案:时间戳,由HBase管理,或在connection建立时指定一个时间戳,该connection上所有操作就是基于该时间戳。不支持多版本,只能支持最新值。

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

小结

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

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 Cyanogen大批量裁员 五种常见的PHP设计模式 Python在终端中写一首七彩的情诗 码云正式支持 Pages 功能 有一种失败叫瞎忙(人应该干3件事)