全部产品
Search
文档中心

实时数仓Hologres:基于Hive Metastore访问OSS数据湖数据

更新时间:Sep 11, 2026

Hologres从V2.2版本开始,支持通过Hive Metastore访问存储于OSS上的数据湖数据,如您使用EMR集群构建了基于OSS的数据湖环境,可通过简单配置实现Hologres加速读写OSS和OSS-HDFS数据。

前提条件

  • 已开通OSS服务。具体操作,请参见控制台快速入门。

  • 已创建EMR数据湖集群并构建测试数据。具体操作,请参见创建集群。Hologres支持的EMR集群需满足以下条件:

    • Hive为3.1.3及以上版本。

    • 未开启Kerberos身份认证。

    • 元数据选择自建RDS或者内置MySQL。

  • 已购买Hologres实例并开启数据湖加速,然后登录Hologres实例并创建数据库。具体操作,请参见购买Hologres实例和创建数据库。

    说明

    开启数据湖加速方式:登录Hologres管理控制台,在实例列表中单击目标实例操作列中的数据湖加速并确认,开启数据湖加速功能。

  • 已完成网络打通。

    您需要先提交网络打通申请(网络打通申请链接请参见网络打通申请)。收到您的申请后,阿里云Hologres技术支持人员会联系并协助您完成以下操作,从而实现网络互通:

    登录专有网络管理控制台创建反向终端节点,具体操作请参见访问阿里云服务。终端节点服务选择其他终端节点服务,然后输入EMR集群所在地域的终端节点服务的名称。各地域终端节点服务名称如下。

    地域

    终端节点服务名称

    北京

    com.aliyuncs.privatelink.cn-beijing.epsrv-2zeokrydzjd6kx3cbwmb

    上海

    com.aliyuncs.privatelink.cn-shanghai.epsrv-uf61fvlfwta7f7dv9n3x

    张家口

    com.aliyuncs.privatelink.cn-zhangjiakou.epsrv-8vbno4k4wwvys0eg2swp

    说明
    • 如您所在地域未提供终端节点服务名称,Hologres会在您提交网络打通申请后为您创建并提供反馈。

    • 专有网络VPC(Virtual Private Cloud)是基于阿里云构建的一个隔离的网络环境,VPC网络之间、VPC网络与传统经典网络之间逻辑上彻底隔离,默认无法进行互访。Hologres服务先于VPC网络存在,部署在经典网络里,因此需要通过配置反向终端节点来实现网络联通。

    • 当前网络配置是通过IP来进行连接,当EMR集群IP发生变化后,需要重新配置。

限制条件

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

  • 不支持对外部表执行UPDATE、DELETE及TRUNCATE等操作。

  • 暂不支持通过Auto Load方式映射来自HMS的外部表。

  • 暂不支持开启了Kerberos身份认证的Hive集群。

使用说明

Hologres提供两种方式接入Hive Metastore,请根据实例版本和外部表映射需求选择。

  • 方式一:使用External Database(推荐)。适用于Hologres V3.0及以上版本。External Database会将Hive Metastore中的数据库和表映射为Hologres中的外部数据库、Schema和外部表,查询时可直接使用三层名称访问数据,无需逐表创建外部表。

  • 方式二:使用hive_fdw。适用于Hologres V2.2及以上、V3.0以下版本,或需要自定义外部表字段映射的场景。

方式一:使用External Database(推荐)

  1. 登录Hologres实例,执行以下SQL创建External Database。

    创建External Database需要Superuser权限,语法详情请参见CREATE EXTERNAL DATABASE。

    CREATE EXTERNAL DATABASE <EXTERNAL_DATABASE_NAME>
      owner '<ACCOUNT_NAME>'
      metastore_type 'hms'
      catalog_type 'hive'
      hive_metastore_uris 'thrift://<HIVE_METASTORE_IP>:<PORT>'
      metadata_cache_ttl_sec '600'
      metadata_cache_update_interval_sec '60'
      metadata_refresh_interval_sec '7200'
      oss_endpoint 'oss-<REGION_ID>-internal.aliyuncs.com'
      table_count_limitation_per_schema '2000'
      comment '<EXTERNAL_DATABASE_COMMENT>';

    参数说明如下。

    参数

    说明

    示例值

    external_database_name

    指定External Database的名称。

    catalog_hive

    owner

    指定External Database的Owner。

    p4_<ACCOUNT_ID>

    metastore_type

    元数据服务类型。通过Hive Metastore访问数据时,设置为hms。

    hms

    catalog_type

    Catalog类型。通过Hive Catalog访问数据时,设置为hive。

    hive

    hive_metastore_uris

    Hive Metastore的URI。格式为thrift://<HIVE_METASTORE_IP>:<PORT>,端口号默认为9083。

    thrift://10.0.0.1:9083

    metadata_cache_ttl_sec

    (可选)元数据缓存的有效时间,单位为秒。

    600(默认值)

    metadata_cache_update_interval_sec

    (可选)元数据缓存的更新间隔,单位为秒。

    60(默认值)

    metadata_refresh_interval_sec

    (可选)元数据的刷新间隔,单位为秒。

    7200(默认值)

    oss_endpoint

    OSS访问地址。原生OSS存储推荐使用OSS的内网Endpoint,以获得更好的访问性能。

    oss-cn-beijing-internal.aliyuncs.com

    table_count_limitation_per_schema

    (可选)限制每个Schema加载的表数量。

    2000(默认值)

    comment

    (可选)External Database的描述。

    holo-emr-hive

    说明

    以上缓存时间、刷新间隔和表数量限制均为示例值,请根据业务规模和元数据更新频率调整。

  2. (可选)创建用户映射。

    Hologres支持通过CREATE USER MAPPING为指定账号配置访问OSS所需的身份凭证,详情请参见CREATE USER MAPPING。

    CREATE USER MAPPING FOR <ACCOUNT_NAME>
    EXTERNAL DATABASE <EXTERNAL_DATABASE_NAME>
    OPTIONS (
      oss_access_id '<ACCESS_KEY_ID>',
      oss_access_key '<ACCESS_KEY_SECRET>'
    );
  3. 查询外部表。

    External Database创建完成后,可使用由External Database、Hive数据库和Hive表组成的三层名称查询外部表。

    • 非分区表

      SELECT *
      FROM <EXTERNAL_DATABASE_NAME>.<HIVE_DATABASE_NAME>.<HIVE_TABLE_NAME>;
    • 分区表:在WHERE条件中指定分区键。

      SELECT *
      FROM <EXTERNAL_DATABASE_NAME>.<HIVE_DATABASE_NAME>.<HIVE_PARTITION_TABLE_NAME>
      WHERE <PARTITION_KEY> = '<PARTITION_VALUE>';

方式二:使用hive_fdw

  1. 执行SQL命令,创建EXTENSION。

    创建EXTENSION需要Superuser权限,该操作针对整个DB生效,一个DB只需执行一次。

    CREATE EXTENSION IF NOT EXISTS hive_fdw;
  2. 基于hive_fdw创建Foreign Server(外部服务器)并配置Endpoint信息。

    CREATE SERVER IF NOT EXISTS <SERVER_NAME> FOREIGN DATA WRAPPER hive_fdw 
    OPTIONS (
       hive_metastore_uris 'thrift://<HIVE_METASTORE_IP>:<PORT>',
       oss_endpoint 'oss-<REGION_ID>-internal.aliyuncs.com | <BUCKET_NAME>.<REGION_ID>.oss-dls.aliyuncs.com' 
    );

    参数

    是否必填

    说明

    示例值

    server_name

    是

    自定义Foreign Server名称。

    hive_server

    hive_metastore_uris

    是

    Hive MetaStore的URI。格式为thrift://<HIVE_METASTORE_IP>:<PORT>,端口号默认为9083。

    说明

    您可以登录E-MapReduce控制台,单击目标集群操作列中的节点管理。在节点管理页签,获取master节点的内网 IP,内网IP即Hive metastore的IP地址。

    thrift://172.16.0.250:9083

    oss_endpoint

    是

    OSS的Endpoint地址。您可以根据自己实际业务选择:

    • 原生OSS存储:为获得更好的访问性能,推荐使用OSS的内网Endpoint。

    • OSS-HDFS存储:目前仅支持内网访问。

    说明

    您可以登录OSS管理控制台,进入Bucket文件的概览页面,在访问端口区域,获取OSS的Endpoint地址。

    • OSS

      oss-cn-shanghai-internal.aliyuncs.com
    • OSS-HDFS

      <BUCKET_NAME>.cn-beijing.oss-dls.aliyuncs.com
  3. (可选)创建用户映射。

    Hologres支持通过CREATE USER MAPPING来指定其他用户身份访问特定的Foreign Server。例如:Foreign Server的Owner可以通过CREATE USER MAPPING指定RAM用户(123xxx)来访问OSS外部数据。CREATE USER MAPPING详情,请参见postgres create user mapping。

    CREATE USER mapping FOR <ACCOUNT_NAME> server <SERVER_NAME> options
    (
        dlf_access_id '<ACCESS_KEY_ID>', 
        dlf_access_key '<ACCESS_KEY_SECRET>',
        oss_access_id '<ACCESS_KEY_ID>', 
        oss_access_key '<ACCESS_KEY_SECRET>'
    );

    示例如下。

    --为当前用户创建用户映射
    CREATE USER mapping FOR current_user server <SERVER_NAME> options
    (
        dlf_access_id '<ACCESS_KEY_ID>', 
        dlf_access_key '<ACCESS_KEY_SECRET>',
        oss_access_id '<ACCESS_KEY_ID>', 
        oss_access_key '<ACCESS_KEY_SECRET>'
    );
    
    --为RAM用户123xxx创建用户映射
    CREATE USER mapping FOR "p4_123xxx" server <SERVER_NAME> options
    (
        dlf_access_id '<ACCESS_KEY_ID>', 
        dlf_access_key '<ACCESS_KEY_SECRET>',
        oss_access_id '<ACCESS_KEY_ID>', 
        oss_access_key '<ACCESS_KEY_SECRET>'
    );
    
    --删除用户映射
    Drop USER MAPPING FOR CURRENT_USER server <SERVER_NAME>;
    Drop USER MAPPING FOR "p4_123xxx" server <SERVER_NAME>;
  4. 创建外部表。

    Hologres支持以下命令创建外部表:

    • CREATE FOREIGN TABLE:一次仅创建一张外部表,但支持通过指定部分列来自定义创建外部表,适用于需要创建的外部表较少且无需映射所有外部表字段的情况。

    • IMPORT FOREIGN SCHEMA:批量创建外部表,适用于需要创建多张外部表或者外部数据源批量映射的场景。

    说明
    • Hologres支持读取OSS中的分区表,并且支持将TEXT、VARCHAR和INT作为分区键的数据类型。使用CREATE FOREIGN TABLE方式时,由于只进行字段映射而不实际存储数据,只需要将分区字段作为普通字段来创建即可;而使用IMPORT FOREIGN SCHEMA方式时,则无需关心表字段,系统会自动处理表字段映射。

    • 如果OSS外部表存在和Hologres内部表同名的表,IMPORT FOREIGN SCHEMA会跳过该外部表的创建。建议使用CREATE FOREIGN TABLE来定义一个非重复表名来创建。

    -- CREATE FOREIGN TABLE方式
    CREATE FOREIGN TABLE <HOLO_SCHEMA_NAME>.<TABLE_NAME>
    (
      { column_name data_type }
      [, ... ]
      ] )
    )
    SERVER <SERVER_NAME>
    OPTIONS
    (
      schema_name '<HIVE_DATABASE_NAME>',
      table_name '<HIVE_TABLE_NAME>'
    );
    
    
    -- IMPORT FOREIGN SCHEMA方式
    IMPORT FOREIGN SCHEMA <HIVE_DATABASE_NAME> 
    [
      { limit TO | EXCEPT } 
      ( table_name [, ...] ) 
    ]
    FROM server <SERVER_NAME>
    INTO <HOLO_SCHEMA_NAME> 
    options(
      if_table_exist 'update',
      if_unsupported_type 'error'
            );
  5. 查询外部表。

    创建外部表成功后,可以直接查询外部表读取OSS中的数据。

    • 非分区表

      SELECT * FROM <HOLO_SCHEMA_NAME>.<TABLE_NAME>;
    • 分区表

      SELECT * FROM <HOLO_SCHEMA_NAME>.<PARTITION_TABLE_NAME> WHERE <PARTITION_KEY> = '<PARTITION_VALUE>';