数据湖加速查询

基于阿里云数据湖构建(Data Lake Formation,DLF)和对象存储(Object Storage Service,OSS)推出的Hologres数据湖加速服务,提供了灵活的数据访问和分析能力以及高效的数据处理能力,显著加快了对OSS数据湖的查询和分析过程。

背景信息

企业数字化转型不断深入,数据量急剧增长,传统数据分析在成本、规模、数据多样性等方面面临很大挑战。Hologres联合DLF、OSS推出湖仓一体架构的数据湖加速服务,助力企业实现海量数据的低成本存储、统一的元数据管理和高效的数据分析和洞察。

Hologres通过与DLF、OSS无缝集成,以外部表的方式,无需移动数据(外表只做字段映射,不真正存储数据),就能直接加速读写存储于OSS上的Hudi、Delta、Paimon、ORC、Parquet、CSV、SequenceFile等格式类型的数据,降低开发运维成本,打破数据孤岛,实现业务洞察。Hologres支持独享实例(资源独占)和共享集群 Serverless (按使用付费)两种模式,详见购买Hologres

实时数据湖涉及的阿里云服务介绍如下:

服务

介绍

相关链接

阿里云数据湖构建(Data Lake Formation,DLF)

是一款全托管的快速帮助用户构建云上数据湖及Lakehouse的服务,产品提供了云上数据湖统一的元数据管理、统一的权限与安全管理、便捷的数据入湖能力以及一键式数据探索能力。

DLF产品简介

阿里云对象存储(Object Storage Service,OSS)

DLF将OSS作为云上数据湖的统一存储,OSS是一款海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件,可提供12个9的数据持久性,已成为湖数据存储的事实标准。

什么是对象存储OSS

OSS-HDFS服务(又名JindoFS)是云原生数据湖存储,相比原生OSS存储,OSS-HDFS与Hadoop生态计算引擎无缝集成,在典型的基于Hive和Spark的离线ETL场景拥有更好的表现,在完全兼容HDFS文件系统接口的同时,提供充分的POSIX能力支持,可以更好地满足大数据和AI等领域的数据湖计算场景。

什么是OSS-HDFS服务

注意事项

Hologres共享集群不存储数据,仅支持外表查询OSS数据湖。

准备工作

本文以上海地域为例开通OSS、DLF和Hologres服务。

  1. 开通OSS服务并准备测试数据。

    1. 打开OSS开通页面,按照界面指引完成开通操作。

      说明
    2. 登录OSS管理控制台,创建存储空间(Bucket)。具体操作,请参见控制台快速入门

    3. 上传tpch_10g_orc_3.zip测试数据至Bucket目录。image.png

      说明
      • 测试数据文件上传后,若存在.DS_Store等文件需手动删除。

      • 考虑到下载速度,这里仅包含本文需要的nation_orc、supplier_orc、partsupp_orc数据表。

  2. 开通DLF服务并导入OSS测试数据。

    1. 访问开通DLF页面,您也可以单击免费开通,免费试用DLF产品

    2. 登录数据湖管理控制台,在元数据管理页面,单击新建数据库。具体操作,请参见创建元数据库

      本文以创建mydatabase数据库为例。

    3. 元数据抽取页面,创建元数据抽取任务,将OSS测试数据导入。具体操作,请参见元数据抽取

      抽取完成后,您可以在元数据管理页面的数据表页签查看。

      image.png

  3. 开通Hologres服务并购买Hologres实例。具体操作,请参见购买Hologres

    说明

    若您是新用户可以通过阿里云免费试用页面,申请免费试用Hologres。试用详情,请参见查询Hologres数据

步骤一:配置环境

  1. 在Hologres实例中开启数据湖加速功能。

    访问Hologres实例列表,单击目标实例操作列中的数据湖加速并确认,开启数据湖加速功能后,Hologres实例将重启。

  2. 登录Hologres实例,创建数据库。具体操作,请参见连接HoloWeb并执行查询

  3. (可选)创建Extension。本文以dlf_fdw为例。

    说明

    Hologres V2.1版本已默认创建,您无需进行此操作。您可以访问Hologres实例列表,在实例详情页面确认您的实例版本。

    CREATE EXTENSION IF NOT EXISTS dlf_fdw;
    说明

    使用Superuser在SQL编辑器-HoloWeb中执行上述语句创建Extension,该操作针对整个DB生效,一个DB只需执行一次。关于Hologres账号授权详情,请参见授权服务账号

  4. 执行以下语句,创建dlf_server外部服务器并配置Endpoint信息,确保Hologres、DLF和OSS之间的正常访问。关于更多的创建方式和相关参数介绍详情,请参见创建外部服务器

    --创建外部服务器,以上海reigon为例
    CREATE SERVER IF NOT EXISTS dlf_server FOREIGN data wrapper dlf_fdw options (
        dlf_region 'cn-shanghai',
        dlf_endpoint 'dlf-share.cn-shanghai.aliyuncs.com',
        oss_endpoint 'oss-cn-shanghai-internal.aliyuncs.com'); 

步骤二:通过Hologres外部表查询OSS数据湖

Hologres外部表保存与OSS数据湖数据的映射关系,数据在OSS数据湖中存储,不占用Hologres存储空间,查询性能一般在秒级至分钟级。

  1. 创建Hologres外部表,并将OSS数据湖数据映射至Hologres外部表。

    IMPORT FOREIGN SCHEMA mydatabase LIMIT TO ----本文以mydatabase为例,创建时需替换为您在DLF元数据管理中的自定义的数据库名称
    (
      nation_orc,
      supplier_orc,
      partsupp_orc
    )
    FROM SERVER dlf_server INTO public options (if_table_exist 'update');
  2. 数据查询。

    创建外部表成功后,可以直接查询外部表读取OSS中的数据。示例语句如下。

    --TPCH Q11查询语句
    select
            ps_partkey,
            sum(ps_supplycost * ps_availqty) as value
    from
            partsupp_orc,
            supplier_orc,
            nation_orc
    where
            ps_suppkey = s_suppkey
            and s_nationkey = n_nationkey
            and RTRIM(n_name) = 'EGYPT'
    group by
            ps_partkey having
                    sum(ps_supplycost * ps_availqty) > (
                            select
                                    sum(ps_supplycost * ps_availqty) * 0.000001
                            from
                                    partsupp_orc,
                                    supplier_orc,
                                    nation_orc
                            where
                                    ps_suppkey = s_suppkey
                                    and s_nationkey = n_nationkey
                                    and RTRIM(n_name) = 'EGYPT'
                    )
    order by
            value desc;

步骤三:(可选)通过Hologres内部表查询OSS数据湖

Hologres内部表查询是将OSS数据湖数据导入至Hologres中,数据将在Hologres中存储,可获得更好的查询性能和更高的数据处理能力。关于存储费用详情介绍,请参见计费概述

  1. 在Hologres中创建与外部表相同表结构的内部表,示例如下。

    -- 创建nation表
    DROP TABLE IF EXISTS NATION;
    
    BEGIN;
    CREATE TABLE NATION (
        N_NATIONKEY int NOT NULL PRIMARY KEY,
        N_NAME text NOT NULL,
        N_REGIONKEY int NOT NULL,
        N_COMMENT text NOT NULL
    );
    CALL set_table_property ('NATION', 'distribution_key', 'N_NATIONKEY');
    CALL set_table_property ('NATION', 'bitmap_columns', '');
    CALL set_table_property ('NATION', 'dictionary_encoding_columns', '');
    COMMIT;
    
    -- 创建supplier表
    DROP TABLE IF EXISTS SUPPLIER;
    
    BEGIN;
    CREATE TABLE SUPPLIER (
        S_SUPPKEY int NOT NULL PRIMARY KEY,
        S_NAME text NOT NULL,
        S_ADDRESS text NOT NULL,
        S_NATIONKEY int NOT NULL,
        S_PHONE text NOT NULL,
        S_ACCTBAL DECIMAL(15, 2) NOT NULL,
        S_COMMENT text NOT NULL
    );
    CALL set_table_property ('SUPPLIER', 'distribution_key', 'S_SUPPKEY');
    CALL set_table_property ('SUPPLIER', 'bitmap_columns', 'S_NATIONKEY');
    CALL set_table_property ('SUPPLIER', 'dictionary_encoding_columns', '');
    COMMIT;
    
    -- 创建partsupp表
    DROP TABLE IF EXISTS PARTSUPP;
    
    BEGIN;
    CREATE TABLE PARTSUPP (
        PS_PARTKEY int NOT NULL,
        PS_SUPPKEY int NOT NULL,
        PS_AVAILQTY int NOT NULL,
        PS_SUPPLYCOST DECIMAL(15, 2) NOT NULL,
        PS_COMMENT text NOT NULL,
        PRIMARY KEY (PS_PARTKEY, PS_SUPPKEY)
    );
    CALL set_table_property ('PARTSUPP', 'distribution_key', 'PS_PARTKEY');
    CALL set_table_property ('PARTSUPP', 'bitmap_columns', 'ps_availqty');
    CALL set_table_property ('PARTSUPP', 'dictionary_encoding_columns', '');
    COMMIT;
  2. 同步Hologres外部表数据至Hologres内部表。

    ---将Hologres外表数据导入内表
    INSERT INTO nation SELECT * FROM nation_orc;
    INSERT INTO supplier SELECT * FROM supplier_orc;
    INSERT INTO partsupp SELECT * FROM partsupp_orc;
  3. 查询Hologres内部表数据。

    --TPCH Q11查询语句
    select
            ps_partkey,
            sum(ps_supplycost * ps_availqty) as value
    from
            partsupp,
            supplier,
            nation
    where
            ps_suppkey = s_suppkey
            and s_nationkey = n_nationkey
            and RTRIM(n_name) = 'EGYPT'
    group by
            ps_partkey having
                    sum(ps_supplycost * ps_availqty) > (
                            select
                                    sum(ps_supplycost * ps_availqty) * 0.000001
                            from
                                    partsupp,
                                    supplier,
                                    nation
                            where
                                    ps_suppkey = s_suppkey
                                    and s_nationkey = n_nationkey
                                    and RTRIM(n_name) = 'EGYPT'
                    )
    order by
            value desc;

常见问题

创建Hologres外表时,出现ERROR: babysitter not ready,req:name:"HiveAccess"

  • 问题原因:未开启数据湖加速。

  • 解决方法:访问Hologres实例列表,单击目标实例操作列中的数据湖加速并确认,开启数据湖加速功能。

相关文档

以上为示例教程,关于数据湖功能的完整介绍,请参见OSS数据湖加速