本文为您介绍如何迁移HBase的语法和数据至Hologres上进行数据开发。
背景信息
Hologres支持行存表模式,在该模式下,提供高性能基于主键的点查能力,广泛应用在Flink维度表、ID-Mapping、标签获取、订单明细查询等场景中。相比传统的HBase等技术,Hologres保留了横向扩展能力和高性能的主键点查能力,同时解决了Schema Free带来的数据质量管理难题,也通过更少的外部依赖提升了系统的稳定性。支持宽表设计、多流合并、前缀扫描(Prefix Scan)等多种HBase常用场景。支持针对HBase接口平滑迁移的SDK。您可以从HBase迁移表和数据至Hologres获取更好的数据开发体验。
Hologres与HBase对比
Hologres与HBase产品特性对比如下。
能力 | HBase | Hologres | |
产品定位 | 分布式面向列簇的开源数据库。 | 云原生分布式实时数仓。 | |
系统架构 | 存储计算耦合,存储依赖底层Hadoop分布式文件系统(HDFS),HDFS集群需要手动扩容。HBase表根据Region大小进行分区,分别存储在集群不同的节点上。 | 计算节点采用海量并行处理(MPP,Massively Parallel Processing)架构,基于存储计算分离(Storage Disaggregation),计算和存储资源独立扩展,支持根据不同业务场景对计算能力和存储空间进行配比,更加灵活、经济。 | |
多态存储 | 仅支持行存,以 | 支持行存储,列存储,行列共存多种模式。多态存储可以根据数据访问模式的不同而使用灵活的存储方式。 | |
Schema表达能力 | 弱Schema,弱数据类型。 | 强Schema,丰富的数据类型。强Schema可以保证开发的效率,在数据质量不可靠,数据接口不明确的情况下,更易于通过Schema排查开发问题。 | |
全局排序 | 全局排序 | 局部排序,聚簇索引。 | |
分片策略 | 支持预先分片和自动分片的模式。 | 支持哈希(Hash)和随机分片的模式。 | |
批量导入 | 支持,BulkLoad接口。 | 支持,BulkLoad接口(COPY)。 | |
实时写入 | 支持,写入即可查。写入系统吞吐量(TPS)受限于Compaction性能。 | 支持,写入即可查。高TPS写入。 | |
实时更新 | 支持。 | 支持。 | |
SQL支持 | 通过Phoenix扩展支持,功能弱,不支持Join。受限于键值对(KV)存储模式,SQL性能弱。 | 高度兼容PostgreSQL:协议兼容、语法兼容、生态兼容。 | |
存储能力 | 基于HDFS,用户自行维护集群,集群会自动同步数据至多副本,存储能力与集群规模有关,支持线性扩展,LSM-Tree数据结构,多种压缩算法。 | 基于分布式文件系统Pangu/HDFS,存储能力与集群规模有关,支持线性扩展,单表最大容量3PB+;多种存储模式和多种压缩算法赋能存储。 | |
查询及分析能力 | 原生仅支持点查 | 亿级以上数据,实时查询及分析亚秒级响应;Join能力强大。点查QPS高。支持OLAP场景。 | |
联邦计算 | 不支持。 | 支持离线实时联邦计算,支持MaxCompute、OSS等外部表查询加速。 | |
备份及容灾 | 支持,在数据方面,具备大数据标准三副本保障。 | 支持,在数据方面,具备大数据标准三副本保障。 | |
查询语言 | 查询语言 | Java API(需要与其他框架共同使用,例如Apache Phoenix)。 | PostgreSQL,无需额外结合其他组件和框架即可使用支持完备的SQL语法,DDL对象也更丰富,支持全Join关联查询。 |
DDL | 支持(关键字:create,alter,drop,describe,list;对象:namespace,table,column family)。 | 支持(关键字:create,alter,drop;对象:database,table,view,schema,cast,extension,role,user,user mapping,group)。 | |
DML | 支持(关键字:put,get,scan,delete,truncate)。 | 支持(关键字:select,insert,update,delete)。 | |
DCL | 支持(关键字:grant,revoke,rollback)。 | 支持(关键字:grant,revoke,rollback)。 | |
运维 | 需自行运维。 | 全托管,系统自动化感知集群的拓扑信息变化,用户侧无感知。 | |
生态 | HBase兼容Hadoop生态。 | Hologres高度兼容PostgreSQL生态。 | |
适用场景 | 海量存储,非结构化存储,单点查询性能优异,写密集型数据库。 | 实时数仓,在线数据服务。联通数据孤岛,海量数据实时查询及分析,弹性扩展集群,完整SQL支持。 | |
开发方式 | 应用开发复杂,需要将业务分析的指标、维度、表、聚合等概念,转化为存储的KeyValue概念,将应用层查询过滤场景翻译为对Key的字节过滤操作,系统效率严重依赖Key设计的质量。整个系统从数据录入到数据分析查询等复杂多样的场景,依赖应用层对KeyValue基础接口的使用。 | 应用开发简单,面向Table开发,使用SQL标准语句,适用于复杂多维分析,嵌套查询,关联查询等场景。提供JDBC、ODBC接口,面向数据主题建模开发。从面向指标,面向宽表开发,转化为Hologres面向主题域建模,减少了数据模型在采集端、处理端、分析端的异构信息衰减,减少了数据加工的层次,提高了数据使用的灵活性。 |
语法迁移
SQL语法和常见命令映射
Hologres支持HBase常见的基本语法,并提供SQL接口,以及Hologres Client客户端SDK。
HBase语法
Hologres语法
客户端命令
PUT
insert into values on conflict
HoloClient.put(Put(表名,主键值,数据列的值))
DELETE
delete from
HoloClient.put(Delete(表名,主键值))
SCAN
select from where filter=XX
HoloClient.scan(Scan(表名,主键值+主键范围,返回列))
GET
select from where PK=XX
HoloClient.get(Get(表名,主键值,返回列))
宽表设计
宽表是HBase最基本的数据模型,在Hologres中使用行存表,有关行存表的设计方案,请参见Key/Value查询场景最佳实践。
行存表可以支持3000列,列存表的列不建议超过1000列。
由于TEXT类型会默认创建Bitmap索引和字典编码,因此对于超多列场景,不建议使用默认设置,建议手工配置需要的Bitmap索引和字典编码。
多流合并
多流合并是利用Hologres的局部更新能力,多个数据流同时写入单一表,通过表的主键实现Merge即Join的效果。有关多流合并的实践请参见Flink全托管概述。
前缀扫描
前缀扫描是利用HBase的前缀顺序特性,高效率过滤数据,在Hologres通过Distribution Key和Clustering Key的设计实现相同的过滤效果。
假如HBase的rowkey为
[hash(pk0, pk1), pk0, pk1,..., pkN]
,Hologres应设置Primary Key为(pk0, pk1,..., pkN)
、Distribution Key为(pk0, pk1)
、Clustering Key与Primary Key保持一致。那么支持前缀equals扫描的SQL如下:
WHERE pk0=? AND pk1=? AND ... AND pkX=? ;
支持前缀range扫描的SQL如下:
WHERE pk0=? AND ... AND pkX=? AND pkX+1 BETWEEN ? AND ?;
如果表的主键为
(rowkey, ts)
,查询命令如下:SELECT col1, col2, ts FROM tbl WHERE rowkey = '1234567890' AND ts BETWEEN 1637637479606 AND 1640229479607 LIMIT 100;
这种条件下,适合Distribution key设计为rowkey,Clustering key设计为
(rowkey, ts)
的组合键。如果表的主键为 (rowkey, ts),查询命令如下:
SELECT col1, col2, ts FROM tbl WHERE rowkey = '1234567890' AND ts = 1637637479606;
这种条件下,适合Distribution key设计为
(rowkey, ts)
, Clustering key设计为(rowkey, ts)
的组合键。
批量更新
Hologres支持Insert、Update、Insert on Conflict等多种更新方式,支持行更新、列更新和Upsert等场景,在实现批量更新场景下,写入更新的吞吐量比较大,有可能影响线上对延迟敏感的在线服务,这种情况建议通过写入临时表再原子替换的方式实现批量更新,类似BulkLoad模式,示例如下。
--假设线上服务的表为 t_online; --创建临时表 BEGIN; CREATE TABLE t_tmp ( ... ) COMMIT; --向临时表写入数据 INSERT INTO t_tmp SELECT * FROM t_offline; --更新统计信息 vacuum t_tmp; analyze t_tmp; --在事务中,实现原子替换 BEGIN; ALTER TABLE t_online rename TO t_online_outdate; ALTER TABLE t_tmp rename TO t_online; COMMIT; --延迟5s,让针对老表上的查询结束再删除无用数据 SELECT pg_sleep(5); DROP TABLE t_online_outdate;
OLAP
Hologres不仅支持行存主键点查,也支持OLAP场景,在存储上,可以设计为行列共存模式,在查询时,查询引擎根据查询特征,选择最佳的存储结构,详情请参见CREATE TABLE。