Armazenamento para tabelas Apache Iceberg™

As tabelas Snowflake normalmente usam armazenamento gerenciado pelo Snowflake. Por outro lado, as tabelas Apache Iceberg™ no Snowflake usam o armazenamento externo que você configura e mantém.

Este tópico fornece informações conceituais e práticas recomendadas para armazenamento de tabelas Iceberg.

Concessão de acesso do Snowflake ao seu armazenamento

Para conceder ao Snowflake acesso aos seus locais de armazenamento para tabelas Iceberg, use o serviço de gerenciamento de identidade e acesso de seu provedor de nuvem. Você concede a uma identidade, ou entidade, acesso limitado ao seu armazenamento sem trocar os segredos. Este é o mesmo modelo de acesso que a Snowflake usa para outras integrações, incluindo integrações de armazenamento.

O Snowflake fornece uma entidade para toda a sua conta Snowflake quando você cria um volume externo. A entidade é a seguinte, dependendo de seu provedor de nuvem:

Provedor de nuvem

Entidade provisionada pelo Snowflake

Amazon Web Services (AWS)

Usuário de IAM

Google Cloud

Conta de serviço

Azure

Entidade de serviço

O Snowflake autentica diretamente com seu provedor de armazenamento, e a entidade provisionada pelo Snowflake assume uma função que você especifica. A função deve ter permissão para executar operações em seu local de armazenamento. Por exemplo, o Snowflake pode ler de um local de armazenamento somente se a função tiver permissão para ler desse local de armazenamento.

O Snowflake requer permissão para executar as seguintes ações nas tabelas Iceberg:

Tabelas gerenciadas pelo Snowflake

Tabelas que usam um catálogo Iceberg externo

Amazon S3

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:ListBucket

  • s3:PutObject

  • s3:DeleteObject

  • s3:GetObjectVersion

  • s3:DeleteObjectVersion

  • s3:GetBucketLocation

  • s3:GetObject

  • s3:ListBucket

  • s3:GetObjectVersion

Google Cloud Storage

  • storage.objects.create

  • storage.objects.delete

  • storage.objects.get

  • storage.objects.list

  • storage.buckets.get

  • storage.objects.get

  • storage.objects.list

Armazenamento do Azure

Todas as ações permitidas para a função Storage Blob Data Contributor

Todas as ações permitidas para a função Storage Blob Data Reader

Nota

A permissão s3:PutObject concede acesso de gravação ao local do volume externo. Para configurar completamente o acesso de gravação, você deve definir o parâmetro ALLOW_WRITES do volume externo como TRUE (o valor padrão).

Cada volume externo é associado a um Local de armazenamento ativo específico, e um único volume externo pode oferecer suporte a várias tabelas Iceberg. No entanto, o número de volumes externos necessários depende de como você deseja armazenar, organizar e proteger os dados da sua tabela.

Você pode usar um único volume externo se quiser os dados e metadados de todas as suas tabelas Snowflake-Iceberg em subdiretórios no mesmo local de armazenamento (por exemplo, no mesmo bucket S3). Para configurar esses diretórios para tabelas gerenciadas pelo Snowflake, consulte Diretórios de dados e metadados.

Como alternativa, você pode criar vários volumes externos para proteger vários locais de armazenamento de forma diferente. Por exemplo, você pode criar os seguintes volumes externos:

  • Um volume externo somente leitura para tabelas Iceberg gerenciadas externamente.

  • Um volume externo configurado com acesso de leitura e gravação para tabelas gerenciadas pelo Snowflake.

Para obter instruções completas sobre como conceder ao Snowflake acesso ao seu armazenamento para tabelas Iceberg, consulte os seguintes tópicos:

Local de armazenamento ativo

Cada volume externo oferece suporte a um único local de armazenamento ativo. Se você especificar vários locais de armazenamento em uma instrução CREATE EXTERNAL VOLUME, o Snowflake atribui um local como o local ativo. A localização ativa permanece a mesma durante a vida útil do volume externo.

A atribuição ocorre na primeira vez que você usa o volume externo em uma instrução CREATE ICEBERG TABLE. Snowflake usa a seguinte lógica para escolher um local ativo:

  • Se a lista STORAGE_LOCATIONS contiver um ou mais locais de armazenamento local, o Snowflake usará o primeiro local de armazenamento local da lista. A localização do armazenamento local é aquela com o mesmo provedor de nuvem e na mesma região da sua conta Snowflake.

  • Se a lista STORAGE_LOCATIONS não contiver nenhum local de armazenamento local, o Snowflake selecionará o primeiro local da lista.

Nota

  • As tabelas Iceberg entre nuvens/regiões são compatíveis somente quando você usa um catálogo Iceberg externo. Para obter mais informações, consulte Suporte entre nuvens/entre regiões.

  • Os volumes externos criados antes da versão 7.44 do Snowflake podem ter usado uma lógica diferente para selecionar um local ativo.

Verificação de acesso ao armazenamento

Para verificar se o Snowflake pode se autenticar com sucesso no seu provedor de armazenamento, chame a função SYSTEM$VERIFY_EXTERNAL_VOLUME.

SELECT SYSTEM$VERIFY_EXTERNAL_VOLUME('my_s3_external_volume');
Copy

Para tabelas gerenciadas pelo Snowflake, o Snowflake verifica automaticamente o acesso ao local de armazenamento ativo no seu volume externo nas seguintes situações:

  • A primeira vez que você especifica esse volume externo em uma instrução CREATE ICEBERG TABLE para uma tabela gerenciada pelo Snowflake.

  • A primeira vez que você converte uma tabela para usar o Snowflake como catálogo Iceberg.

A propriedade do volume externo ALLOW_WRITES deve ser definida como TRUE.

O Snowflake tenta as seguintes operações de armazenamento para verificar o local de armazenamento.

  1. Escrever um arquivo de teste.

  2. Ler o arquivo.

  3. Listar o conteúdo do caminho do arquivo.

  4. Excluir o arquivo.

Se alguma das operações falhar, a instrução CREATE ICEBERG TABLE (ou ALTER ICEBERG TABLE … CONVERT TO MANAGED) falha e você recebe uma mensagem de erro.

Gerenciamento de arquivos

Esta seção explica como funciona o gerenciamento de arquivos de tabela Iceberg no armazenamento, de acordo com o tipo de tabela Iceberg.

Tabelas gerenciadas pelo Snowflake

Importante

  • Proíba que outras ferramentas acessem para excluir ou substituir objetos associados às tabelas Iceberg gerenciadas pelo Snowflake.

  • Certifique-se de que entidade Snowflake mantenha acesso ao armazenamento de sua tabela. Para obter mais informações, consulte Concessão de acesso do Snowflake ao seu armazenamento.

Mesmo que você configure e gerencie locais de armazenamento para tabelas Iceberg, o Snowflake opera exclusivamente nos objetos em seu armazenamento (arquivos de dados e metadados) que pertencem às tabelas gerenciadas pelo Snowflake. O Snowflake executa manutenção periódica nesses objetos de tabela para otimizar o desempenho da consulta e limpar dados excluídos.

As consultas podem falhar se outras ferramentas excluírem ou substituírem objetos de tabela gerenciados pelo Snowflake. Da mesma forma, as consultas na tabela e as operações de manutenção de tabela do Snowflake falharão se você revogar o acesso da entidade Snowflake ao seu armazenamento.

O Snowflake exclui os objetos após o término do período de retenção da tabela, quando os dados da tabela gerenciada pelo Snowflake são excluídos ou a tabela é descartada.

Diretórios de dados e metadados

Para tabelas gerenciadas pelo Snowflake, o Snowflake grava arquivos de dados do Parquet e metadados de tabela nos seguintes caminhos em seu armazenamento em nuvem externo:

  • STORAGE_BASE_URL/BASE_LOCATION/data/

  • STORAGE_BASE_URL/BASE_LOCATION/metadata/

Onde:

  • STORAGE_BASE_URL é a URL base para o local de armazenamento ativo associado ao seu volume externo.

  • BASE_LOCATION é o nome de um diretório em um caminho relativo de seu volume externo (especificado em sua instrução CREATE ICEBERG TABLE).

Especificação de uma cadeia de caracteres vazia para BASE_LOCATION

Se você especificar uma cadeia de caracteres vazia ('') para o BASE_LOCATION, o Snowflake cria os diretórios data/ e metadata/ logo abaixo de STORAGE_BASE_URL.

Por exemplo: STORAGE_BASE_URL/data/

Uso do mesmo local para várias tabelas

Se você usar o mesmo local de armazenamento e especificar o mesmo local base para várias tabelas, o Snowflake gravará os dados de todas essas tabelas no mesmo diretório data/. Da mesma forma, o Snowflake grava os metadados de todas essas tabelas no mesmo diretório metadata/.

Organização do armazenamento de tabela com BASE_LOCATION

Para organizar arquivos no armazenamento de várias tabelas Iceberg sob a mesma STORAGE_BASE_URL, considere usar o nome de tabela como BASE_LOCATION em sua instrução CREATE ICEBERG TABLE. Dessa forma, o Snowflake grava dados e metadados em um diretório com o mesmo nome da tabela.

Por exemplo:

CREATE OR REPLACE ICEBERG TABLE iceberg_table_1 (
  col_1 int,
  col_2 string
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'iceberg_external_volume'
  BASE_LOCATION = 'iceberg_table_1';

CREATE OR REPLACE ICEBERG TABLE iceberg_table_2 (
  col_1 int,
  col_2 string
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'iceberg_external_volume'
  BASE_LOCATION = 'iceberg_table_2';
Copy

A declaração resulta na seguinte estrutura de diretório em seu armazenamento em nuvem externa:

STORAGE_BASE_URL
|-- iceberg_table_1
|   |-- data/
|   |-- metadata/
|-- iceberg_table_2
|   |-- data/
|   |-- metadata/
Copy

Tabelas que usam um catálogo externo

O Snowflake não grava ou exclui objetos de armazenamento para tabelas Iceberg gerenciadas externamente ou em volumes externos com a propriedade ALLOW_WRITES definida para FALSE.

Para acessar os dados e metadados de sua tabela, o Snowflake assume a função de controle de acesso que você configura para seu volume externo. Você concede à função permissão para acessar um local de armazenamento (em um bucket ou contêiner). Todos os dados de sua tabela e arquivos de metadados devem estar nesse local. Por exemplo, se seu local de armazenamento for um bucket S3, todos os seus dados e arquivos de metadados deverão existir em algum lugar nesse bucket.

Adicionalmente, converter uma tabela não reescreve nenhum arquivo de dados ou metadados. O Snowflake grava em uma tabela Iceberg somente depois que você converte uma tabela para usar o Snowflake como catálogo.

Habilitação de logs de acesso ao armazenamento

Para diagnosticar problemas e auditar o acesso a locais de armazenamento associados a um volume externo, você pode habilitar o registro de armazenamento em log. Os logs de armazenamento ajudam a identificar a causa de arquivos ausentes ou corrompidos.

Habilite o registro em log com seu provedor de armazenamento. Como você possui e gerencia o armazenamento para tabelas Iceberg, o Snowflake não pode habilitar o registro em log ou a auditoria em seus locais de armazenamento Iceberg.

Para saber mais sobre os logs de acesso a armazenamento de seu provedor de armazenamento, consulte os seguintes tópicos externos:

Proteção de arquivos com controle de versão e retenção de objetos

Se os dados de sua tabela Iceberg estiverem em um repositório central de dados (ou data lake) operado por diversas ferramentas e serviços, poderá ocorrer uma corrupção ou exclusão acidental. Para proteger os dados da tabela Iceberg e garantir a recuperação de dados excluídos ou substituídos acidentalmente, use o gerenciamento do ciclo de vida do armazenamento e o controle de versão oferecidos por seu provedor de armazenamento.

Com o gerenciamento do ciclo de vida, você pode definir regras de retenção e rastreamento para objetos de armazenamento. Para saber mais sobre o gerenciamento do ciclo de vida de seu provedor de armazenamento, consulte os seguintes tópicos externos:

Para oferecer suporte à recuperação de objetos, você também pode ativar o controle de versão para seu armazenamento externo em nuvem.

Criptografia de arquivos da tabela

O Snowflake pode ler arquivos de tabela Iceberg no armazenamento que você criptografa usando esquemas de criptografia comum do lado do servidor (SSE). É necessário usar seu provedor de serviços de nuvem para gerenciar chaves de criptografia e conceder à entidade Snowflake acesso às suas chaves ao usar uma chave gerenciada pelo cliente.

Para o Amazon S3, o Snowflake oferece suporte às seguintes opções de SSE:

Opção de SSE

Configuração

SSE com chaves gerenciadas pelo Amazon S3 (SSE-S3)

Especifique ENCRYPTION = ( TYPE = 'AWS_SSE_S3' ) no comando CREATE EXTERNAL VOLUME.

SSE com chaves AWS KMS (SSE-KMS)

Especifique ENCRYPTION = ( TYPE = 'AWS_SSE_KMS' KMS_KEY_ID='my_key' ) no comando CREATE EXTERNAL VOLUME.

Você também deve conceder os privilégios necessários para criptografia SSE-KMS. Para obter instruções, consulte a etapa 3 em Configuração de um volume externo para Amazon S3.

Para o Google Cloud Storage, o Snowflake oferece suporte à seguinte opção de SSE:

Opção de SSE

Configuração

SSE com chaves armazenadas no Google Cloud KMS

Especifique ENCRYPTION = ( TYPE = 'GCS_SSE_KMS' KMS_KEY_ID = 'my_key' ) no comando CREATE EXTERNAL VOLUME.

Você também deve Concessão de permissões de conta de serviço do GCS nas chaves do Google Cloud Key Management Service.