基于DLF访问Paimon Catalog

HologresV3.2版本开始,支持通过DLF访问Paimon Catalog数据,为用户提供统一界面,提升元数据管理效率。

背景信息

阿里云数据湖构建(Data Lake Formation,简称DLF)是一款全托管的统一元数据和数据存储及管理平台,为客户提供元数据管理、权限管理和存储优化等功能。该平台能够实现元数据的统一、湖表格式的统一以及数据存储的统一,显著简化客户在数据湖构建和管理过程中的运维工作,助力企业聚焦于业务创新和数据洞察。详情请参见什么是数据湖构建

功能详情

  • 支持通过External Database对接DLF中的Paimon Catalog,详情请参见EXTERNAL DATABASE

    • 支持通过Create/Drop External Schema实现级联创建/删除Paimon Catalog中的Database。

    • 支持通过Create/Drop External Table实现级联创建/删除Paimon Catalog中的表。

    • 支持查看Paimon Catalog中的所有Database和表。

  • 支持使用Dynamic Table全量、增量读取Paimon表数据,详情请参见CREATE DYNAMIC TABLE

  • 支持使用ANALYZE、AUTO ANALYZE收集外部表统计信息,帮助优化器生成最佳的查询计划,详情请参见ANALYZEAUTO ANALYZE

  • 支持外部表数据镜像。

  • TimeTravel:支持基于Timestamp、Version、Tag查询Paimon表历史快照。

  • 分支查询:支持基于Branch查询Paimon分支数据及历史快照。

  • 支持查询Paimon系统表,如Snapshots、Tags。

前提条件

使用限制

  • 仅支持访问同地域的DLF服务。

  • 暂不支持回写Paimon表。

  • 暂不支持使用HoloWeb中的OSS数据湖加速功能可视化创建DLF Paimon Catalog。

  • External Database方式映射的Paimon外表支持TimeTravel查询、Branch查询和数据镜像能力。

  • 暂不支持对发生Schema Evolution的表执行TimeTravel查询。

  • Dynamic Table暂不支持Paimon表和BranchTimeTravel查询。

  • 外部表镜像暂不支持Paimon主键表。

  • 不支持读取Paimon默认分区数据,如分区值为空或者NULL的分区。

  • 只读从实例暂不支持开启数据湖加速能力。

  • 不支持对外部表执行UPDATE、DELETETRUNCATE等命令。

使用External Database方式映射Paimon Catalog

创建External Database(SLR模式)

服务关联角色(SLR)是一种可信实体为阿里云服务的RAM角色,旨在解决跨云服务的授权访问问题。多数情况下,当您使用特定功能时,关联的云服务会自动创建或删除服务关联角色,不需要您手动创建或删除。通过服务关联角色可以更好地配置云服务正常操作所必需的权限,避免误操作带来的风险。详情请参见服务关联角色

适用场景

SLR模式适用于使用当前用户身份访问External Database数据的场景,Hologres默认基于SLR和身份透传实现跨云产品访问。

操作步骤

  1. 对于新购或升级至Hologres V2.2及以上版本的实例,系统会默认创建服务关联角色,无需手动创建,可跳过该步骤。

    说明

    Hologres V2.2以下版本的实例,需访问控制快速授权页面,创建服务关联角色。

  2. 连接Hologres实例并创建External Database。

    CREATE EXTERNAL DATABASE <ext_database_name> WITH
      catalog_type 'paimon'
      metastore_type 'dlf-rest'
      dlf_catalog '<dlf_catalog_name>' 
      comment 'paimon catalog on dlf'
      ;
  3. 查看External Database下的Schema和表。

    -- 查询External Database下的Schema
    SELECT * FROM hologres.hg_external_schemas('<ext_database_name>');
    
    -- 查询Schema下的表
    SELECT * FROM hologres.hg_external_tables ('<ext_database_name>', '<ext_schema_name>');
  4. 查询表数据。

    SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;

创建External Database(STS模式)

阿里云STS(Security Token Service)是阿里云提供的一种临时访问权限管理服务。RAM提供RAM用户和RAM角色两种身份。其中,RAM角色不具备永久身份凭证,而只能通过STS获取可以自定义时效和访问权限的临时身份凭证,即安全令牌(STS Token),详情请参见什么是STS

适用场景

STS模式适用于跨账号访问和Hologres自定义账号(BASIC账号)访问External Database数据的场景。

操作步骤

  1. 登录RAM控制台,创建RAM角色,并授予DLF访问权限AliyunDLFFullAccessAliyunDLFReadOnlyAccess。详情请参见创建RAM角色并授权

  2. 增加信任策略,允许该RAM角色被可信云服务Hologres扮演。详情请参见修改RAM角色的信任策略

    {
      "Statement": [
        {
          "Action": "sts:AssumeRole",
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "hologres.aliyuncs.com"
            ]
          }
        }
      ],
      "Version": "1"
    }
  3. 登录数据湖构建控制台,在目标Catalog中对RAM角色授予DB和表的访问权限。详情请参见授权管理

  4. Hologres中创建External Database,认证策略指定上述RAM角色。

    CREATE EXTERNAL DATABASE <ext_database_name> WITH
      catalog_type 'paimon'
      metastore_type 'dlf-rest'
      dlf_catalog 'paimon_catalog' 
      rolearn 'acs:ram::106380604****:role/***-ramrole'
      comment 'paimon catalog on dlf'
      ;
  5. Hologres中创建USER MAPPING,将需要访问DLF CatalogRAM用户或BASIC账号关联到RAM角色。

    CREATE USER MAPPING FOR "<RAM用户|BASIC账号>"
    EXTERNAL DATABASE <ext_database_name>
    OPTIONS
    (
       rolearn 'acs:ram::10638060***:role/***ramrole'
    );
    说明
  6. 通过RAM用户登录Hologres管理控制台BASIC账号重新连接Hologres实例后,执行以下查询SQL。

    SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;

External Database相关操作

查看实例中的External Database

SELECT database_name, options FROM hologres.hg_external_databases();

刷新External Database元数据

REFRESH CACHE FOR EXTERNAL DATABASE <EXT_DB_NAME> WITH( cache_level = 'metadata');

查看指定External Database下的Schema

SELECT * FROM hologres.hg_external_schemas('<ext_database_name>');

External Schema相关操作

创建External SchemaPaimon Catalog

创建EXTERNAL SCHEMA会在DLF Paimon Catalog中实际创建一个Database,代码如下:

-- 创建EXTERNAL SCHEMA
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] <ext_database_name>.<ext_schema_name>;

刷新External Schema元数据

REFRESH CACHE FOR EXTERNAL SCHEMA <ext_database_name>.<ext_schema_name> WITH( cache_level = 'metadata'); 

删除External Schema

删除EXTERNAL SCHEMA会实际删除Paimon Catalog下对应DBDB下所有的表,请谨慎操作。

-- 删除EXTERNAL SCHEMA
DROP EXTERNAL SCHEMA [IF NOT EXISTS] <ext_database_name>.<ext_schema_name>;

查看指定Schema下的表

SELECT * FROM hologres.hg_external_tables ('<ext_database_name>', '<ext_schema_name>');

External Table相关操作

创建External TablePaimon Catalog

-- 创建非分区表

CREATE EXTERNAL TABLE <ext_database_name>.<ext_schema_name>.<ext_table_name>(
    id TEXT,                                        
    created_at BIGINT,                             
    type TEXT,                                      
    actor_id TEXT,                                  
    actor_login TEXT,                               
    repo_id TEXT,                                   
    repo_name TEXT,                                 
    org TEXT,                                       
    org_login TEXT,                                 
    PRIMARY KEY(id)
) WITH (
  "changelog-producer"='input',
  "bucket"=6,
  "bucket-key"='id'
);

-- 创建分区表

CREATE EXTERNAL TABLE <ext_database_name>.<ext_schema_name>.<ext_table_name>(
    id TEXT,                                        
    created_at BIGINT,                              
    type TEXT,                                      
    actor_id TEXT,                                  
    actor_login TEXT,                               
    repo_id TEXT,                                  
    repo_name TEXT,                                 
    org TEXT,                                       
    org_login TEXT                                
)
LOGICAL PARTITION BY LIST(created_at)
 WITH (
  "file_format" = 'orc',
  "bucket"=6,
  "bucket-key"='id'
);

刷新External Table元数据

REFRESH CACHE FOR EXTERNAL TABLE <ext_db_name>.<ext_schema_name>.<ext_table_name> WITH( cache_level = 'metadata');

删除External Table

删除External Table会实际删除DLF Paimon Catalog中的表,请谨慎操作。

-- 删除External Table
DROP EXTERNAL TABLE IF EXISTS <ext_database_name>.<ext_schema_name>.<ext_table_name>;

收集外表统计信息

AnalyzeAuto Analyze命令用于收集数据库中表内容的统计信息,优化器会根据这些统计信息生成最佳的查询计划,从而提高查询效率,详情请参见ANALYZEAUTO ANALYZE

-- 更新某个表的统计信息,默认会收集表中所有列的统计信息
analyze <ext_database_name>.<ext_schema_name>.<ext_table_name>;

-- 更新某个列的统计信息,会比更新表时采样的数据更多,更精准,主要用于更新管理条件的列
analyze <ext_database_name>.<ext_schema_name>.<ext_table_name>(<colname>, <colname>);

-- 打开Auto Analyze
ALTER EXTERNAL DATABASE <ext_database_name> WITH enable_auto_analyze 'true';

TimeTravel查询

HologresV3.2版本开始,支持基于Timestamp、Version、TagPaimon表进行历史Snapshots查询,从而实现对数据的TimeTravel功能,同时支持在Hologres侧查询Paimon Snapshots、Tags系统表,来获取目标表的Snapshot详情。关于系统表介绍详情,请参见Paimon System Tables

查询Paimon Snapshots系统表

SELECT * FROM hologres.hg_list_snapshots('<ext_database_name>.<ext_schema_name>.<ext_table_name>;');

Snapshots系统表包含的字段信息与Paimon系统表的对应关系如下:

Snapshots系统表字段

类型

描述

Paimon系统表对应字段

branch_name

TEXT

分支名称。

branch_name

snapshot_id

TEXT

快照ID。

snapshot_id

schema_id

TEXT

Schema ID。

schema_id

commit_kind

TEXT

表数据提交类型。

commit_kind

commit_time

TIMESTAMPTZ

提交时间。

commit_time

extend_info

TEXT(JSON)

Paimon Snapshots系统表剩余属性。

Paimon Snapshots系统表剩余属性

您也可以通过hologres.hg_list_versions函数来查询Paimon Snapshots系统表,对于Paimon表查询来说,Version对应Snapshots ID。

SELECT * FROM hologres.hg_list_versions('<ext_database_name>.<ext_schema_name>.<ext_table_name>');

查询Paimon Tag系统表

SELECT * FROM hologres.hg_list_tags('<ext_database_name>.<ext_schema_name>.<ext_table_name>');

Tag系统表包含的字段信息与Paimon系统表的对应关系如下:

Tag系统表字段

类型

描述

Paimon系统表对应字段

branch_name

TEXT

分支名称。

branch_name

tag_name

TEXT

标签名称。

tag_name

snapshot_id

TEXT

快照ID。

snapshot_id

schema_id

TEXT

Schema ID。

schema_id

commit_time

TIMESTAMPTZ

提交时间。

commit_time

extend_info

TEXT(JSON)

Paimon Tag系统表剩余属性。

Paimon Tag系统表剩余属性

基于Timestamp查询Paimon历史快照

SELECT * FROM '<ext_database_name>.<ext_schema_name>.<ext_table_name>' FOR TIMESTAMP AS OF '<timestamp>';

基于Version查询Paimon历史快照

对于Paimon表来说,Version对应Snapshots ID。

SELECT * FROM '<ext_database_name>.<ext_schema_name>.<ext_table_name>' FOR VERSION AS OF '<version>';

基于Tag查询Paimon历史快照

SELECT * FROM '<ext_database_name>.<ext_schema_name>.<ext_table_name>' FOR TAG AS OF '<tag>';

Branch查询

HologresV3.2.版本开始,支持基于Branch查询Paimon表指定分支数据,并支持分支Fallback属性,更多关于Paimon Branch介绍详情,请参见Manage Branch

查询Branch系统表

SELECT * FROM hologres.hg_list_branches('<ext_database_name>.<ext_schema_name>.<ext_table_name>');

Branch系统表包含的字段信息与Paimon系统表的对应关系如下:

字段

类型

描述

Paimon系统表对应字段

branch_name

TEXT

分支名称。

branch_name

create_time

TIMESTAMPTZ

分支创建时间。

create_time

extend_info

TEXT(JSON)

Paimon Branch系统表剩余属性。

Paimon Branch系统表剩余属性

查询指定分支数据

SELECT * FROM '<ext_database_name>.<ext_schema_name>.<ext_table_name>' FOR branch AS OF '<tag>';
说明

如果Paimon表设置了scan.fallback-branch属性,查询作业从当前分支读取数据时,某个分区不存在,读取器会尝试从备用分支(Fallback Branch)读取该分区的数据。更多关于Fallback Branch介绍详情,请参见Manage Branch

查询指定分支的历史Snapshots数据

-- 基于Timestamp查询
SELECT * FROM '<ext_database_name>.<ext_schema_name>.<ext_table_name>' FOR branch AS OF '<branch_name>' TIMESTAMP AS OF '<timestamp>';

-- 基于Tag查询
SELECT * FROM '<ext_database_name>.<ext_schema_name>.<ext_table_name>' FOR branch AS OF '<branch_name>' TAG AS OF '<tag_name>';

湖表镜像加速

HologresV3.2版本起,新增湖表镜像功能,以加速湖上数据查询。该功能支持元数据与数据镜像,能够近实时或按指定时间间隔将外部数据源的变更同步至Hologres。此外,还支持全表镜像和分区表的部分镜像,可通过参数灵活控制镜像数据的范围。更多介绍详情,请参见湖表镜像

使用Foreign Table方式消费Paimon

  1. 创建Foreign Server。

    关于Foreign Server的更多操作详情,请参见Foreign Server更多操作(SQL方式)

    -- create foreign server
    
    CREATE SERVER IF NOT EXISTS <server_name> FOREIGN DATA WRAPPER dlf_fdw OPTIONS (
        catalog_type 'paimon',
        metastore_type 'dlf-rest', 
        dlf_catalog '<dlf_catalog_name>'
    );
  2. 创建外部表。

    • IMPORT FOREIGN SCHEMA方式

      关于IMPORT FOREIGN SCHEMA使用详情,请参见IMPORT FOREIGN SCHEMA

      -- 使用IMPORT FOREIGN SCHEMA创建外表
      IMPORT FOREIGN SCHEMA <dlf_db_name>
      FROM SERVER <server_name> 
      INTO <holo+schema_name> 
      options (if_table_exist 'update');
    • CREATE FOREIGN TABLE方式

      关于CREATE FOREIGN TABLE使用详情,请参见CREATE FOREIGN TABLE

      CREATE FOREIGN TABLE <foreign_table_name>
      (
        { column_name data_type }
        [, ... ]
      ) 
      SERVER <server_name>
      options
      (
        schema_name '<dlf_db_name>',
        table_name '<dlf_table_name>'
      );

使用Dynamic Table消费Paimon

Dynamic Table可以自动处理并存储一个或者多个基表(Base Table)对象的数据聚合结果,内置不同的数据刷新策略,业务可以根据需求设置不同的数据刷新策略,实现数据从基表对象到Dynamic Table的自动流转,满足业务统一开发、数据自动流转、处理时效性等诉求。HologresV3.0版本开始,支持把MaxCompute外部表和DLF外部表作为Dynamic Table的基表,详见Dynamic Table

全量刷新

CREATE DYNAMIC TABLE paimon_dt_table
WITH (
      auto_refresh_mode='full',
      freshness='3 minutes'
)AS SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;

增量刷新

CREATE DYNAMIC TABLE paimon_dt_table_increamental
WITH (
      auto_refresh_mode='incremental',
      freshness='3 minutes'
)AS SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;

自动刷新

CREATE DYNAMIC TABLE paimon_dt_table_auto
WITH (
      auto_refresh_mode='auto',
      freshness='3 minutes'
)AS SELECT * FROM <ext_database_name>.<ext_schema_name>.<ext_table_name>;