开放存储概述

更新时间:
复制为 MD 格式

为了更好地融入大数据生态,并支持外部引擎访问MaxCompute中的数据,MaxCompute提供了开放存储(Storage API)。第三方主流计算引擎可通过调用Storage API直接访问MaxCompute的底层存储,从而显著提升数据访问和交互效率。

开放存储介绍

开放存储(Storage API)是一种数据服务接口,提供了高效、低延迟、安全的数据访问方式,支持第三方主流计算访问MaxCompute的存储系统,提升了MaxCompute与开源计算引擎和机器学习引擎的集成度和数据处理效率。其中,Spark、StarRocks、PrestoFlink还直接通过Connector访问存储在MaxCompute中的数据,更加简化了数据使用过程,提高了数据访问性能。架构图如下:

image

应用场景

开放存储(Storage API)可应用于数据开放与多引擎计算场景,当企业或开发者需要在不同的计算框架间灵活切换,或者利用特定引擎的特性处理MaxCompute中的数据时,Storage API可以作为桥梁促进数据流通和处理的多样化。

关键特性

  • 高吞吐:具备列级高效读取的能力,支持在数据传输前通过谓词下推来过滤数据,同时支持Arrow格式。

  • 安全易用:提供Table语义直读底层存储,屏蔽存储细节,同时满足项目隔离、权限控制、数据加密等安全策略。

  • 生态融合:Spark on EMRStarRocks可直接通过Connector访问MaxCompute的数据,简化了计算引擎的集成过程。

适用范围

  • 第三方引擎访问MaxCompute时,支持读取普通表、分区表、聚簇表、Delta Table和物化视图;不支持读取MaxCompute的外部表、逻辑视图。

  • 不支持读JSON数据类型。

  • 开放存储(按量付费)每个租户的请求并发数限制为不超过1000个,每个并发传输速率限制为不超过10 MB/s。

数据传输资源

第三方引擎通过MaxCompute开放存储进行数据传输任务时,可选择使用数据传输服务独享资源组(包年包月)和开放存储(按量付费)资源。详细介绍如下。

资源组名称

费用说明

支持地域

使用说明

数据传输独享资源费用(包年包月)

包年包月,按购买并发数的数量计费。

  • 华北2(北京)

  • 华东1(杭州)

  • 华东2(上海)

  • 华南1(深圳)

  • 西南1(成都)

  • 中国香港

  • 华东 1 金融云

  • 印度尼西亚(雅加达)

  • 新加坡

  • 美国(硅谷)

  • 美国(弗吉尼亚)

  • 日本(东京)

  • 德国(法兰克福)

购买与使用独享数据传输服务资源组

开放存储(按量计费)

按量计费,当前每个租户每月可享有1 TB的免费数据读写额度,超过1 TB的部分按照实际读写数据的逻辑大小计费。

  • 华东1(杭州)

  • 华北2(北京)

  • 华东2(上海)

  • 西南1(成都)

  • 华南1(深圳)

  • 华北6(乌兰察布)

使用开放存储(按量付费)

资源观测页面,可查看数据传输服务独享资源组(包年包月)和开放存储(按量付费)资源的使用详情,请参见资源观测

使用开放存储(按量付费)

  1. 打开开放存储(Storage API)开关

    1. 登录MaxCompute控制台,在左上角选择地域。

    2. 在左侧导航栏,选择管理配置 > 租户管理 。

    3. 租户管理页面,单击租户属性页签。

      租户属性页签,打开开放存储(Storage API)开关

      开放存储资源名称为pay-as-you-go,详情请参见租户属性

  2. 授权

    当前针对作业级别指定Quota功能的鉴权默认所有账号(包括阿里云账号)和角色都没有权限,需要进行授权操作。

    1. 新增角色

      1. 登录MaxCompute控制台,在左上角选择地域。

      2. 在左侧导航栏,选择管理配置 > 租户管理 。

      3. 租户管理页面,单击角色管理页签。

      4. 角色管理页签,单击新增角色,在弹出的新增角色对话框,填写自定义角色名称policy内容,然后单击确定完成创建。

        {
            "Statement": [{
                    "Action": [
                        "odps:List",
                        "odps:Usage"],
                    "Effect": "Allow",
                    "Resource": ["acs:odps:*:regions/*/quotas/pay-as-you-go"]}],
            "Version": "1"
        }

        参数说明

        • Action:指定被授予的操作权限名称。单次授权可以指定多个操作,可根据实际情况自行添加操作权限名称。当有多个操作时,多个操作名称之间使用半角逗号(,)分隔。操作取值请参见MaxCompute权限。权限策略参数的详细内容请参见权限策略基本元素

        • Resource:指定被授权的资源范围,格式为["acs:odps:Tenant/${tenant_id}:regions/${region_id}/quotas/${quota_name}"]

          ["acs:odps:*:regions/*/quotas/pay-as-you-go"]表示当前租户所有Region下的开放存储后付费Quota。

    2. 将角色授权给需要进行作业级别指定Quota的账号

      默认主账号或者拥有账户级别(tenant)Super_Administrator的子账号可进行授权操作。

      由于授权对象的差别,会出现如下两种场景。

      • 对阿里云账号授权。

        通过如下命令对阿里云账号授权。

        -- 将阿里云账号加到租户内并给阿里云账号授权角色
        Add tenant user <Aliyun$xxxx>;
        Grant tenant role <role_name> to user <Aliyun$xxxx>;
        -- 查看租户role/user的权限
        Show grants for tenant role <role_name>;
        Show grants for tenant user <user_name>;
        Show principals for tenant [role] <role_name>;
      • RAM用户授权。

        1. 登录MaxCompute控制台,在左上角选择地域。

        2. 在左侧导航栏,选择管理配置 > 租户管理 。

        3. 租户管理页面,单击用户管理页签。

        4. 在弹出的编辑角色对话框,从待添加角色区域选择要为当前用户配置的角色,并配置到已添加角色区域,单击确定完成修改。

  3. 使用开放存储(按量付费)资源

    第三方引擎访问MaxCompute时,将Quota名称设置为pay-as-you-go。本文以Java SDK为例,代码示例如下。

    // 阿里云账号或RAM用户的AccessKey IDAccessKey Secret
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户
    // 此处以把AccessKey 和 AccessKeySecret 保存在环境变量为例说明。您也可以根据业务需要,保存到配置文件里
    // 强烈建议不要把 AccessKey 和 AccessKeySecret 保存到代码里,会存在密钥泄漏风险
    private static String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
    private static String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
    //访问MaxCompute使用的后付费Quota名称
    String quotaName = "pay-as-you-go";
    //MaxCompute项目名称
    String project = "<project>";
    //创建Odps对象来连接MaxCompute服务
    Account account = new AliyunAccount(accessId, accessKey);
    Odps odps = new Odps(account);
    odps.setDefaultProject(project);
    //MaxCompute服务的连接地址,当前仅支持使用阿里云VPC网络
    odps.setEndpoint(endpoint);
    Credentials credentials = Credentials.newBuilder().withAccount(odps.getAccount()).withAppAccount(odps.getAppAccount()).build();
    EnvironmentSettings settings = EnvironmentSettings.newBuilder().withCredentials(credentials).withServiceEndpoint(odps.getEndpoint()).withQuotaName(quotaName).build();
    说明

    根据创建MaxCompute项目时的地域以及网络连接方式配置Endpoint,各地域及网络对应的Endpoint值,请参见Endpoint

使用示例

Arrow数据类型映射

MaxCompute 开放存储(Storage API)基于Apache Arrow数据类型,确保数据在存储和传输过程中保持高效的结构化表示。在使用MaxCompute Storage API写入数据时,不会对数据进行计算或加工处理(如Map数据去重),当存储引擎无特殊限制时,将保留原始数据结构。

MaxComputeApache Arrow数据类型映射表,如下所示:

MaxCompute数据类型

Arrow数据类型

TINYINT

Int8Type

SMALLINT

Int16Type

INT

Int32Type

BIGINT

Int64Type

FLOAT

FloatType

DOUBLE

DoubleType

BOOLEAN

BooleanType

DECIMAL

Decimal128Type

说明

MaxCompute DECIMAL类型比Storage API Decimal128Type精度更高:

  • 读数据场景,MaxCompute DECIMAL类型将转成arrow decimal(38,18)输出,溢出时会抛出异常;

  • 写数据场景,arrow decimal(precision,scale) 会转为 MaxCompute DECIMAL(38,18) 写入,要求precisionscale一致;

DECIMAL(precision, scale)

Decimal128Type

STRING

StringType

BINARY

BinaryType

VARCHAR

StringType

CHAR

StringType

DATETIME

TimestampType[1]

TimeUnit为毫秒,timezoneUTC。

TIMESTAMP

TimestampType[2]

TimeUnit为纳秒,timezoneUTC。

说明

TIMESTAMP类型支持的值域范围更广,使用Storage API读写TIMESTAMP类型数据超出TimestampType精度范围时,高精度部分的值会被截断,此时会出现精度丢失的情况。

DATE

Date32Type

INTERVAL_DAY_TIME

DayTimeIntervalType

说明

INTERVAL_DAY_TIME类型支持到纳秒,Storage API DayTimeIntervalType类型支持到毫秒,使用Storage API读写 INTERVAL_DAY_TIME 数据时,纳秒部分信息会被截断,此时会出现精度丢失的情况。

INTERVAL_YEAR_MONTH

MonthIntervalType

ARRAY

ListType

MAP

MapType

说明

如果MAP中存在重复Key (Duplicate Key) ,

  • 写入阶段:Storage API不会在数据写入时处理Map中的重复Key。保留原本的数据结构并写入存储。

  • 查询阶段:查询数据时,SQL引擎通过“后者覆盖前者”,返回符合Map数据类型Key唯一的语义。

例如:写入原始数据: {'a': 1, 'b': 2, 'a': 3},查询结果 {'a': 3, 'b': 2}

STRUCT

StructType

JSON

StringType