MaxCompute分层存储支持标准存储、低频存储和长期存储,默认情况下为标准存储。您可以根据数据的访问频率,将某些表或分区的存储类型设置为低频存储或长期存储,实现数据的冷热分层,以降低数据存储费用。
申请开通使用
分层存储类型介绍
存储类型 | 描述 |
标准存储 | 默认存储类型,适用于经常访问数据并对数据进行频繁读写操作的场景。 |
低频存储 | 适用于不需要频繁访问的数据,能够有效降低存储费用。 说明
|
长期存储 |
分层存储计费
存储类型 | 计费公式 | 价格 | 说明 |
标准存储 | 日存储费用=日存储量平均值×单价 | 项目的实际数据存储量在1 GB以内(包含1 GB)免费,超过1 GB的部分,计费单价为:0.0006 USD/GB/天。 | 日存储量平均值=采集到的存储量之和÷24 |
低频存储 |
|
|
|
长期存储 |
|
|
注意事项
当前低频存储和长期存储类型的数据不支持PAI和Hologres直接访问。
当表或分区设置为低频存储或长期存储时,请注意访问数据量和频次,如果访问数据量大或访问频次过多,可能会导致费用高于标准存储费用。
一个月全量访问一次低频存储的表或分区产生的费用,将等于标准存储的费用。
六个月全量访问一次长期存储的表或分区产生的费用,将等于标准存储的费用。
设置存储类型
存储类型之间可以相互转换,且修改存储类型不会影响数据访问。
存储类型转换说明如下:
转换过程 | 说明 |
标准存储->低频存储 | 支持手动和自动方式转换,无I/O访问费,同时不更新表/分区的“数据最后更新时间”和“数据最后访问时间”。 |
标准存储->长期存储 | |
低频存储->长期存储 | 支持手动和自动方式转换,手动切换有I/O访问费,自动切换没有,同时不更新表/分区的“数据最后更新时间”和“数据最后访问时间”。 |
低频存储->标准存储 | 仅支持手动转换,有I/O访问费,同时更新表/分区的“数据最后更新时间”和“数据最后访问时间”。 |
长期存储->低频存储 | |
长期存储->标准存储 |
手动自定义设置
对于非分区表或分区,直接手动自定义设置为低频存储或长期存储类型,设置后立即生效。
命令格式
ALTER TABLE <TABLE_NAME> [PARTITION(<PARTITION_SPEC>)]
SET <TBLPROPERTIES|PARTITIONPROPERTIES>("storagetier"="standard|lowfrequency|longterm");
参数说明
TABLE_NAME:必填,待修改的表或者分区存储类型的表名称。
PARTITION_SPEC:当修改分区存储类型时必填。
TBLPROPERTIES|PARTITIONPROPERTIES:修改表或分区的存储类型,取值说明:
TBLPROPERTIES:修改表的存储类型。
PARTITIONPROPERTIES:修改分区的存储类型。
storagetier:必填,分层存储类型,取值说明:
standard:标准存储,只收取存储费用。
lowfrequency:低频存储,会收取存储费用和低频存储数据访问费用。
longterm:长期存储,会收取存储费用和长期存储数据访问费用。
仅支持对分区表中的分区设置分层存储,不支持对分区表设置分层存储。
使用示例
示例1:设置非分区表的存储类型为低频存储。
ALTER TABLE tablename SET TBLPROPERTIES("storagetier"="lowfrequency");
查看表属性,可以通过
StorageTier
字段确认当前的存储类型。--查看表属性 DESC extended tablename; ---返回结果如下 +-------------------------------------------------------------------+ | Owner: ALIYUN$mofan_****@test.aliyunid.com | | Project: mf_mc_**** | | TableComment: | +-------------------------------------------------------------------+ | CreateTime: 2021-11-18 15:14:00 | | LastDDLTime: 2023-09-11 14:34:55 | | LastModifiedTime: 2023-09-13 15:02:28 | | LastAccessTime: 2023-09-14 10:50:57 | +-------------------------------------------------------------------+ | InternalTable: YES | Size: 1923683131 | +-------------------------------------------------------------------+ | Native Columns: | +-------------------------------------------------------------------+ | Field| Type| Label |ExtendedLabel| Nullable| DefaultValue|Comment | +-------------------------------------------------------------------+ | empno | bigint | | | true | NULL | | | ename | string | | | true | NULL | | | job | string | | | true | NULL | | | mgr | bigint | | | true | NULL | | | hiredate | datetime | | | true | NULL | | | sal | bigint | | | true | NULL | | | comm | bigint | | | true | NULL | | | deptno | bigint | | | true | NULL | | +-------------------------------------------------------------------+ | Extended Info: | +-------------------------------------------------------------------+ | TableID: 8e0cc78c81ab4ad7af30bff7a8e**** | | IsArchived: false | | PhysicalSize: 5771049393 | | FileNum: 3 | | StoredAs: AliOrc | | CompressionStrategy: normal | | odps.timemachine.retention.days: 1 | | ColdStorageStatus: N/A | | encryption_enable: false | | StorageTier: lowfrequency | | StorageTierLastModifiedTime: 2023-09-11 14:34:55 | +-------------------------------------------------------------------+
示例2:设置分区表bank_data_pt相应分区的存储类型为低频存储。
ALTER TABLE bank_data_pt PARTITION (credit='yes') SET PARTITIONPROPERTIES ("storagetier" = 'lowfrequency');
查看分区属性,可以通过
StorageTier
字段确认当前的存储类型。--查看分区属性 DESC extended bank_data_pt PARTITION(credit='yes'); --返回结果 +------------------------------------------------------------------------------------+ | PartitionSize: 0 | +------------------------------------------------------------------------------------+ | CreateTime: 2024-05-10 10:28:16 | | LastDDLTime: 2024-05-10 10:31:01 | | LastModifiedTime: 2024-05-10 10:28:16 | +------------------------------------------------------------------------------------+ | IsExstore: false | | IsArchived: false | | PhysicalSize: 0 | | FileNum: 0 | | ColdStorageStatus: N/A | | StorageTier: LowFrequency | | StorageTierLastModifiedTime: 2024-05-10 10:31:01 | +------------------------------------------------------------------------------------+
通过生命周期规则自动设置
对项目或分区表定义分层存储生命周期规则,基于该规则触发分层存储类型自动转换。即:
项目设置后,项目内所有非分区表和分区满足规则,表和分区会自动转换为对应的存储类型。
分区表设置后,该表下所有分区满足规则,分区会自动转换为对应的存储类型。
使用说明
不支持对分区以及非分区表单独配置分层存储生命周期规则。
分区表的分层存储生命周期规则优先级高于项目设置的分层存储生命周期规则。
当表或分区的生命周期同时满足长期存储(longterm)规则和低频存储(lowfrequency)规则时,会被优先转换为longterm。
当表或分区的生命周期先满足lowfrequency规则时,会被转换为lowfrequency,之后再满足longterm规则时,会再次被转换为longterm,此时从lowfrequency变成longterm不会产生lowfrequency的访问费用,计费详情请参见分层存储计费。
平台每天定时进行两次规则扫描设置,因此可能出现表或分区满足条件后无法立即进行设置,会存在一定的延迟。
命令格式
项目级别设置生命周期规则
SETPROJECT odps.table.lifecycle.config=<lifecycle_config_json_string>;
除此之外您也可通过MaxCompute控制台进行设置,具体如下:
登录MaxCompute控制台,在左上角选择地域。
在左侧导航栏选择工作区>项目管理,单击目标项目操作列的管理。
在参数配置页签的生命周期配置区域,配置最近访问配置策略和最近修改配置策略参数。
最近访问配置策略:对应
DaysAfterLastAccessGreaterThan
参数。最近修改配置策略:对应
DaysAfterLastModificationGreaterThan
参数。
分区表设置生命周期规则
分区表建表时设置:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> [PRIMARY KEY (<pk_col_name>, <pk_col_name2>),(<col_name> <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...)] PARTITIONED BY (<col_name> <data_type> [comment <col_comment>], ...) tblproperties ('lifecycle_config' = '<lifecycle_config_json_string>') ;
分区表修改设置:
ALTER TABLE <TABLE_NAME> SET TBLPROPERTIES ('lifecycle_config' = '<lifecycle_config_json_string>');
查看分区表分层存储生命周期的配置
SHOW CREATE TABLE <table_name>;
参数说明
主要参数说明如下,其余参数信息请参见通用参数。
lifecycle_config_json_string:
当项目级别设置生命周期规则时,定义如下。
{ "TierToLowFrequency": { "DaysAfterLastModificationGreaterThan": <days>, //距离最后修改时间超过xx天 "DaysAfterLastAccessGreaterThan": <days>, //距离最后访问时间超过xx天 }, "TierToLongterm": { "DaysAfterLastModificationGreaterThan": <days>, "DaysAfterLastAccessGreaterThan": <days> } //每个条件为可选条件,多个条件为or的关系 }
当分区表设置生命周期规则时,定义如下。
{ \"TierToLowFrequency\": { \"DaysAfterLastModificationGreaterThan\": <days>, //距离最后修改时间超过xx天 \"DaysAfterLastAccessGreaterThan\": <days>, //距离最后访问时间超过xx天 }, \"TierToLongterm\": { \"DaysAfterLastModificationGreaterThan\": <days>, \"DaysAfterLastAccessGreaterThan\": <days> } //每个条件为可选条件,多个条件为or的关系 }
TierToLowFrequency:低频存储标识。
TierToLongterm:长期存储标识。
DaysAfterLastModificationGreaterThan:定义距离数据最后修改时间超过多少天后自动设置,对应表或分区的LastModifiedTime。
DaysAfterLastAccessGreaterThan:定义距离数据最后访问时间超过多少天后自动设置,若表或分区的LastAccessTime为空,则:
对于2023年10月01日前创建的表或分区,默认按照UTC+0时区的
2023.10.01 00:00:00
时间计算。对于2023年10月01日后新建的表或分区,若数据没被访问过,按照CreateTime时间计算。
使用示例
示例1:项目级别设置生命周期规则。
setproject odps.table.lifecycle.config={"TierToLongterm":{"DaysAfterLastAccessGreaterThan":180},"TierToLowFrequency":{"DaysAfterLastAccessGreaterThan":120}};
示例2:取消项目级别生命周期配置。
setproject odps.table.lifecycle.config=;
示例3:分区表设置生命周期规则。
--分区表建表时设置 CREATE TABLE lifecycle_part_t (key string) PARTITIONED BY (ds STRING) tblproperties ('lifecycle_config' = '{\"TierToLowFrequency\": {\"DaysAfterLastModificationGreaterThan\": 2,\"DaysAfterLastAccessGreaterThan\": 2},\"TierToLongterm\": {\"DaysAfterLastModificationGreaterThan\": 4,\"DaysAfterLastAccessGreaterThan\": 7}}') ; --分区表修改设置 ALTER TABLE lifecycle_part_t SET tblproperties ('lifecycle_config'='{\"TierToLowFrequency\": {\"DaysAfterLastModificationGreaterThan\": 90,\"DaysAfterLastAccessGreaterThan\": 30},\"TierToLongterm\": {\"DaysAfterLastModificationGreaterThan\": 180,\"DaysAfterLastAccessGreaterThan\": 7}}');
示例4:分区表取消分层存储生命周期配置。
ALTER TABLE lifecycle_part_t SET tblproperties ('lifecycle_config'='{}');
分层存储数据访问权限设置
对于已经设置为低频或长期存储的数据,访问时会产生访问费用,基于行级访问控制能力配合GET_PARTITION_META函数可以对低频或长期存储数据进行权限控制,有效控制这些数据的访问。
GET_PARTITION_META
GET_PARTITION_META是一个很特殊的函数,目前只能配合行级权限控制来使用,不能在普通的SQL查询中使用。
语法
struct GET_PARTITION_META(<tableName>, <pt_col1>, <pt_col2>, ..., <pt_col_n>);
参数说明
参数名称 | 说明 |
tableName | 表名且必须是分区表,String类型。支持 |
pt_col | 从pt_col1至pt_col_n的每个参数,都对应分区表的一个分区层级。而且每个参数都必须是列引用。 |
返回值说明
返回一个Struct类型,类型为struct<storagetier:string>
。Struct只有一个String类型字段,描述对应分区的存储类型。
注意事项
对表增加行级规则时,需要考虑被控制的用户之外的其他用户的访问行为,如果该表之前已经被其他用户访问,则应为这些用户设置明确的规则,以避免因未经预期的禁止访问而导致的数据过滤问题。详情请参见行级访问控制。
默认情况下,MaxCompute的表不仅可以通过SQL进行访问,还支持外部引擎(如Spark、Flink)读取表数据。然而,目前仅MaxCompute SQL引擎支持GET_PARTITION_META函数。因此,如果在行级访问控制中使用了GET_PARTITION_META函数,则该表仅能被MaxCompute SQL引擎读取,其他引擎将无法正常访问该表。
在满足行级权限的前提下,能够访问数据的条件是必须具备数据访问权限控制,即需要拥有该数据的SELECT权限。
GET_PARTITION_META内的过滤条件,不同的场景会有不同的分区裁剪效果。
过滤条件仅涉及到分区表的分区字段。例如允许访问标准存储并且要求第一级分区的取值是
2024
。GET_PARTITION_META('storage_table', pt1, pt2).storagetier == 'standard') AND pt1='2024'
当使用SQL访问
storage_table
,WHERE条件没有分区条件,则系统天然支持分区裁剪,从而避免全表扫描,仅对storage_table
中符合要求的分区进行只读访问。过滤条件中包含非分区字段的取值,且使用的是与运算(AND)来连接两个过滤条件。例如允许访问标准存储并且和非分区值
a>100
进行与运算(AND)。GET_PARTITION_META('storage_table', pt1, pt2).storagetier == 'standard') AND a > 100
当使用SQL访问
storage_table
,WHERE条件没有分区条件,依然支持分区裁剪,只访问存储为standard
的分区。过滤条件中包含非分区字段的取值,且使用或运算(OR)来连接这两个过滤条件。例如允许访问标准存储并且和非分区值
a>100
进行或运算(OR)。get_partition_meta('storage_table', pt1, pt2).storagetier == 'standard') OR a > 100
当使用SQL访问
storage_table
时,存在两种情形:WHERE没有分区条件,则会访问所有分区以便扫描出满足
a>100
的数据。WHERE有分区条件则只扫描对应分区内满足
standard
或a>100
的数据。
使用示例
定义分区表storage_table
。
CREATE TABLE storage_table(a BIGINT, b BIGINT) PARTITIONED BY (pt1 STRING, pt2 STRING);
示例一:
为默认用户授予权限
policy01
,可以访问storage_table
标准存储数据。所有用户(包括Project Owner)不可访问低频或长期存储数据且返回空值。CREATE ROW ACCESS POLICY policy01 ON storage_table TO DEFAULT FILTER USING (get_partition_meta('storage_table', pt1, pt2).storagetier == 'standard');
示例二:
授予用户
user_x
访问storage_table
中低频存储及长期存储数据的权限policy02
。CREATE ROW ACCESS POLICY policy02 ON storage_table TO USER (user_x) --也可以通过TO role rolename为角色授权,然后再把角色授权给用户user。 FILTER USING (get_partition_meta('storage_table', pt1, pt2).storagetier IN ('lowfrequency','longterm'));
存在以下两种情形:
若项目已设置过
policy01
权限,所有用户(除user_x外)可以访问storage_table
标准存储数据,不可访问低频或长期存储数据且都返回空值。对于user_x用户可访问storage_table
的低频和长期存储数据,但不可访问标准存储数据会返回空值。若项目未设置过
policy01
权限,所有用户(除user_x外)不可访问storage_table
任何存储数据且都返回空值。只有user_x用户可访问低频和长期存储数据,但不可访问标准存储数据会返回空值。
示例三:
授予用户
user_y
对storage_table
所有数据的访问权限policy03
。CREATE ROW ACCESS POLICY policy03 ON storage_table TO USER (user_y) --也可以通过TO role rolename为角色授权,然后再把角色授权给用户user。 FILTER USING (true); -- 常量true表示可以访问对应table的所有数据
存在以下两种情形:
若项目已设置过
policy01
权限,所有用户(除user_y外)可以访问storage_table
标准存储数据,不可访问低频或长期存储且都返回空值。对于user_y
用户可以访问storage_table
所有存储类型的数据。若项目未设置过
policy01
权限,所有用户(除user_y外)不可访问storage_table
的任何存储数据且都返回空值。只有user_y
用户可访问storage_table
所有存储类型数据。