View a markdown version of this page

Acesso completo à tabela do Lake Formation para o EMR Serverless - Amazon EMR

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Acesso completo à tabela do Lake Formation para o EMR Serverless

Com as versões 7.8.0 e superiores do Amazon EMR, você pode aproveitar o Lake AWS Formation com o Glue Data Catalog, onde a função de tempo de execução do trabalho tem permissões completas de tabela sem as limitações do controle de acesso refinado. Esse recurso permite que você leia e grave em tabelas protegidas pelo Lake Formation a partir de trabalhos Spark em lote e interativos do EMR Sem Servidor. Consulte as seções a seguir para saber mais sobre o Lake Formation e como usá-lo com o EMR Sem Servidor.

Como usar o Lake Formation com acesso total à tabela

Você pode acessar as tabelas do catálogo do Glue Data protegidas pelo AWS Lake Formation a partir de trabalhos do EMR Serverless Spark ou sessões interativas em que a função de tempo de execução do trabalho tem acesso total à tabela. Você não precisa habilitar o AWS Lake Formation no aplicativo EMR Serverless. Quando um trabalho do Spark é configurado para Full Table Access (FTA), as credenciais do AWS Lake Formation são usadas para os dados do read/write S3 das tabelas registradas do AWS Lake Formation, enquanto as credenciais da função de tempo de execução do trabalho são usadas para read/write tabelas não registradas no Lake Formation. AWS

Importante

Não ative o AWS Lake Formation para um controle de acesso refinado. Um trabalho não pode executar simultaneamente o Acesso total à tabela (FTA) e o Controle de acesso refinado (FGAC) no mesmo cluster ou aplicação EMR.

Etapa 1: habilitar o acesso total à tabela no Lake Formation

Para usar o modo Full Table Access (FTA), você deve permitir que mecanismos de consulta de terceiros acessem dados sem a validação da tag de sessão do IAM no AWS Lake Formation. Para habilitar, siga as etapas em Application integration for full table access.

nota

Ao acessar tabelas entre contas, o acesso completo à tabela deve ser habilitado nas contas de produtor e consumidor. Da mesma forma, ao acessar tabelas entre regiões, essa configuração deve ser habilitada nas regiões produtora e consumidora.

Etapa 2: configurar permissões do IAM para o perfil de runtime do trabalho

Para acesso de leitura ou gravação aos dados subjacentes, além das permissões do Lake Formation, um perfil de runtime do trabalho precisa da permissão lakeformation:GetDataAccess do IAM. Com essa permissão, o Lake Formation concede a solicitação de credenciais temporárias para acessar os dados.

Confira a seguir um exemplo de política de como fornecer permissões do IAM para acesso a um script no S3, upload de logs no Amazon S3, permissões da API do AWS Glue e permissão para acessar o Lake Formation.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ScriptAccess", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::*.amzn-s3-demo-bucket/scripts" ] }, { "Sid": "LoggingAccess", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/logs/*" ] }, { "Sid": "GlueCatalogAccess", "Effect": "Allow", "Action": [ "glue:Get*", "glue:Create*", "glue:Update*" ], "Resource": [ "*" ] }, { "Sid": "LakeFormationAccess", "Effect": "Allow", "Action": [ "lakeformation:GetDataAccess" ], "Resource": [ "*" ] } ] }

Etapa 2.1: configurar permissões do Lake Formation

  • Os trabalhos Spark que leem dados do S3 necessitam de permissão SELECT do Lake Formation.

  • O Spark faz com que write/delete os dados no S3 exijam a permissão Lake Formation ALL (SUPER).

  • Os trabalhos do Spark que interagem com o Catálogo de dados do Glue exigem as permissões DESCRIBE, ALTER, DROP, conforme apropriado.

Para obter mais informações, consulte Conceder permissões em recursos do Catálogo de dados.

Etapa 3: inicializar uma sessão do Spark para acesso total à tabela usando o Lake Formation

Pré-requisitos

AWS O Glue Data Catalog deve ser configurado como um metastore para acessar as tabelas do Lake Formation.

Defina as seguintes configurações para configurar o catálogo do Glue como umo metastore:

--conf spark.sql.catalogImplementation=hive --conf spark.hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory

Para obter mais informações sobre como habilitar o Catálogo de dados para o EMR Sem Servidor, consulte Configuração do metastore para o EMR Sem Servidor.

Para acessar tabelas registradas no AWS Lake Formation, as seguintes configurações precisam ser definidas durante a inicialização do Spark para configurar o Spark para usar as credenciais do Lake Formation AWS .

Hive
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Iceberg
--conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=S3_DATA_LOCATION --conf spark.sql.catalog.spark_catalog.client.region=REGION --conf spark.sql.catalog.spark_catalog.type=glue --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Delta Lake
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
Hudi
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true --conf spark.jars=/usr/lib/hudi/hudi-spark-bundle.jar --conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog --conf spark.serializer=org.apache.spark.serializer.KryoSerializer
  • spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver: Configure o EMR Filesystem (EMRFS) ou o EMR S3A para usar as credenciais do Lake Formation S3 para tabelas registradas do Lake AWS Formation. Se a tabela não estiver registrada, use as credenciais do perfil de runtime do trabalho.

  • spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true e spark.hadoop.fs.s3.folderObject.autoAction.disabled=true: configure o EMRFS para usar o cabeçalho do tipo de conteúdo application/x-directory em vez do sufixo $folder$ ao criar pastas do S3. Isso é necessário ao ler tabelas do Lake Formation, pois as credenciais do Lake Formation não permitem a leitura de pastas de tabelas com o sufixo $folder$.

  • spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true: configure o Spark para ignorar a validação da ausência do local da tabela antes da criação. Isso é necessário para tabelas registradas do Lake Formation, pois as credenciais do Lake Formation para verificar o local vazio só estão disponíveis após a criação da tabela do Catálogo de dados do Glue. Sem essa configuração, as credenciais do perfil de runtime do trabalho validarão o local da tabela vazia.

  • spark.sql.catalog.createDirectoryAfterTable.enabled=true: configure o Spark para criar a pasta do Amazon S3 após a criação da tabela no metastore do Hive. Isso é necessário para tabelas registradas no Lake Formation, pois as credenciais do Lake Formation para criar a pasta do S3 só ficam disponíveis após a criação da tabela no Catálogo de dados do Glue.

  • spark.sql.catalog.dropDirectoryBeforeTable.enabled=true: configure o Spark para encerrar a pasta do S3 antes da exclusão da tabela no metastore do Hive. Isso é necessário para tabelas registradas do Lake Formation, pois as credenciais do Lake Formation para encerrar a pasta do S3 não estão disponíveis após a exclusão da tabela do Catálogo de dados do Glue.

  • spark.sql.catalog.<catalog>.glue.lakeformation-enabled=true: Configure o catálogo do Iceberg para usar as credenciais do AWS Lake Formation S3 para tabelas registradas do Lake Formation. Se a tabela não estiver registrada, use as credenciais de ambiente padrão.

Configurar o modo de acesso total à tabela no SageMaker Unified Studio

Para acessar as tabelas registradas do Lake Formation a partir de sessões interativas do Spark em JupyterLab notebooks, use o modo de permissão de compatibilidade. Use o comando mágico %%configure para definir sua configuração do Spark. Escolha a configuração com base no seu tipo de tabela:

For Hive tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true } }
For Iceberg tables
%%configure -f { "conf": { "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog", "spark.sql.catalog.spark_catalog.warehouse": "S3_DATA_LOCATION", "spark.sql.catalog.spark_catalog.client.region": "REGION", "spark.sql.catalog.spark_catalog.type": "glue", "spark.sql.catalog.spark_catalog.glue.account-id": "ACCOUNT_ID", "spark.sql.catalog.spark_catalog.glue.lakeformation-enabled": "true", "spark.sql.catalog.dropDirectoryBeforeTable.enabled": "true" } }
For Delta Lake tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true } }
For Hudi tables
%%configure -f { "conf": { "spark.hadoop.fs.s3.credentialsResolverClass": "com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver", "spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject": true, "spark.hadoop.fs.s3.folderObject.autoAction.disabled": true, "spark.sql.catalog.skipLocationValidationOnCreateTable.enabled": true, "spark.sql.catalog.createDirectoryAfterTable.enabled": true, "spark.sql.catalog.dropDirectoryBeforeTable.enabled": true, "spark.jars": "/usr/lib/hudi/hudi-spark-bundle.jar", "spark.sql.extensions": "org.apache.spark.sql.hudi.HoodieSparkSessionExtension", "spark.sql.catalog.spark_catalog": "org.apache.spark.sql.hudi.catalog.HoodieCatalog", "spark.serializer": "org.apache.spark.serializer.KryoSerializer" } }

Substitua os espaços reservados:

  • S3_DATA_LOCATION: caminho do bucket do S3

  • REGION: AWS região (por exemplo, us-east-1)

  • ACCOUNT_ID: ID AWS da sua conta

nota

Você precisa definir essas configurações antes de executar qualquer operação do Spark em seu caderno.

Operações com Suporte

Essas operações usarão as credenciais do AWS Lake Formation para acessar os dados da tabela.

  • CRIAR TABELA

  • ALTER TABLE

  • INSERT INTO

  • INSERT OVERWRITE

  • UPDATE

  • MERGE INTO

  • DELETE FROM

  • ANALYZE TABLE

  • REPAIR TABLE

  • DESCARTAR TABELA

  • Consultas de fontes de dados do Spark

  • Gravações na fonte de dados do Spark

nota

As operações não listadas acima continuarão usando as permissões do IAM para acessar os dados da tabela.

Considerações

  • Se uma tabela do Hive for criada usando um trabalho que não tem acesso total à tabela habilitado e nenhum registro for inserido, as leituras ou gravações subsequentes de um trabalho com acesso total à tabela falharão. Isso ocorre porque o EMR Spark sem acesso total à tabela adiciona o sufixo $folder$ ao nome da pasta da tabela. Para resolver isso, você tem as seguintes opções:

    • Insira pelo menos uma linha na tabela diretamente de um trabalho no qual o FTA não esteja habilitado.

    • Configure o trabalho no qual o FTA não está habilitado para não usar o sufixo $folder$ no nome da pasta no S3. É possível fazer isso definindo a configuração spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true do Spark.

    • Crie uma pasta S3 no local da tabela s3://path/to/table/table_name usando o console do AWS S3 ou a CLI do AWS S3.

  • O acesso total à tabela é compatível com o sistema de arquivos do EMR (EMRFS) a partir da versão 7.8.0 do Amazon EMR e com o sistema de arquivos S3A a partir da versão 7.10.0 do Amazon EMR.

  • O Full Table Access é compatível com as tabelas Hive, Iceberg, Delta e Hudi.

  • Considerações sobre o Hudi FTA Write Support:

    • As gravações do Hudi FTA exigem o uso HoodieCredentialedHadoopStorage para venda de credenciais durante a execução do trabalho. Defina a seguinte configuração ao executar trabalhos do Hudi: hoodie.storage.class=org.apache.spark.sql.hudi.storage.HoodieCredentialedHadoopStorage

    • O suporte de gravação do Full Table Access (FTA) para Hudi está disponível a partir da versão 7.12 do Amazon EMR.

    • Atualmente, o suporte de gravação do Hudi FTA funciona apenas com as configurações padrão do Hudi. As configurações Hudi personalizadas ou não padrão podem não ser totalmente compatíveis e podem resultar em um comportamento inesperado.

    • O agrupamento para tabelas Hudi Merge-On-Read (MOR) não é suportado neste momento no modo de gravação FTA.

  • Os trabalhos que mencionam tabelas com regras de controle de acesso de alta granularidade (FGAC) do Lake Formation ou visualizações do catálogo de dados do Glue falharão. Para consultar uma tabela com regras de FGAC ou uma visualização do Catálogo de dados do Glue, você precisará usar o modo FGAC. Você pode ativar o modo FGAC seguindo as etapas descritas na AWS documentação: Usando o EMR Serverless com o Lake AWS Formation para um controle de acesso refinado.

  • O acesso total à tabela não é compatível com Spark Streaming.

  • Ao gravar o Spark DataFrame em uma tabela do Lake Formation, somente o modo APPEND é compatível com as tabelas Hive e Iceberg: df.write.mode("append").saveAsTable(table_name)

  • A criação de tabelas externas requer permissões do IAM.

  • Como o Lake Formation armazena temporariamente as credenciais em um trabalho Spark, um trabalho em lote do Spark ou uma sessão interativa em execução no momento pode não refletir as alterações de permissão.

  • Você deve usar um perfil definido pelo usuário e não um perfil vinculado ao serviço:Requisitos do Lake Formation para perfis.

Hudi FTA Write Support - Operações suportadas

A tabela a seguir mostra as operações de gravação suportadas para tabelas Hudi Copy-On-Write (COW) e Merge-On-Read (MOR) no modo Full Table Access:

Operações de gravação suportadas pelo Hudi FTA
Tipo de tabela Operation Comando SQL Write Status
VACA INSERT INSERT INTO TABLE Compatível
VACA INSERT INSERIR NA TABELA - PARTIÇÃO (estática, dinâmica) Compatível
VACA INSERT INSERT OVERWRITE Compatível
VACA INSERT INSERIR SUBSTITUIÇÃO - PARTIÇÃO (estática, dinâmica) Compatível
UPDATE UPDATE UPDATE TABLE Compatível
VACA UPDATE TABELA DE ATUALIZAÇÃO - Alterar partição Não suportado
DELETE DELETE DELETE FROM TABLE Compatível
ALTER ALTER ALTERAR TABELA - RENOMEAR PARA Não suportado
VACA ALTER ALTERE A TABELA - DEFINA AS PROPRIEDADES DA TABELA Compatível
VACA ALTER ALTERAR TABELA - DESDEFINIR TBLPROPERTIES Compatível
VACA ALTER ALTERAR TABELA - ALTERAR COLUNA Compatível
VACA ALTER ALTERAR TABELA - ADICIONAR COLUNAS Compatível
VACA ALTER ALTERAR TABELA - ADICIONAR PARTIÇÃO Compatível
VACA ALTER ALTERAR TABELA - SOLTAR PARTIÇÃO Compatível
VACA ALTER ALTERAR TABELA - RECUPERAR PARTIÇÕES Compatível
VACA ALTER REPARAR PARTIÇÕES DE SINCRONIZAÇÃO DE TABELAS Compatível
DROP DROP DESCARTAR TABELA Compatível
VACA DROP TABELA SUSPENSA - PURGA Compatível
CREATE CREATE CRIAR TABELA - Gerenciado Compatível
VACA CREATE CRIAR TABELA - PARTICIONAR POR Compatível
VACA CREATE CRIAR TABELA SE NÃO EXISTIR Compatível
VACA CREATE CREATE TABLE LIKE Compatível
VACA CREATE CRIAR TABELA COMO SELEÇÃO Compatível
CREATE CREATE CRIAR TABELA com LOCALIZAÇÃO - Tabela externa Não suportado
QUADRO DE DADOS (INSERIR) QUADRO DE DADOS (INSERIR) saveAsTable.Sobrescrever Compatível
VACA QUADRO DE DADOS (INSERIR) saveAsTable.Anexar Não suportado
VACA QUADRO DE DADOS (INSERIR) saveAsTable.Ignorar Compatível
VACA QUADRO DE DADOS (INSERIR) saveAsTable.ErrorIfExists Compatível
VACA QUADRO DE DADOS (INSERIR) saveAsTable - Tabela externa (Caminho) Não suportado
VACA QUADRO DE DADOS (INSERIR) salvar (caminho) - DF v1 Não suportado
MAIS INSERT INSERT INTO TABLE Compatível
MAIS INSERT INSERIR NA TABELA - PARTIÇÃO (estática, dinâmica) Compatível
MAIS INSERT INSERT OVERWRITE Compatível
MAIS INSERT INSERIR SUBSTITUIÇÃO - PARTIÇÃO (estática, dinâmica) Compatível
UPDATE UPDATE UPDATE TABLE Compatível
MAIS UPDATE TABELA DE ATUALIZAÇÃO - Alterar partição Não suportado
DELETE DELETE DELETE FROM TABLE Compatível
ALTER ALTER ALTERAR TABELA - RENOMEAR PARA Não suportado
MAIS ALTER ALTERE A TABELA - DEFINA AS PROPRIEDADES DA TABELA Compatível
MAIS ALTER ALTERAR TABELA - DESDEFINIR TBLPROPERTIES Compatível
MAIS ALTER ALTERAR TABELA - ALTERAR COLUNA Compatível
MAIS ALTER ALTERAR TABELA - ADICIONAR COLUNAS Compatível
MAIS ALTER ALTERAR TABELA - ADICIONAR PARTIÇÃO Compatível
MAIS ALTER ALTERAR TABELA - SOLTAR PARTIÇÃO Compatível
MAIS ALTER ALTERAR TABELA - RECUPERAR PARTIÇÕES Compatível
MAIS ALTER REPARAR PARTIÇÕES DE SINCRONIZAÇÃO DE TABELAS Compatível
DROP DROP DESCARTAR TABELA Compatível
MAIS DROP TABELA SUSPENSA - PURGA Compatível
CREATE CREATE CRIAR TABELA - Gerenciado Compatível
MAIS CREATE CRIAR TABELA - PARTICIONAR POR Compatível
MAIS CREATE CRIAR TABELA SE NÃO EXISTIR Compatível
MAIS CREATE CREATE TABLE LIKE Compatível
MAIS CREATE CRIAR TABELA COMO SELEÇÃO Compatível
CREATE CREATE CRIAR TABELA com LOCALIZAÇÃO - Tabela externa Não suportado
QUADRO DE DADOS (UPSERT) QUADRO DE DADOS (UPSERT) saveAsTable.Sobrescrever Compatível
MAIS QUADRO DE DADOS (UPSERT) saveAsTable.Anexar Não suportado
MAIS QUADRO DE DADOS (UPSERT) saveAsTable.Ignorar Compatível
MAIS QUADRO DE DADOS (UPSERT) saveAsTable.ErrorIfExists Compatível
MAIS QUADRO DE DADOS (UPSERT) saveAsTable - Tabela externa (Caminho) Não suportado
MAIS QUADRO DE DADOS (UPSERT) salvar (caminho) - DF v1 Não suportado
DATAFRAME (EXCLUIR) DATAFRAME (EXCLUIR) saveAsTable.Anexar Não suportado
MAIS DATAFRAME (EXCLUIR) saveAsTable - Tabela externa (Caminho) Não suportado
MAIS DATAFRAME (EXCLUIR) salvar (caminho) - DF v1 Não suportado
QUADRO DE DADOS (BULK_INSERT) QUADRO DE DADOS (BULK_INSERT) saveAsTable.Sobrescrever Compatível
MAIS QUADRO DE DADOS (BULK_INSERT) saveAsTable.Anexar Não suportado
MAIS QUADRO DE DADOS (BULK_INSERT) saveAsTable.Ignorar Compatível
MAIS QUADRO DE DADOS (BULK_INSERT) saveAsTable.ErrorIfExists Compatível
MAIS QUADRO DE DADOS (BULK_INSERT) saveAsTable - Tabela externa (Caminho) Não suportado
MAIS QUADRO DE DADOS (BULK_INSERT) salvar (caminho) - DF v1 Não suportado