本文为您介绍如何迁移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),计算和存储资源独立扩展,支持根据不同业务场景对计算能力和存储空间进行配比,更加灵活、经济。
多态存储 仅支持行存,以<rowkey, column, value, timestamp> 4元组形式存储。 支持行存储,列存储,行列共存多种模式。多态存储可以根据数据访问模式的不同而使用灵活的存储方式。
Schema表达能力 弱Schema,弱数据类型。 强Schema,丰富的数据类型。强Schema可以保证开发的效率,在数据质量不可靠,数据接口不明确的情况下,更易于通过Schema排查开发问题。
全局排序 全局排序 局部排序,聚簇索引。
分片策略 支持预先分片和自动分片的模式。 支持哈希(Hash)和随机分片的模式。
批量导入 支持,BulkLoad接口。 支持,BulkLoad接口(COPY)。
实时写入 支持,写入即可查。写入系统吞吐量(TPS)受限于Compaction性能。 支持,写入即可查。高TPS写入。
实时更新 支持。 支持。
SQL支持 通过Phoenix扩展支持,功能弱,不支持Join。受限于键值对(KV)存储模式,SQL性能弱。 高度兼容PostgreSQL:协议兼容、语法兼容、生态兼容。
存储能力 基于HDFS,用户自行维护集群,集群会自动同步数据至多副本,存储能力与集群规模有关,支持线性扩展,LSM-Tree数据结构,多种压缩算法。 基于分布式文件系统Pangu/HDFS,存储能力与集群规模有关,支持线性扩展,单表最大容量3PB+;多种存储模式和多种压缩算法赋能存储。
查询及分析能力 原生仅支持点查(GET)和扫描(SCAN)。点查每秒查询率(QPS,Queries per second)高,SCAN性能弱。Phoenix SQL通过Coprocessor支持,性能弱,不支持复杂计算,不支持联机分析处理(OLAP,Online Analytical Processing)场景。 亿级以上数据,实时查询及分析亚秒级响应;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的效果。

  • 前缀扫描

    前缀扫描是利用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;
    --更新统计信息
    vacumm 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,让针对老表上的查询结束再删除无用数据
    pg_sleep(5);
    drop table t_online_outdate;
  • OLAP

    Hologres不仅支持行存主键点查,也支持OLAP场景,在存储上,可以设计为行列共存模式,在查询时,查询引擎根据查询特征,选择最佳的存储结构,详情请参见CREATE TABLE