通过lindorm-cli(HBase模式)访问宽表引擎

更新时间:
复制 MD 格式

lindorm-cli除支持以MySQL/Avatica协议以SQL方式访问宽表引擎外,还提供了HBase兼容模式:通过hbase://连接宽表引擎后,可以使用一组熟悉的HBase Shell命令(create、put、get、scan、describe等)进行建表、插入、查询等数据操作。本文介绍如何使用lindorm-cli以HBase模式连接并使用Lindorm宽表引擎。

前提条件

  • 已下载并安装lindorm-cli。详情可参见安装方法。

    说明

    HBase模式需要2.4.0及以上版本的lindorm-cli。

  • 已将客户端IP地址添加至云原生多模数据库Lindorm实例的白名单中,添加方法请参见设置白名单。

使用场景

大多数场景下,我们都建议您优先通过MySQL协议(或Avatica协议)以SQL方式访问宽表引擎:SQL方式支持完整的宽表能力(二级索引、多列查询、聚合、分页等),生态与工具链也更丰富。

仅当您处于以下场景时,才建议使用HBase模式访问宽表引擎:

  • 宽表引擎中的表与数据是从HBase开源版本中迁移过来的:原有业务的表和数据是存在开源版本的HBase中,现在表和数据通过LTS等工具迁移到了Lindorm宽表引擎中。

  • 已有HBase使用习惯或存量脚本:您已熟悉HBase Shell命令语法(create / put / get / scan / describe等),希望直接沿用这些命令操作宽表引擎,而不必改写为SQL。

  • 需要执行HBase风格的表管理操作:例如按列族设置属性、管理namespace等。

连接方法

使用hbase://<host>:<port>格式的URL连接宽表引擎(hbase://前缀不可省略):

./lindorm-cli -url "hbase://<host>:30020" -username <用户名>

其中hbase://<host>:<port>为宽表引擎"使用HBase Java API访问"的连接地址(可在控制台数据库连接 > 宽表引擎页获取);HBase模式仅要求用户名,密码可选,如需鉴权可通过-password或环境变量LINDORM_PASSWORD传入。连接成功后即可在交互界面输入HBase命令。

说明

更多连接方式与参数(包括Windows下的连接、connect子命令等),请参见通过Lindorm-cli连接并使用宽表引擎。

HBase命令不以分号;结尾,单条命令直接回车执行;退出交互界面使用exit或quit。也可使用非交互模式(-execute)直接执行单条命令:

lindorm-cli -url "hbase://<host>:30020" -username <用户名> -execute "list"

命令参考

lindorm-cli在HBase模式下支持一组HBase Shell命令子集,按DDL/DML读/DML写/Namespace四类分组。您可随时在交互界面输入help查看全部命令,或help '<命令名>'查看单个命令的详细用法。

数据定义语言(DDL)

  • list:展示所有表,可选正则表达式过滤表名。

  • create:创建表(至少指定一个列族)。

  • describe(别名desc):展示指定表的详细信息,包括表属性、列族结构等。

  • exists:验证表是否存在。

  • disable:禁用表(使表离线,无法读写)。

  • enable:启用表(使表重新上线)。

  • alter:修改表或列族属性。

  • drop:删除指定表(需先disable)。

数据操作语言(DML)

  • put:写入或更新特定单元格中的值。

  • get:获取指定行或单元格的内容。

  • delete:删除表中单元格的值(单个版本)。

  • deleteall:删除指定行、列族或列的所有单元格。

  • scan:扫描并返回表数据。

  • count:计算并返回表中的行数。

Namespace命令

  • create_namespace:创建命名空间。

  • list_namespace:列出所有命名空间。

  • drop_namespace:删除命名空间(同时删除其下所有表)。

操作参考

以下示例均以交互式输入为主;在非交互模式下,将命令作为-execute的参数值传入即可。

建表并插入数据

  1. 创建表。创建时必须输入表和列族的名称。

    # 创建一个名称为 test、列族名为 cf 的表
    create 'test', 'cf'

    也可以在建表时以Hash形式为列族指定属性(如版本数VERSIONS):

    create 'test', {NAME => 'cf', VERSIONS => 3}
  2. 插入数据。

    put 'test', 'row1', 'cf:a', 'value1'
    put 'test', 'row2', 'cf:b', 'value2'
    put 'test', 'row3', 'cf:c', 'value3'

    其中row1为表test的Rowkey,cf:a表示列族名与列名,value1为值。put还可携带可选的时间戳(版本号),例如put 'test','row1','cf:a','value2', 1735689600000。

查询

  • 查询所有表的信息。支持使用正则表达式过滤表名。

    list
    list 'test'
    list 't.*'
  • 查询指定表的数据(scan)。scan可用于扫描全表或查询固定范围的数据。

    scan 'test'

    在默认(table)格式下,返回采用HBase原生风格(ROW / COLUMN+CELL两列):

    ROW                     COLUMN+CELL
    row1                    column=cf:a, timestamp=1735689600000, value=value1
    row2                    column=cf:b, timestamp=1735689600000, value=value2
    row3                    column=cf:c, timestamp=1735689600000, value=value3
    3 row(s) in 0.0230 seconds

    scan支持以Hash形式指定扫描属性,例如起止行键、限制行数与过滤器:

    scan 'test', {STARTROW => 'row1', STOPROW => 'row3', LIMIT => 100}
    scan 'test', {FILTER => "PrefixFilter('row')"}
  • 查询表的单条数据(get)。

    get 'test', 'row1'

    在默认(table)格式下,返回COLUMN / CELL两列:

    COLUMN                  CELL
    cf:a                    timestamp=1735689600000, value=value1
    1 row(s) in 0.0350 seconds

    可携带Hash属性只读取指定列:get 'test', 'row1', {COLUMN => 'cf:a'}。

  • 统计行数(count)。

    count 'test'
    说明

    get / scan在-format json下,每个单元格渲染为一行,固定字段为row_key / column_family / qualifier / timestamp / value,便于程序解析。行数限制可通过-max-rows控制(对scan有效)。

查看表结构(describe)

describe 'test'

在默认(table)格式下,describe按列族聚合为HBase原生风格输出。

禁用和启用表

如果要对一张表执行删除、修改设置或其他操作,请先使用disable命令禁用这张表;完成后再使用enable命令重新启用。

disable 'test'
enable 'test'

删除表

删除指定表(需先禁用):

disable 'test'
drop 'test'

常用配置参考

可通过alter命令为表或列族调整常用配置。

# 为列族设置数据压缩算法
alter 'test', {NAME => 'cf', COMPRESSION => 'ZSTD'}

# 为列族设置版本数
alter 'test', {NAME => 'cf', VERSIONS => 5}

# 为列族设置数据有效期TTL(单位秒,2592000 秒 = 30 天)
alter 'test', {NAME => 'cf', TTL => 2592000}

修改后可通过describe 'test'验证是否生效。

说明

alter与其他破坏性命令在开启-safe-mode时会被拦截(见下文安全模式),需要时请在不开启安全模式的会话中执行。

输出格式与常用参数

HBase模式复用lindorm-cli的通用输出格式与安全能力,可通过以下参数控制(参数完整说明请参见通过Lindorm-cli连接并使用宽表引擎的命令行参数与子命令):

参数

说明

-format

输出格式,支持column(默认)/ json / jsonl / csv / vertical / horizontal。默认table风格下get / scan / describe采用HBase原生风格;json / jsonl输出结构化数据,便于程序解析。

-max-rows

限制客户端返回的最大行数,对scan有效(对get / count不生效)。

-safe-mode

开启安全模式,拦截破坏性命令。

-bytesOutputAsString

在原生table风格下将非可打印字节渲染为\xHH。

-output

将非交互模式的执行结果输出到指定文件。

示例:以JSON格式安全扫描并限制行数:

lindorm-cli -url "hbase://<host>:30020" -username user -format json -safe-mode -max-rows 1000 -execute "scan 'test'"

安全模式

在HBase模式下开启-safe-mode后,客户端会在命令执行前拦截以下破坏性命令,避免误操作:

拦截的命令

说明

disable

禁用表

drop

删除表

truncate / truncate_preserve

清空表

alter

修改表/列族(可能携带列族删除,整条拦截)

delete

删除单版本单元格

deleteall

删除整行/列族/列

drop_namespace

删除命名空间

lindorm-cli -url "hbase://<host>:30020" -username user -safe-mode -execute "drop 'test'"
#output: Operation [DROP] is forbidden by --safe-mode
说明

put / create / enable / create_namespace等非破坏性命令不受拦截。

常见问题

  • Q:HBase模式下为何提示无法连接宽表引擎?

    A:请确认:

    1. lindorm-cli版本为2.4.0及以上。

    2. URL严格为hbase://<host>:<port>且hbase://前缀未省略。

    3. 使用的是控制台中使用HBase Java API访问的连接地址。

    4. Lindorm宽表引擎的版本是否是2.4以后的版本。

  • Q:为什么读到的数据是乱码?

    A:请确认目标表是通过HBase API / HBase Shell创建的。请勿使用HBase模式访问基于SQL创建的宽表;若需访问SQL宽表,请使用MySQL / Avatica协议。