You need to enable JavaScript to run this app.
文档中心
AI 数据湖服务

AI 数据湖服务

复制全文
下载 pdf
Apache Gravitino
Apache® Gravitino Lance REST Catalog 使用说明
复制全文
下载 pdf
Apache® Gravitino Lance REST Catalog 使用说明

1. 概览

Apache® Gravitino Lance REST Catalog(以下简称“Lance REST 服务”)提供一组兼容 Lance Namespace REST 规范的 HTTP API,用于管理 命名空间(Namespace) 与 表(Table) 的元数据。

Apache Gravitino, the names of other Apache projects, and the ASF logo are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries.

典型场景包括:

  • 在多引擎/多任务系统中,以统一 REST 入口管理 Lance 表的元数据
  • 在对象存储(如 TOS)中已存在数据目录的情况下,通过“注册表”方式完成纳管
  • 在自动化接入流程中,进行幂等创建、存在性校验、元数据查询与下线清理

说明

本功能目前处于白名单开放阶段,仅华北2(北京)及华东2(上海)区域支持使用。如需使用,请提交工单申请。开通后,您将获得服务访问端点(Endpoint),结合火山引擎访问密钥(AK/SK)即可在计算引擎中进行配置并使用。

2. 路径与标识符约定

2.1 Base URL

服务的 REST 根路径固定包含 /lance,接口路径以 /lance/v1 开头:

  • Base URL:https://{endpoint}/lance
  • API 前缀:/lance/v1/...

2.2 NamespaceId 与 TableId

Lance REST 在路径中使用字符串 id 表示命名空间或表,默认使用分隔符(delimiter)$:

  • namespaceId:
    • 一级:{catalog}
    • 二级:{catalog}${schema}
  • tableId:{catalog}${schema}${table}

分隔符可通过 query 参数 delimiter 传入(默认 $)。

2.3 URL 编码

$、@、# 等字符在 URL path 中需要进行百分号编码:

  • $ → %24
  • @ → %40
  • # → %23

例如:demo_catalog$demo_schema 需处理为: demo_catalog%24demo_schema

说明

  • 当前与 LAS Catalog 集成时,Lance 的二级命名空间(schema)统一映射在 LAS Catalog 的 Hive Catalog 之下;
  • 使用方无需感知内部的映射前缀/实现细节,仅需按 catalog$schema$table 的约定进行调用。

3. 使用前准备

3.1 获取服务 Endpoint 与 Region

你需要获取:

  • 服务访问端点(Endpoint)
  • Region(如 cn-beijing、cn-shanghai)

3.2 认证与签名(AK/SK)

在火山引擎托管环境中,Lance REST 服务采用火山引擎标准的 AK/SK 签名鉴权机制。请求通常需要包含:

  • Authorization: HMAC-SHA256 ...
  • X-Date: YYYYMMDD'T'HHMMSS'Z'
  • (可选)X-Expire: -1 | 0 | N(签名有效期控制)
  • Region: {region}

签名算法与实现细节请参考官方文档:https://www.volcengine.com/docs/6369/67269

4. API 参考

4.1 公共说明

环境变量(示例)

export LANCE_HOST='https://{endpoint}'
export LANCE_BASE="${LANCE_HOST}/lance"
export REGION='cn-beijing'

通用 Header(生产建议)

Header

必选

示例

说明

Region

是

cn-beijing

服务 Region

X-Date

是

20251117T100000Z

火山签名时间戳(UTC)

Authorization

是

HMAC-SHA256 Credential=... Signature=...

火山 AK/SK 签名

Content-Type

视接口

application/json

JSON 接口需要;Arrow 建表需要 application/vnd.apache.arrow.stream

通用 Query 参数

参数

必选

默认值

说明

delimiter

否

$

多级命名空间/表 ID 的分隔符

page_token

否

(空)

分页标识

limit

否

(空)

每页数量

错误响应(示例)
失败时通常返回 application/json 的错误结构(字段名以实际返回为准):

{
  "code": 404,
  "error": "Table not found",
  "type": "NoSuchTableException",
  "instance": "demo_catalog$demo_schema$demo_table",
  "detail": "..."
}

4.2 Namespace(命名空间)接口

4.2.1 列出子命名空间(catalog 列表)

  • 方法:GET
  • 路径:/lance/v1/namespace/{id}/list

输入参数

位置

参数

必选

示例

说明

path

id

是

root / demo_catalog

父命名空间 ID;常见约定用 root 表示顶层

query

delimiter

否

$

分隔符

query

page_token

否

...

分页标识

query

limit

否

100

每页数量

请求示例

curl --location "${LANCE_BASE}/v1/namespace/root/list" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}"

响应示例(200)

{
  "namespaces": ["demo_catalog", "demo_catalog2"],
  "page_token": null
}

4.2.2 创建命名空间

  • 方法:POST
  • 路径:/lance/v1/namespace/{id}/create

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog

命名空间 ID;二级命名空间需进行 URL 编码($ → %24)

query

delimiter

否

$

分隔符

body

mode

否

create

`create |

body

properties

否

{ "key": "value" }

透传属性

请求示例:创建一级 namespace(catalog)

curl --location --request POST "${LANCE_BASE}/v1/namespace/demo_catalog/create" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}" \
  --header 'Content-Type: application/json' \
  --data '{
    "mode": "create",
    "properties": {
      "comment": "created-by-demo"
    }
  }'

请求示例:创建二级 namespace(schema)

curl --location --request POST "${LANCE_BASE}/v1/namespace/demo_catalog%24demo_schema/create" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}" \
  --header 'Content-Type: application/json' \
  --data '{
    "mode": "create",
    "properties": {
      "location": "tos://{bucket}/{prefix}/"
    }
  }'

响应示例(200)

{
  "properties": {
    "key": "value"
  }
}

4.2.3 描述命名空间

  • 方法:POST
  • 路径:/lance/v1/namespace/{id}/describe

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema

命名空间 ID

query

delimiter

否

$

分隔符

请求示例

curl --location --request POST "${LANCE_BASE}/v1/namespace/demo_catalog%24demo_schema/describe" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}" \
  --header 'Content-Type: application/json' \
  --data '{}'

响应示例(200)

{
  "properties": {
    "location": "tos://{bucket}/{prefix}/"
  }
}

4.2.4 命名空间是否存在

  • 方法:POST
  • 路径:/lance/v1/namespace/{id}/exists

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema

命名空间 ID

query

delimiter

否

$

分隔符

响应

  • 存在:200 OK(通常无响应体)
  • 不存在:404 Not Found(返回错误结构)

4.2.5 删除命名空间

  • 方法:POST
  • 路径:/lance/v1/namespace/{id}/drop

注意:删除命名空间通常是递归的且不可恢复,建议先在测试环境验证。

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema

命名空间 ID

query

delimiter

否

$

分隔符

body

mode

否

FAIL

不传默认 FAIL

body

behavior

否

RESTRICT

不传默认 RESTRICT

请求示例

curl --location --request POST "${LANCE_BASE}/v1/namespace/demo_catalog%24demo_schema/drop" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}" \
  --header 'Content-Type: application/json' \
  --data '{"mode":"FAIL","behavior":"RESTRICT"}'

响应示例(200)

{}

4.2.6 列出命名空间下的 tables

  • 方法:GET
  • 路径:/lance/v1/namespace/{id}/table/list

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema

二级命名空间(catalog + schema)

query

delimiter

否

$

分隔符

query

page_token

否

...

分页标识

query

limit

否

100

每页数量

请求示例

curl --location "${LANCE_BASE}/v1/namespace/demo_catalog%24demo_schema/table/list" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}"

响应示例(200)

{
  "tables": ["demo_catalog$demo_schema$demo_table"],
  "page_token": null
}

4.3 Table(表)接口

4.3.1 创建空表(只存元数据)

  • 方法:POST
  • 路径:/lance/v1/table/{id}/create-empty

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema%24demo_table0

表 ID

query

delimiter

否

$

分隔符

body

location

是

tos://bucket/prefix/table.lance

表数据目录

body

properties

否

{ "k": "v" }

透传属性

请求示例

curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table0/create-empty" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}" \
  --header 'Content-Type: application/json' \
  --data '{
    "location": "tos://{bucket}/{prefix}/demo_table0.lance",
    "properties": {"k": "v"}
  }'

响应示例(200)

{
  "location": "tos://{bucket}/{prefix}/demo_table0.lance",
  "properties": {"key": "value"}
}

4.3.2 注册表(推荐:纳管已有数据目录)

  • 方法:POST
  • 路径:/lance/v1/table/{id}/register

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema%24demo_table

表 ID

query

delimiter

否

$

分隔符

body

location

是

tos://bucket/prefix/table.lance

表数据目录

body

mode

否

CREATE

常用 `CREATE |

body

properties

否

{...}

透传属性;服务端会补充 location 与 lance.register=true

请求示例

curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table/register" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}" \
  --header 'Content-Type: application/json' \
  --data '{
    "location": "tos://{bucket}/{prefix}/demo_table.lance",
    "mode": "CREATE",
    "properties": {
      "desc": "demo",
      "lance.hms.write-schema": true
    }
  }'

响应示例(200)

{
  "location": "tos://{bucket}/{prefix}/demo_table.lance",
  "properties": {
    "location": "tos://{bucket}/{prefix}/demo_table.lance",
    "lance.register": "true",
    "desc": "demo"
  }
}

4.3.3 解注册表(仅删除元数据,不删除底层数据)

  • 方法:POST
  • 路径:/lance/v1/table/{id}/deregister

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema%24demo_table

表 ID

query

delimiter

否

$

分隔符

请求示例

curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table/deregister" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}" \
  --header 'Content-Type: application/json' \
  --data '{}'

响应示例(200)

{
  "location": "tos://{bucket}/{prefix}/demo_table.lance",
  "properties": {"key": "value"}
}

4.3.4 表是否存在

  • 方法:POST
  • 路径:/lance/v1/table/{id}/exists

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema%24demo_table

表 ID

query

delimiter

否

$

分隔符

响应

  • 存在:200 OK(通常无响应体)
  • 不存在:404 Not Found(返回错误结构)

4.3.5 描述表

  • 方法:POST
  • 路径:/lance/v1/table/{id}/describe

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema%24demo_table

表 ID

query

delimiter

否

$

分隔符

body

version

否

null

不传/null 表示最新版本

请求示例

curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table/describe" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}" \
  --header 'Content-Type: application/json' \
  --data '{}'

响应示例(200)

{
  "location": "tos://{bucket}/{prefix}/demo_table.lance",
  "properties": {"key": "value"}
}

4.3.6 删除表

  • 方法:POST
  • 路径:/lance/v1/table/{id}/drop

注意:该操作可能删除元数据与底层数据文件,请务必确认影响范围。LAS Catalog 默认不删除实际数据。

输入参数

位置

参数

必选

示例

说明

path

id

是

demo_catalog%24demo_schema%24demo_table

表 ID

query

delimiter

否

$

分隔符

请求示例

curl --location --request POST "${LANCE_BASE}/v1/table/demo_catalog%24demo_schema%24demo_table/drop" \
  --header "Region: ${REGION}" \
  --header "X-Date: {ts}" \
  --header "Authorization: {auth}"

响应示例(200)

{
  "id": ["demo_catalog", "demo_schema", "demo_table"],
  "location": "tos://{bucket}/{prefix}/demo_table.lance",
  "properties": {"key": "value"}
}

5. 常见问题(FAQ)

5.1 返回 401 / Unauthorized

  • 检查 Authorization/X-Date 是否按火山签名算法正确生成
  • 检查 Region 是否与服务端 Region 一致
  • 如使用了网关/反向代理,确保签名中 host 与实际请求 host 一致

5.2 创建成功但查询不到

  • 检查 {id} 是否正确拼接与 URL 编码(尤其是 $、@、#)
  • 检查是否访问了正确的 Endpoint 与路径前缀(是否需要额外的 /gravitino-lance)
最近更新时间:2026.04.16 20:10:14
这个页面对您有帮助吗?
有用
有用
无用
无用