作者:武润雪(栩染) Hologres PD
2024年云栖大会,Hologres发布3.0版本,全面升级为一体化实时湖仓平台,通过统一数据平台实现湖仓存储一体、多模式计算一体、分析服务一体、Data+AI 一体,实现一份数据、一份计算、一份服务,极大提高数据开发及应用效率。其中,湖仓存储一体是其重要部分。本文将为您介绍Hologres湖仓存储一体核心能力及使用实践。
一、实时湖仓整体能力介绍

从架构图中可以看到, Hologres 不仅支持高性能的本地SSD存储,还支持多种开放的湖仓存储和格式,包括离线数仓 MaxCompute、基于对象存储的湖格式,如Paimon 、Iceberg 、 Data Lake 、Hudi以及ORC、Parquet等传统Hive表格式。通过元数据管理服务( DLF 、 Hive Metastore ),实现湖上元数据统一管理。利用 Hologres 原生向量引擎,实现湖仓数据的加速查询与分析。
基于上述背景,我们推荐两种湖仓架构。
1. MaxCompute + Hologres实现离线实时一体化方案
第一种是 MC + Holo 的组合,即常见的离线实时一体化方案。我们可以将 ODS 层的数据存储在 MaxCompute 中进行初步加工和处理,生成 DWD 层的数据,即图中的数据加工层。然后通过 External Database 或外部表的方式,将加工层的数据映射到 Hologres,并在 Hologres 完成 DWS 和 ADS 层的构建,对外提供OLAP分析、即席分析、高并发点查等服务。如图所示:

MC 和Holo在离线实时一体化上进行了大量优化,实现了双向直读、直写对方存储,无需数据移动即可实现跨引擎访问,大幅降低了数据互通和管理的成本。同时,对于访问性能要求更高的数据,可以以百万行每秒的速度高速导入 Hologres ,利用 Hologres 的高性能引擎和索引优化技术,实现更低延迟查询。实测结果表明,在不同应用场景中,导入内表的速度比访问外表快10到100倍。
除了在性能上的极致优化, Hologres 和 MC 在功能上也紧密配合,能够及时支持对方新增的特色能力。在3.0版本中, Hologres支持了 MC 的 Delta Table 、数据动态脱敏和加密能力。另外, Hologres 还支持原始数据变更的自动发现与刷新,从而确保数据访问的时效性和准确性。基于这种架构,我们可以快速搭建一套简单易用的湖仓存储架构。
2. Hologres + DLF + OSSS实现开放湖仓架构
第二种架构是基于对象存储的开放湖仓架构,如图所示:

我们可以将 ODS 层的数据存储在对象存储 OSS 中,存储格式可以是 PAIMON 、 ICEBERG 、 HUDI 等,形成一个共享存储层。然后通过外部数据库(External Database)或外部表( Foreign Table )的方式,将原始数据映射到 Hologres ,数据加工和服务都可以在 Hologres 完成。 Hologres 凭借其强大的引擎能力和资源隔离机制,确保作业的稳定性和可靠性,并对外提供服务。同时, Hologres 还支持高性能的回写数据,实现降冷到湖,同时方便湖上引擎进行二次消费,满足数据开放性的要求。除了支持多种湖表格式外, Hologres 还对湖表本身的特色能力进行了深度适配,如Paimon表的Deletion Vector、Changelog Producer等。目前,Hologres 是唯一一款支持消费 PAIMON Changelog 的云产品。
二、重点功能及使用说明
下面我们来看一下Hologres在实时湖仓上的一些具体能力。
1. 元数据抽象
第一个重要能力是对湖上元数据的抽象。 Hologres 支持两种元数据抽象方式: External Database 和 Foreign Table 。

External Database 是对外部元数据 Catalog 级别的映射,包括外部元数据的配置信息、认证信息、库表元数据等。它并不会在Hologres 中实际创建外部表,而是将外部元数据缓存在 Hologres 内部。 External Database 的应用场景主要是将外部元数据Catalog级别下的所有数据库和表全量映射到 Hologres 。由于映射的是外部数据源,因此主要的权限控制在外部数据源。在 Hologres 内部,用户仅需要拥有 External Database 的 CONNECT 权限即可。
在实际业务场景中,有时候我们可能不需要将 Catalog 级别的所有表都映射过来,而只需要映射其中的部分表或某张表的某些列。此时,我们可以采用 Foreign Table 的方式。 Foreign Table 是对外部数据源的表级抽象,直接映射外部表的结构,包括列名和数据类型等。在Hologres 中,通过创建外部表来定义如何解析这张表。同时,由于它在 Hologres 内部有一张实际存在的表,因此除了需要满足外部数据源的相应权限外,还需要拥有 Hologres 内部表的访问权限,即简单权限模型或基于 Schema 的权限模型中的 Viewer 及以上权限。如果是专家模型,则需要 Schema 的 USAGE 权限和表的SELECT 权限。
基于这两种抽象方式,我们来看一下它支持的具体能力和版本。

对于EXTERNAL DATABASE ,从3.0版本开始支持。支持 DLF 1.0、DLF 2.0和 MaxCompute 三个数据源,具备创建和删除EXTERNAL DATABASE 的能力。对于 DLF 的数据源,还支持在EXTERNAL DATABASE 中创建 EXTERNAL Schema 和 EXTERNAL Table 。创建 EXTERNAL Schema 实际上是在 DLF Catalog 中新建一个数据库。同样, EXTERNAL Table 也会在湖存储中实际创建一张表,后面会具体介绍。
第二种是针对部分表映射的场景,采用 FOREIGN TABLE 的方式。FOREIGN TABLE 从 Hologres 1.0版本开始就默认支持。支持的数据源更全面,包括 DLF 1.0、 DLF 2.0、 Hive Metastore 、MaxCompute ,以及 Hologres 的跨实例和跨库查询。当需要批量映射外部数据源的表时,可以采用 IMPORT FOREIGN SCHEMA 的方式。当需要对单表进行映射时,可以使用 CREATE FOREIGN TABLE的方式。
下面我们重点来看一下 EXTERNAL DATABASE 的具体能力。

EXTERNAL DATABASE的创建语法非常简单。只需执行 CREATE EXTERNAL DATABASE ,并指定数据库名称以及对应的数据源参数即可。例如,对于MaxCompute数据源,只需指定 metastore_type 为MaxCompute ,以及MaxCompute 的 Project Name ,提交后即可一键完成 MaxCompute 整个项目的元数据映射到 Hologres 。同样,对于 DLF 数据源,只需指定 metastore_type为 dlf-paimon , catalog_type 为 paimon ,并提供 DLF 的连接信息及 Catalog ID ,即可一键创建DLF数据源 Catalog 级别的映射。
同时, Hologres 基于 PostgreSQL生态,对于BI生态的支持非常友好, EXTERNAL DATABASE 也完全复用了 PG 的体系。在BI工具看来,它就是一个普通的数据库,因此可以方便地与各种 BI 工具集成。
这是 Hologres 一键映射外部数据源的功能。在湖存储引擎中,MaxCompute 可以通过 EXTERNAL DATABASE 一键映射Hologres 数据库级别的数据,同样也可以映射 DLF 整个 Catalog级别的数据。因此,通过这种方式, MaxCompute 、 Hologres和 DLF 可以互相映射对方相同层级的元数据和数据。同时,还可以通过联邦 Hive 将 Hadoop 生态方便地集成到湖存储内部。
2. 基于RAMRole和SLR实现权限互通
下面我们来看一下 Hologres 与 MaxCompute 和 DLF 的权限互通能力。
Hologres 通过 RAM 角色( RAMRole )和服务关联角色( Service Link Role )实现了与 MaxCompute 和 DLF 的权限互通。那么,什么是 RAM 角色?什么是服务关联角色呢?
RAM 角色是一种可信实体为阿里云账号的 RAM 角色,扮演该角色的 RAM 用户可以是阿里云账号下的用户,也可以是其他阿里云账号下的用户。 RAM 角色的应用场景主要用于解决跨账号访问和临时授权问题。不过, RAM 角色由用户自行创建和维护,用户可以随意修改角色或删除权限,这可能导致云服务互访功能受损。
基于此背景, Hologres 还对接了服务关联角色。服务关联角色是一种可信实体为阿里云服务的 RAM 角色,仅允许云服务扮演,主要用于解决跨服务访问问题。由于服务关联角色由云服务创建和维护,客户无法修改,只能用于授权和使用,从而保证了云服务互访的稳定性。
对于 Hologres ,默认采用服务关联角色+身份透传的方式实现云产品的访问。服务关联角色本身的权限决定了扮演该角色的用户能够访问哪些云产品。当前用户拥有的具体外部访问权限决定了最终可以对哪些外部数据执行操作,例如可以读取哪些表、是否可以写入、是否可以创建表等。这些权限控制是在湖存储的数据源中实现的。
Hologres 和 MaxCompute 都支持通过服务关联角色+身份透传以及 RAM 角色两种方式访问 DLF 。这样一来, DLF 、MaxCompute 和 Hologres 在云上就可以非常方便地实现权限互通。
3. 使用说明
3.1 External Database用法详解
下面我们来看一下 EXTERNAL DATABASE 的具体用法。
- 创建External Database

EXTERNAL DATABASE 当前支持 MaxCompute 、 DLF 1.0和DLF 2.0三种元数据类型。在创建时,主要通过metastore_type参数来指定。对于 MaxCompute ,只需指定 metastore_type 为maxcompute 。
对于 DLF 1.0和 DLF 2.0,在填写参数时有一些区别。DLF 2.0在创建 Catalog 时已经决定了Catalog下表的格式,因此在指定时需要带上表的格式,即 dlf-paimon 。而对于 DLF 1.0,只需指定 DLF 即可,Catalog下可以是DLF支持的任意湖表格式。
另一个需要注意的点是, DLF 1.0不支持全托管的 OSS 存储,仅支持用户自持 OSS ,因此在创建时还需要额外指定oss_endpoint 。
- 查看External Database下的Schema和表
创建了 EXTERNAL DATABASE 之后,如何查看其下的 SCHEMA 和表呢?这里提供了两种方式,一种是通过 SQL 查询。另一种方式是通过 HoloWeb 进行可视化操作。如果用户具有某个EXTERNAL DATABASE 的权限,那么在 SQL 编辑页面中,数据库列表将显示其有权限的 EXTERNAL DATABASE 。连接后,在左侧的表目录页面可以直接列出该 EXTERNAL DATABASE 下的SCHEMA ,以及某个 SCHEMA 下的表。如下图所示:

- 创建External Schema和External Tbale
对于外部数据源,我们支持在 EXTERNAL DATABASE 下管理 SCHEMA 和表。具体支持的操作如下:

一是创建 EXTERNAL SCHEMA ,使用的命令是:
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] <EXT_DB_NAME>.<EXT_SCHEMA_NAME>;
这个创建操作会在 DLF Catalog 中实际创建一个数据库。同样,删除 EXTERNAL SCHEMA 也会实际删除该数据库及其下的所有表。这里需要注意的是,与前面提到的删除 EXTERNAL DATABASE 不同。因为删除 EXTERNAL DATABASE 只是删除了 Hologres 内部与外部数据源的映射,但不会实际删除外部数据源下的数据库和表。
另一个操作是在 SCHEMA 下创建 EXTERNAL TABLE ,完成该操作后,也会在 DLF Catalog 中实际创建一张表。删除 EXTERNAL TABLE 也会实际删除对应的湖表和数据。创建表的命令非常简单,只需执行 CREATE EXTERNAL TABLE ,并指定表名、列名、列类型,以及列的约束条件和表的约束条件。还可以指定是否为分区表以及对应的湖表格式参数,例如 table_format 和 bucket-key 。创建完成后,还支持通过 INSERT INTO 的方式向表中写入数据。同样支持删除操作,即DROP EXTERNAL TABLE 。
- 元数据刷新
对于外部数据源的源数据, Hologres 默认设置了10分钟的缓存,以优化访问性能。因此,当外部元数据发生变更时, Hologres 不会实时更新数据。如果需要及时获取最新的元数据, Hologres 提供了 REFRESH 命令来手动更新,支持三个层级:
- 对于 EXTERNAL DATABASE 层级,可以使用 REFRESH CACHE FOR EXTERNAL DATABASE 命令;
- 对于 SCHEMA 层级,可以使用 REFRESH CACHE FOR EXTERNAL SCHEMA 命令;
- 对于单表层级,可以使用 REFRESH CACHE FOR EXTERNAL TABLE命令,支持秒级刷新。

3.2 Foreign Table用法详解
前面我们介绍了使用 EXTERNAL DATABASE 的方式。接下来,我们来看一下使用 Foreign Table 的方式。以 MaxCompute 外表为例,我们支持单表加速和批量加速。无论是单表加速还是批量加速,都支持 MaxCompute 的两层模型和三层模型两种模式。
对于单表加速,使用的语法是 CREATE FOREIGN TABLE ,需要指定表的列名、列属性、 Project 名称和表名称。如果是三层模型,还需要额外指定一个 Schema 名称。
对于批量加速,可以使用 IMPORT FOREIGN SCHEMA 命令,指定SCHEMA 名称。这里还提供了一个高级选项。因为批量操作可能会出现 SCHEMA 下存在同名表的情况,此时可以通过指定if_table_exist 选项来决定系统的处理方式,例如是报错、忽略还是更新当前表。如果外部数据源存在 Hologres 不支持的数据类型,可以通过指定 if_unsupported_type 选项来决定系统的处理方式,例如是报错还是跳过。同样,对于三层模型,也需要额外指定SCHEMA 的名称。这是 Foreign Table 的使用方式。

3.3 可视化加速湖表
我们在 HoloWeb 中也实现了可视化方式来创建外表。在HoloWeb 页面的元数据管理模块中,提供了 MaxCompute 加速和OSS 数据服务加速两个模块。
以 OSS 为例,在 HoloWeb 页面中,可以实现可视化的创建Foreign Server ,指定外部数据源的连接信息,例如, DLF 的Endpoint 是什么, DLF 的 Catalog ID 是什么,以及 OSS Endpoint 是什么。
创建外部表时,可以在该页面中可视化选择数据源表的信息、目标表的位置,以及选择整库加速、部分加速或单表加速。这些功能与 SQ L命令一一对应。如图所示:


对于可视化加速 MaxCompute 的外表,操作流程基本类似,因此不再过多赘述。
3.4 基于Dataworks实现周期性导入
另外,在实际业务中,我们可能需要将 MaxCompute 的数据周期性地导入到 Hologres 。这时可以使用 DataWorks 的数据开发页面中的数据同步功能来完成此操作。
下面展示的是 DataWorks 数据开发新版页面。
在该页面中,添加完数据源后,可以在数据目录中同时查看 MaxCompute 和Hologres 的所有数据库和表。如果要将 MaxCompute 的一张表导入到 Hologres 中,只需在该表名上点击右键,选择数据同步功能,即可进入数据同步配置页面。
由于源表已确定, MaxCompute 源表信息会自动填充。只需在此填写目标端的相关信息,例如,需指定要同步到 Hologres 的实例、数据库、 Schema ,且支持自动建表。自动建表时,需指定表名。填写完这些信息后,在右侧配置调度规则,即可实现数据的周期性导入。
在导入过程中,也支持一些个性化的配置。例如,可以进行导入GUC 的设置,配置导入资源,选择是否使用 Serverless 模式,以及是否对导入作业的并发度进行控制。还支持自定义字段的导入。如果是分区表,则可以配置分区键。对于导入 Hologres 的数据,如果需要进行性能优化,还可以在索引配置页面设置合适的索引。

三、 Demo演示:以Paimon为例
下面我将以 PAIMON 为例进行演示。我们来看一下这个演示的整体操作步骤。
1.在 DLF 中创建一个 Paimon Catalog
2.在 Hologres 中创建一个 EXTERNAL DATABASE 以映射前面创建的 Paimon Catalog ,然后在该 EXTERNAL DATABASE 中创建一个外部 Schema 和表
3.使用 Flink 实时消费 SLS 公共数据集GitHub公开事件行为数据,并将其写入该 Paimon 表。这样,我们就可以对Paimon表中的GitHub行为数据进行各种维度的分析了。具体Demo详见: