迁移HBase至Hologres

本文为您介绍如何迁移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的效果。有关多流合并的实践请参见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