共享集群(OSS数据湖加速)

本文将为您介绍在Hologres中如何通过共享集群读OSS数据。

背景信息

共享集群(OSS数据湖加速)是针对OSS数据湖设计的Serverless的在线查询加速服务,基于Hologres存储计算分离的云原生架构,以共享集群资源的形式,加速分析存储在OSS中的湖数据,按需使用,按扫描量付费。对外提供兼容PostgreSQL的查询接口,无需数据移动,无需集群运维,给湖数据分析提供稳定、快速、低成本的查询服务,满足湖仓融合、按需使用、实时分析的诉求。

功能介绍

OSS数据湖加速(共享集群)的实例在资源上是共享的,默认开启湖加速能力,您购买实例后,请直接创建DLF Extension,导入外部表,即可开始查询丰富的湖数据,具体支持的功能如下:

  • Hologres从 V1.1版本开始支持从OSS读取ORC、Parquet、CSV、SequenceFile格式文件;从V1.3版本开始支持从OSS读取HUDI、Delta格式文件,支持写入ORC、Parquet、CSV、SequenceFile格式文件至OSS。请前往Hologres管控台实例详情页查看当前实例版本,如果您的实例是V1.3以下版本,请您使用自助升级或加入Hologres钉钉交流群反馈,详情请参见如何获取更多的在线支持?

  • Hologres从 V1.3.25 版本开始支持使用DLF数据目录(Multi-Catalog)做元数据隔离,方便您在测试环境、开发环境、跨部门集群之间做元数据隔离,以保障业务安全。DLF数据目录详情请参见数据目录

  • Hologres从V1.3.26版本开始支持读写存储于OSS-HDFS上的数据。进一步扩展了数据湖加速的服务能力和边界,使Hologres可以与Hadoop生态计算引擎无缝集成,加速读写存储于HDFS上的数据,大幅提升Hadoop生态数据实时分析的效率,更好地满足大数据和AI等领域的数据湖联邦、实时分析诉求。

  • Hologres从V2.1.6版本开始支持读取Apache Paimon湖格式。Apache Paimon是一种流批统一的湖存储格式,支持高吞吐的写入和低延迟的查询,详情请参见Apache Paimon

前提条件

  • 您已开通DLF数据湖构建,详情请参见快速入门。共享集群支持的地域有:华北2(北京)、华东2(上海)、华东1(杭州)、华南1(深圳)和新加坡。

  • (可选)如果您需要使用DLF自定义数据目录功能,请先在DLF中新建数据目录,详情请参见新建数据目录

  • 已开通OSS并准备好数据。

  • 您已进行OSS授权操作,通过外部表方式访问OSS数据,需要访问的账号有OSS的相关访问权限,否则即使创建外表成功了,也无法查询数据,OSS授权请参见Bucket Policy

  • (可选)如果您需要使用OSS-HDFS功能,请开通OSS-HDFS服务,详情请参见开通OSS-HDFS服务

注意事项

  • 共享集群仅支持使用DLF_FDW外表读取OSS数据,不支持写入数据。

  • 不支持读写使用了OSS加速器的数据湖数据,OSS加速器详情请参见使用OSS加速器

  • IMPORT FOREIGN SCHEMA语句支持导入存储于OSS上的分区表,当前Hologres支持查询最多分区数为512个,请添加分区过滤条件,使查询时一次查询不超过512个分区。

  • 湖数据查询的原理是在运行时将外部表数据的特定查询分区加载到Hologres的内存和缓存中完成计算,为不影响查询体验,Hologres一次查询支持的数据量不能超过200 GB(经分区过滤后命中的数据量)。

数据类型映射

Hologres与数据湖数据类型映射关系请参见数据类型汇总

使用说明

配置环境

  1. 创建Extension。

    说明

    从V2.1.6版本开始,Hologres在创建实例的时候默认创建dlf_fdw,您无需再手动创建。V2.1.5及以下版本需要手动创建。

    在Hologres中由Superuser在DB中执行以下语句创建Extension,用于开启通过DLF读取OSS数据的功能。该操作针对整个DB生效,一个DB只需执行一次。

    CREATE EXTENSION IF NOT EXISTS dlf_fdw;
  2. 创建外部服务器(Server)。

    Hologres支持DLF数据目录(Multi-Catalog)功能,如果您只有一个EMR集群,请使用DLF默认数据目录即可;如果您有多个EMR集群,可以使用自定义数据目录来控制Hologres实例连接到不同的EMR集群。同时,您也可以选择原生OSS或者OSS-HDFS作为数据来源,具体配置如下:

    • 使用DLF默认数据目录。

      创建Server用于Hologres连接DLF和OSS使用DLF默认数据目录和原生OSS存储创建Server,示例语法如下。

      --查看现有server
      
      SELECT * FROM pg_foreign_server;
      
      --删除现有 server
      
      DROP server server_name cascade;
      
      --创建 server
      
      CREATE SERVER IF NOT EXISTS < servername > FOREIGN data wrapper dlf_fdw options (
          dlf_region 'cn-<region>',
          dlf_endpoint 'dlf-share.cn-<region>.aliyuncs.com',
          oss_endpoint 'oss-cn-<region>-internal.aliyuncs.com'
      );
    • 使用DLF自定义数据目录。

      创建Server默认连接到DLF的默认数据目录,如您需要访问自定义数据目录,需要在创建Server时指定DLF数据目录参数,示例语法如下。

      --删除现有server
      
      DROP server server_name cascade;
      
      --创建server
      
      CREATE SERVER IF NOT EXISTS < servername > FOREIGN data wrapper dlf_fdw options (
          dlf_region 'cn-<region>',
          dlf_endpoint 'dlf-share.cn-<region>.aliyuncs.com',
          oss_endpoint 'oss-cn-<region>-internal.aliyuncs.com',
          [dlf_catalog 'dlf_catalog_name'] -- 添加自定义Catalog参数
      );
    • 使用OSS-HDFS作为数据湖存储。

      1. 确定OSS-HDFS Bucket域名。

        通过DLF_FDW访问存储在OSS-HDFS上数据,需要配置OSS-HDFS的服务域名,域名地址可以在OSS控制台中,已开通OSS-HDFS服务的Bucket概览页获取,详情请参见获取OSS-HDFS服务域名oss域名

      2. 创建Foreign Server并配置Endpoint信息。

        确定OSS-HDFS Bucket域名后即可在Hologres中配置DLF_FDW oss_endpoint选项,示例语法如下。

        CREATE EXTENSION IF NOT EXISTS dlf_fdw;
        
        CREATE SERVER IF NOT EXISTS < servername > FOREIGN data wrapper dlf_fdw options (
            dlf_region 'cn-<region>',
            dlf_endpoint 'dlf-share.cn-<region>.aliyuncs.com',
            oss_endpoint 'oss-cn-<region>.oss-dls.aliyuncs.com'  -- OSS-HDFS Bucket 域名
        );
    • 参数说明。

      参数

      说明

      示例

      server_name

      自定义的server名称。

      oss_server

      dlf_region

      连接DLF所在的地域,请您根据地域进行选择,可选项如下。

      • 华北2(北京):cn-beijing

      • 华东1(杭州):cn-hangzhou

      • 华东2(上海):cn-shanghai

      • 华南1(深圳):cn-shenzhen

      • 新加坡:ap-southeast-1

      cn-hangzhou

      dlf_endpoint

      推荐使用DLF的对内服务Endpoint,可以获得更好的访问性能,如您需要跨Region 访问DLF元数据及OSS数据,则需使用公网Endpoint,详情请参见已开通的地域和访问域名。请您根据地域进行选择,可选项如下。

      • 华北2(北京):dlf-share.cn-beijing.aliyuncs.com

      • 华东1(杭州):dlf-share.cn-hangzhou.aliyuncs.com

      • 华东2(上海):dlf-share.cn-shanghai.aliyuncs.com

      • 华南1(深圳):dlf-share.cn-shenzhen.aliyuncs.com

      • 新加坡:dlf-share.ap-southeast-1.aliyuncs.com

      dlf-share.cn-shanghai.aliyuncs.com

      oss_endpoint

      • 原生OSS存储推荐使用OSS的内网Endpoint,以获得更好的访问性能,如您需要同Hologres、DLF跨Region交互,请需使用公网Endpoint,详情请参见OSS访问域名使用规则

      • OSS-HDFS Bucket域名。

        OSS-HDFS目前仅支持内网访问,即默认不支持跨区域访问。,域名获取方式详情请参见获取OSS-HDFS服务域名

      • oss-cn-shanghai-internal.aliyuncs.com
      • cn-hangzhou.oss-dls.aliyuncs.com

      dlf_catalog

      在DLF中新建的数据目录,详情请参见新建数据目录

      dlf_catalog

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

    Hologres支持通过CREATE USER MAPPING命令指定其他用户身份来访问DLF和OSS,如:foreign server的Owner可以通过CREATE USER MAPPING指定RAM用户123xxx来访问OSS外部数据。

    查询时请确保该账号有对应外部数据的查询权限。详细原理请参见postgres create user mapping

    CREATE USER MAPPING FOR < 账号uid > SERVER hm_dlf_server options (
        dlf_access_id '<accesskey id>',
        dlf_access_key 'accesskey',
        oss_access_id 'accessid',
        oss_access_key 'accesskey'
    );

    当前阿里云账号的AccessKey ID和AccessKey Secret,获取方式请参见创建访问密钥

    使用示例:

    --为当前用户创建用户映射
    CREATE USER MAPPING FOR CURRENT_USER SERVER hm_dlf_server options (
        dlf_access_id 'LTAI5txxx',
        dlf_access_key 'y8LUUyyy',
        oss_access_id 'LTAI5txxx',
        oss_access_key 'y8LUUyyy'
    );
    
    --为RAM用户123xxx创建用户映射
    CREATE USER MAPPING FOR "p4_123xxx" SERVER hm_dlf_server options (
        dlf_access_id 'LIlY5txxx',
        dlf_access_key 'KsjkXKyyy',
        oss_access_id 'LIlY5txxx',
        oss_access_key 'KsjkXKyyy'
    );
    
    --删除用户映射
    DROP USER MAPPING FOR CURRENT_USER SERVER hm_dlf_server options;
    
    DROP USER MAPPING FOR "p4_123xxx" SERVER hm_dlf_server options;

读取OSS湖数据

以DLF数据源为例,您需要在DLF中准备元数据表,并保证该表中已抽取数据,详情请参见元数据管理。在Hologres中以外部表方式通过DLF访问OSS的数据操作步骤如下:

  1. 在Hologres实例中创建外部表。

    Server创建完成后,您可以在Hologres中使用CREATE FOREIGN TABLE创建外部表或使用IMPORT FOREIGN SCHEMA语法单独或者批量创建外部表,用于读取DLF抽取的OSS数据。

    说明

    如果存在OSS外部表和Hologres内部表同名的表,IMPORT FOREIGN SCHEMA语法会跳过该外部表的创建,请使用CREATE FOREIGN TABLE语法创建一个非重名表。

    Hologres支持读取OSS中的分区表,支持作为分区键的数据类型有:TEXT、VARCHAR和INT。CREATE FOREIGN TABLE方式因只做字段映射,不实际存储数据,将分区字段作为普通字段来创建即可;IMPORT FOREIGN SCHEMA方式无需关心表字段,会自动处理表字段映射。

    • 语法示例

      -- 方式一:
      CREATE FOREIGN TABLE [ IF NOT EXISTS ] ext_table_name ( [
      { column_name data_type }
        [, ... ]
        ] )
      SERVER dlf_server
      options
      (
        schema_name '<dlf_database_name>',
        table_name '<dlf_table_name>'
      );
      
      -- 方式二:
      IMPORT FOREIGN SCHEMA schema_name
          [ { limit to | except } ( table_name [, ...] ) ]
          from server server_name
          into local_schema
          [ options ( option 'value' [, ... ] ) ]
    • 参数说明

      参数

      说明

      schema_name

      DLF中创建的元数据库名。

      table_name

      DLF中创建的元数据表名。

      server_name

      Hologres中创建的Server名。

      local_schema

      Hologres中的Schema名。

      options

      IMPORT FOREIGN SCHEMA中的option参数取值,详情请参见IMPORT FOREIGN SCHEMA

    • 使用示例。

      • 单独创建。

        创建一张外部表映射DLF元数据库dlfpro中元数据表dlf_oss_test的数据,该表位于Hologres中的public Schema,并且检验是否存在该外部表,若存在,则对已有表更新。

        -- 方式一
        CREATE FOREIGN TABLE dlf_oss_test_ext
        (
          id text,
          pt text
        )
        SERVER dlf_server
        options
        (
          schema_name 'dlfpro',
          table_name 'dlf_oss_test'
        );
        
        
        -- 方式二:
        IMPORT FOREIGN SCHEMA dlfpro LIMIT TO
        (
          dlf_oss_test
        )
        FROM SERVER dlf_server INTO public options (if_table_exist 'update');
      • 批量创建。

        将DLF元数据库dlfpro中所有的表都映射至Hologres的public Schema,将会在Hologres中批量创建同名外部表。

        • 整库导入。

          IMPORT FOREIGN SCHEMA dlfpro
          FROM SERVER dlf_server INTO public options (if_table_exist 'update');
        • 多表导入。

          IMPORT FOREIGN SCHEMA dlfpro
          (
            table1,
            table2,
            tablen
          )
          FROM SERVER dlf_server INTO public options (if_table_exist 'update');
  2. 数据查询。

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

    • 非分区表

      SELECT * FROM dlf_oss_test;
    • 分区表

      SELECT * FROM partition_table where dt = '2013';

相关文档

如果您想了解基于Paimon湖存储格式的Hologres实践方案,请参见基于Paimon的Hologres Serverless数据湖解决方案