O armazenamento em camadas do MaxCompute oferece suporte às classes Standard, IA storage class e long-term storage. Por padrão, as tabelas utilizam o armazenamento Standard. Defina a classe de armazenamento de tabelas ou partições específicas como IA storage class ou long-term storage com base na frequência de acesso aos dados. Esse recurso permite o nivelamento automático de armazenamento para dados quentes e frios, reduzindo os custos de armazenamento.
Classes de armazenamento em camadas
|
Classe de armazenamento |
Descrição |
|
Standard |
Classe de armazenamento padrão. Recomendada para dados com acesso frequente e que exigem operações constantes de leitura e gravação. |
|
IA storage class |
Indicada para dados que não exigem acesso frequente. Reduz efetivamente as taxas de armazenamento. Nota
|
|
Long-term storage |
Faturamento do armazenamento em camadas
Para obter detalhes sobre o faturamento de armazenamento, consulte Taxa de armazenamento.
-
Ao definir uma tabela ou partição como IA storage class ou long-term storage, monitore o volume e a frequência de acesso aos seus dados. Se você acessar grandes volumes de dados ou acessá-los com muita frequência, seus custos poderão exceder os do armazenamento Standard.
Acessar uma tabela ou partição inteira armazenada na IA storage class uma vez por mês gera o mesmo custo do armazenamento Standard.
Acessar uma tabela ou partição inteira armazenada no long-term storage uma vez a cada seis meses gera o mesmo custo do armazenamento Standard.
Faça logon em Expenses and Costs. Na página , visualize as taxas das diferentes classes de armazenamento. Os itens de faturamento para Standard, IA storage class e long-term storage são denominados Storage, Tiered Storage - IA e Long-term Storage, respectivamente. Para mais informações, consulte Visualizar detalhes da fatura.
Escopo
Restrições de região: China (Hangzhou), China (Shanghai), China (Beijing), China (Zhangjiakou), China (Ulanqab), China (Shenzhen), China (Chengdu), China (Hong Kong), China (Shanghai) Finance Cloud, China (Beijing) Finance Cloud, China (Shenzhen) Finance Cloud, Singapura, Malásia (Kuala Lumpur), Indonésia (Jakarta), Japão (Tóquio), Alemanha (Frankfurt), EUA (Vale do Silício).
O Hologres não acessa diretamente dados armazenados na IA storage class ou no long-term storage. Quando o Hologres lê dados do MaxCompute diretamente, as tabelas ou partições do MaxCompute não atualizam seu last_access_time. Portanto, se você configurar uma regra de ciclo de vida usando a condição
last_access_time, tabelas ou partições lidas continuamente apenas pelo Hologres ainda poderão corresponder à regra.
Definir classe de armazenamento
Converta entre classes de armazenamento conforme necessário. A alteração da classe de armazenamento não afeta o acesso aos dados.
A tabela a seguir descreve as conversões de classe de armazenamento:
|
Conversão |
Descrição |
|
Standard → IA storage class |
Suporta conversão manual e automática. Não há cobrança de taxas de acesso de E/S. O LastModifiedTime e o LastAccessTime da tabela ou partição não são atualizados. |
|
Standard → Long-term storage |
|
|
Infrequent Access > Long-term Storage |
Suporta conversão manual e automática. A transição manual incorre em taxas de acesso de E/S, enquanto a automática não. O LastModifiedTime e o LastAccessTime da tabela ou partição não são atualizados. |
|
IA storage class → Standard |
Suporta apenas conversão manual. Há cobrança de taxas de acesso de E/S. O LastModifiedTime e o LastAccessTime da tabela ou partição são atualizados. |
|
Long-term storage → IA storage class |
|
|
Long-term storage → Standard |
Configurações personalizadas manuais
Para tabelas não particionadas ou partições, defina manualmente a classe de armazenamento como IA storage class ou long-term storage. A alteração entra em vigor imediatamente.
Sintaxe
ALTER TABLE <TABLE_NAME> [PARTITION(<PARTITION_SPEC>)]
SET <TBLPROPERTIES|PARTITIONPROPERTIES>("storagetier"="standard|lowfrequency|longterm");
Descrição dos parâmetros
TABLE_NAME: Obrigatório. Nome da tabela cuja classe de armazenamento será modificada.
PARTITION_SPEC: Obrigatório ao modificar a classe de armazenamento de uma partição.
-
TBLPROPERTIES | PARTITIONPROPERTIES: Modifique a classe de armazenamento de uma tabela ou partição. Descrição dos valores:
TBLPROPERTIES: Modifique a classe de armazenamento de uma tabela.
PARTITIONPROPERTIES: Modifique a classe de armazenamento de uma partição.
-
storagetier: Obrigatório. A classe de armazenamento em camadas. Valores válidos:
standard: Armazenamento Standard. Apenas taxas de armazenamento se aplicam.
lowfrequency: IA storage class. Aplicam-se taxas de armazenamento e taxas de acesso a dados da IA storage class.
longterm: Long-term storage. Aplicam-se taxas de armazenamento e taxas de acesso a dados do long-term storage.
Defina o armazenamento em camadas apenas para partições em tabelas particionadas. Não é possível definir o armazenamento em camadas para toda a tabela particionada.
Exemplos
-
Exemplo 1: Definir a classe de armazenamento de uma tabela não particionada como IA storage class.
ALTER TABLE tablename SET TBLPROPERTIES("storagetier"="lowfrequency");Para verificar a classe de armazenamento atual, verifique o campo
StorageTiernas propriedades da tabela.-- View table properties DESC extended tablename; --- Sample output +-------------------------------------------------------------------+ | 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 | +-------------------------------------------------------------------+ -
Exemplo 2: Definir a classe de armazenamento de uma partição na tabela particionada bank_data_pt como IA storage class.
ALTER TABLE bank_data_pt PARTITION (credit='yes') SET PARTITIONPROPERTIES ("storagetier" = 'lowfrequency');Para verificar a classe de armazenamento atual, verifique o campo
StorageTiernas propriedades da partição.-- View partition properties DESC extended bank_data_pt PARTITION(credit='yes'); -- Sample output +------------------------------------------------------------------------------------+ | 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 | +------------------------------------------------------------------------------------+
Configuração automática usando regras de ciclo de vida
Configure regras de ciclo de vida de armazenamento em camadas no nível de projeto ou de tabela particionada. Essas regras convertem automaticamente as classes de armazenamento com base em condições especificadas:
-
Regras no nível do projeto:
Após definir uma regra no nível do projeto, ela se torna a regra padrão para todas as tabelas não particionadas no projeto e para todas as partições em tabelas particionadas que não possuem regras próprias. Essas tabelas e partições são convertidas automaticamente para a classe de armazenamento especificada.
-
Configurações no nível da tabela particionada:
Ao definir uma regra para uma tabela particionada específica, ela tem precedência sobre a regra no nível do projeto. Todas as partições na tabela que atendem às condições da regra são convertidas automaticamente para a classe de armazenamento especificada.
Limitações importantes
Não configure regras com granularidade mais fina:
Não defina uma regra independente para uma única tabela não particionada (ela herda a regra do projeto).
Não defina uma regra independente para uma partição específica em uma tabela particionada (ela herda a regra da tabela).
Execução da regra
Quando o ciclo de vida de uma tabela ou partição satisfaz tanto a regra de long-term storage (longterm) quanto a de low-frequency storage (lowfrequency), a conversão prioritária é para
longterm.Se uma tabela ou partição atender primeiro à regra
lowfrequency, ela será convertida paralowfrequency. Caso atenda posteriormente à regralongterm, será convertida novamente paralongterm. Essa conversão delowfrequencyparalongtermnão incorre em taxas de acesso delowfrequency. Para detalhes de faturamento, consulte Faturamento do armazenamento em camadas.A plataforma verifica as regras duas vezes ao dia. Portanto, pode haver um atraso entre o momento em que uma tabela ou partição atende às condições e a atualização da classe de armazenamento.
Sintaxe
-
Definir uma regra de ciclo de vida no nível do projeto
SETPROJECT odps.table.lifecycle.config=<lifecycle_config_json_string>;Também é possível configurar isso no console do MaxCompute:
Faça logon no MaxCompute console e selecione uma região no canto superior esquerdo.
No painel de navegação à esquerda, escolha .
Na página Projects, clique em Manage na coluna Actions do projeto desejado.
Na página Project Settings, clique na aba Parameter Configuration.
Na seção Lifecycle Configuration, clique em Edit.
-
Configure os parâmetros Last Access Configuration Policy e Last Modified Configuration Policy.
Last Access Configuration Policy: Corresponde ao parâmetro
DaysAfterLastAccessGreaterThan.Last Modified Configuration Policy: Corresponde ao parâmetro
DaysAfterLastModificationGreaterThan.
-
Definir uma regra de ciclo de vida para uma tabela particionada
-
Definir durante a criação da tabela:
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>') ; -
Configurações de modificação de tabela particionada:
ALTER TABLE <TABLE_NAME> SET TBLPROPERTIES ('lifecycle_config' = '<lifecycle_config_json_string>');
-
-
Visualize a configuração de ciclo de vida de armazenamento em camadas de uma tabela particionada
SHOW CREATE TABLE <table_name>;
Descrição dos parâmetros
A seguir estão descritos os principais parâmetros. Para outros parâmetros, consulte Parâmetros gerais.
lifecycle_config_json_string:
-
Para regras de ciclo de vida no nível do projeto, defina da seguinte forma:
{ "TierToLowFrequency": { "DaysAfterLastModificationGreaterThan": <days>, // Days since last modification "DaysAfterLastAccessGreaterThan": <days>, // Days since last access }, "TierToLongterm": { "DaysAfterLastModificationGreaterThan": <days>, "DaysAfterLastAccessGreaterThan": <days> } // Each condition is optional. Multiple conditions use OR logic. } -
Para regras de ciclo de vida de tabela particionada, defina da seguinte forma:
{ \"TierToLowFrequency\": { \"DaysAfterLastModificationGreaterThan\": <days>, // Days since last modification \"DaysAfterLastAccessGreaterThan\": <days>, // Days since last access }, \"TierToLongterm\": { \"DaysAfterLastModificationGreaterThan\": <days>, \"DaysAfterLastAccessGreaterThan\": <days> } // Each condition is optional. Multiple conditions use OR logic. } TierToLowFrequency: Identificador para IA storage class.
TierToLongterm: Identificador para long-term storage.
DaysAfterLastModificationGreaterThan: Especifica o número de dias após o qual a configuração é aplicada automaticamente, com base no LastModifiedTime da tabela ou partição.
-
DaysAfterLastAccessGreaterThan: Especifica o número de dias após o qual a classe de armazenamento é definida automaticamente com base no LastAccessTime da tabela ou partição. Se o LastAccessTime estiver vazio:
Para tabelas ou partições criadas antes de 1º de outubro de 2023, o sistema usa o horário UTC+0
2023-10-01 00:00:00como padrão.Para tabelas ou partições criadas em ou após 1º de outubro de 2023, se os dados nunca tiverem sido acessados, o sistema usa o CreateTime.
Exemplos
-
Exemplo 1: Definir uma regra de ciclo de vida no nível do projeto.
setproject odps.table.lifecycle.config={"TierToLongterm":{"DaysAfterLastAccessGreaterThan":180},"TierToLowFrequency":{"DaysAfterLastAccessGreaterThan":120}}; -
Exemplo 2: Remover a configuração de ciclo de vida no nível do projeto.
setproject odps.table.lifecycle.config=; -
Exemplo 3: Definir uma regra de ciclo de vida para uma tabela particionada.
-- Set during table creation CREATE TABLE lifecycle_part_t (key string) PARTITIONED BY (ds STRING) tblproperties ('lifecycle_config' = '{\"TierToLowFrequency\": {\"DaysAfterLastModificationGreaterThan\": 2,\"DaysAfterLastAccessGreaterThan\": 2},\"TierToLongterm\": {\"DaysAfterLastModificationGreaterThan\": 4,\"DaysAfterLastAccessGreaterThan\": 7}}') ; -- Modify an existing table ALTER TABLE lifecycle_part_t SET tblproperties ('lifecycle_config'='{\"TierToLowFrequency\": {\"DaysAfterLastModificationGreaterThan\": 90,\"DaysAfterLastAccessGreaterThan\": 30},\"TierToLongterm\": {\"DaysAfterLastModificationGreaterThan\": 180,\"DaysAfterLastAccessGreaterThan\": 7}}'); -
Exemplo 4: Remover a configuração de ciclo de vida de armazenamento em camadas de uma tabela particionada.
ALTER TABLE lifecycle_part_t SET tblproperties ('lifecycle_config'='{}');
Definir permissões de acesso a dados para armazenamento em camadas
O acesso a dados armazenados na IA storage class ou no long-term storage incorre em taxas de acesso. Controle o acesso a esses dados combinando o controle de acesso no nível de linha com a função GET_PARTITION_META.
GET_PARTITION_META
GET_PARTITION_META é uma função especial. Use-a apenas com permissões no nível de linha. Não a utilize em consultas SQL regulares.
Sintaxe
struct GET_PARTITION_META(<tableName>, <pt_col1>, <pt_col2>, ..., <pt_col_n>);
Descrição dos parâmetros
|
Nome do parâmetro |
Descrição |
|
tableName |
Nome de uma tabela particionada. Deve ser uma String. Suporta os formatos |
|
pt_col |
Cada parâmetro de pt_col1 a pt_col_n corresponde a um nível de partição na tabela particionada. Cada parâmetro deve ser uma referência de coluna. |
Valor de retorno
Retorna uma Struct do tipo struct<storagetier:string>. A Struct contém um campo String que descreve a classe de armazenamento da partição correspondente.
Observações
Ao adicionar uma regra no nível de linha a uma tabela, considere os padrões de acesso de usuários além daqueles que estão sendo controlados. Se outros usuários já acessaram a tabela, defina regras explícitas para eles a fim de evitar filtragem inesperada de dados devido a restrições de acesso não intencionais. Para mais informações, consulte Controle de acesso no nível de linha.
Por padrão, as tabelas do MaxCompute podem ser acessadas via SQL e mecanismos externos (como Spark e Flink). No entanto, apenas o mecanismo SQL do MaxCompute suporta a função GET_PARTITION_META. Se você usar GET_PARTITION_META no controle de acesso no nível de linha, a tabela só poderá ser lida pelo mecanismo SQL do MaxCompute. Outros mecanismos não conseguirão acessar a tabela.
Para acessar dados sob permissões no nível de linha, você também deve ter a permissão SELECT sobre os dados.
-
O comportamento de pruning de partição varia dependendo das condições de filtro usadas com GET_PARTITION_META.
-
Se a condição de filtro envolver apenas campos de partição — por exemplo, permitindo acesso ao armazenamento Standard onde o valor da partição de primeiro nível é
2024:GET_PARTITION_META('storage_table', pt1, pt2).storagetier == 'standard') AND pt1='2024'Ao acessar
storage_tableusando SQL e a cláusula WHERE não contiver condições de partição, o sistema suporta nativamente o pruning de partição para evitar uma varredura completa da tabela, permitindo acesso somente leitura apenas às partições emstorage_tableque atendem aos requisitos. -
Se a condição de filtro incluir um campo de não-partição combinado com um operador AND — por exemplo, permitindo acesso ao armazenamento Standard onde
a>100:GET_PARTITION_META('storage_table', pt1, pt2).storagetier == 'standard') AND a > 100Ao consultar
storage_tablesem uma condição de partição na cláusula WHERE, o pruning de partição ainda se aplica. Apenas as partições armazenadas comostandardsão acessadas. -
Se a condição de filtro incluir um campo de não-partição combinado com um operador OR — por exemplo, permitindo acesso ao armazenamento Standard ou onde
a>100:get_partition_meta('storage_table', pt1, pt2).storagetier == 'standard') OR a > 100Ao consultar
storage_table, dois cenários se aplicam:Se a cláusula WHERE não tiver condição de partição, todas as partições serão verificadas para encontrar dados onde
a>100.Se a cláusula WHERE incluir uma condição de partição, apenas as partições especificadas serão verificadas em busca de dados correspondentes a
standardoua>100.
-
Exemplos
Crie a tabela particionada storage_table.
CREATE TABLE storage_table(a BIGINT, b BIGINT) PARTITIONED BY (pt1 STRING, pt2 STRING);
-
Exemplo 1:
Crie uma política chamada
policy01para o grupo de usuários DEFAULT. Esta política permite acesso apenas aos dados de armazenamento Standard emstorage_table. Todos os usuários (incluindo o Project Owner) têm negado o acesso a dados da IA storage class ou do long-term storage e recebem resultados vazios.CREATE ROW ACCESS POLICY policy01 ON storage_table TO DEFAULT FILTER USING (get_partition_meta('storage_table', pt1, pt2).storagetier == 'standard');Se o Logview Summary mostrar a seguinte palavra-chave, a filtragem no nível de linha foi acionada:
WARNING:[1,15] row access policy is enabled on table yyy_hp_storagetier.storage_table01. Isso indica que a política de acesso a linhas foi aplicada durante a consulta. -
Exemplo 2:
Conceda ao usuário
user_xa permissãopolicy02para acessar dados da IA storage class e do long-term storage emstorage_table.CREATE ROW ACCESS POLICY policy02 ON storage_table TO USER (user_x) -- You can also grant to a role using TO role rolename, then assign the role to user_x. FILTER USING (get_partition_meta('storage_table', pt1, pt2).storagetier IN ('lowfrequency','longterm'));Dois cenários se aplicam:
Se a tabela tiver a permissão
policy01configurada, todos os usuários (excetouser_x) podem acessar os dados de armazenamento standard destorage_table, mas não podem acessar dados de infrequent-access ou long-term storage, e qualquer tentativa retorna valores vazios. Parauser_x, o acesso aos dados de infrequent-access e long-term storage destorage_tableé permitido, mas o acesso a dados de armazenamento standard não é permitido e retorna valores vazios.Se
policy01não estiver definida, todos os usuários (exceto user_x) não podem acessar nenhum dado emstorage_table(resultados vazios). Apenas user_x pode acessar dados da IA storage class e do long-term storage, mas não pode acessar dados de armazenamento Standard (resultados vazios).
-
Exemplo 3:
Conceda ao usuário
user_ya permissãopolicy03para acessar todos os dados emstorage_table.CREATE ROW ACCESS POLICY policy03 ON storage_table TO USER (user_y) -- You can also grant to a role using TO role rolename, then assign the role to user_y. FILTER USING (true); -- Constant true allows access to all data in the table.Dois cenários se aplicam:
Se a tabela tiver a permissão
policy01definida, todos os usuários (excetouser_y) podem acessar os dados de armazenamento Standard destorage_table, mas não podem acessar infrequent access ou long-term storage, e tais solicitações retornam valores vazios. O usuáriouser_ypode acessar dados de todas as classes de armazenamento emstorage_table.Se a tabela não tiver a permissão
policy01atribuída, todos os usuários (excetouser_y) não podem acessar nenhum dado armazenado emstorage_table, e tais solicitações retornam valores vazios. Apenasuser_ypode acessar dados de todas as classes de armazenamento emstorage_table.