Executar trabalhos de ETL em tabelas do Amazon S3 com o AWS Glue
O AWS Glue é um serviço de integração de dados com tecnologia sem servidor que facilita aos usuários de analytics a descoberta, preparação, transferência e integração de dados de várias fontes. Você pode usar os trabalhos do AWS Glue para executar pipelines de extração, transformação e carregamento (ETL) a fim de carregar dados em data lakes. Para obter mais informações sobre o AWS Glue, consulte O que é o AWS Glue? no Guia do desenvolvedor do AWS Glue.
Um trabalho do AWS Glue encapsula um script que se conecta aos dados de origem, os processa e, depois, os grava no destino de dados. Normalmente, um trabalho executa scripts de extração, transformação e carga (ETL). Os trabalhos podem executar scripts projetados para os ambientes de runtime do Apache Spark. É possível monitorar trabalhos para entender as métricas do runtime, status de conclusão, duração e hora de início.
Você pode usar trabalhos do AWS Glue para processar dados em nas tabelas do S3 conectando-se às suas tabelas por meio da integração com serviços de analytics da AWS ou conectando-se diretamente por meio do endpoint Iceberg REST da funcionalidade Tabelas do Amazon S3 ou do Catálogo de Tabelas do Amazon S3 para Apache Iceberg. Este guia aborda as etapas básicas para começar a usar o AWS Glue com a funcionalidade Tabelas do S3, incluindo:
Pré-requisitos
Para poder consultar tabelas por meio de um trabalho do AWS Glue, é necessário configurar um perfil do IAM que o AWS Glue possa usar para executar o trabalho e fazer upload do JAR do Catálogo de Tabelas do Amazon S3 para Apache Iceberg em um bucket do S3 que o AWS Glue possa acessar ao executar o trabalho.
-
Integre os buckets de tabela aos serviços de analytics da AWS.
-
Crie um perfil do IAM para o AWS Glue.
-
(Opcional) Se você estiver usando o Catálogo de Tabelas do Amazon S3 para Apache Iceberg, precisará baixar o JAR do catálogo de cliente e carregá-lo em um bucket do S3.
Baixar o JAR do catálogo
-
Verifique a versão mais recente no Maven Central. Você pode fazer download do JAR pelo Maven Central usando um navegador ou o comando a seguir. Substitua o número da versão
pela versão mais recente.
wget https://repo1.maven.org/maven2/software/amazon/s3tables/s3-tables-catalog-for-iceberg-runtime/0.1.5
/s3-tables-catalog-for-iceberg-runtime-0.1.5.jar
-
Faça upload do JAR baixado para um bucket do S3 que o perfil do IAM do AWS Glue possa acessar. Você pode usar o comando da AWS CLI a seguir para fazer upload do JAR. Substitua o número da versão
pela versão mais recente e o nome do bucket
e o caminho
por suas próprias informações.
aws s3 cp s3-tables-catalog-for-iceberg-runtime-0.1.5
.jar s3://amzn-s3-demo-bucket
/jars/
Criar um script para se conectar aos buckets de tabela
Para acessar os dados da tabela ao executar um trabalho de ETL do AWS Glue, configure uma sessão do Spark para o Apache Iceberg que estabeleça conexão com o bucket de tabela do S3. Você pode modificar um script existente para se conectar ao bucket de tabela ou criar um script. Para ter mais informações sobre como criar scripts do AWS Glue, consulte Tutorial: gravar um script do AWS Glue para Spark no Guia do desenvolvedor do AWS Glue.
Também é possível configurar a sessão para se conectar aos buckets de tabela por meio de qualquer um dos seguintes métodos de acesso à funcionalidade Tabelas do S3:
-
Integração da funcionalidade Tabelas do S3 com serviços de analytics da AWS
-
Endpoint Iceberg REST da funcionalidade Tabelas do Amazon S3
-
Catálogo de Tabelas do Amazon S3 para Apache Iceberg
Escolha um dos métodos de acesso a seguir para ver instruções de configuração e exemplos de configuração.
- AWS analytics services integration
-
Um dos pré-requisitos para consultar tabelas com o Spark no AWS Glue usando a integração de serviços de analytics da AWS é integrar os buckets de tabela a serviços de analytics da AWS
Você pode configurar a conexão com seu bucket de tabela por meio de uma sessão do Spark em um trabalho ou com mágicas do AWS Glue Studio em uma sessão interativa. Para usar os exemplos a seguir, substitua os valores de espaço reservado
pelas informações do seu bucket de tabela.
- Usar um script do PySpark
-
Use o trecho de código a seguir em um script do PySpark para configurar um trabalho do AWS Glue e se conectar ao seu bucket de tabela usando a integração.
spark = SparkSession.builder.appName("SparkIcebergSQL") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog","s3tables") \
.config("spark.sql.catalog.s3tables", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tables.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config("spark.sql.catalog.s3tables.glue.id", "111122223333
:s3tablescatalog/amzn-s3-demo-table-bucket
") \
.config("spark.sql.catalog.s3tables.warehouse", "s3://amzn-s3-demo-table-bucket
/warehouse/") \
.getOrCreate()
- Usar de uma sessão interativa do AWS Glue
-
Se você estiver usando uma sessão interativa de caderno com o AWS Glue 5.0, especifique as mesmas configurações usando a mágica do %%configure
em uma célula antes da execução do código.
%%configure
{"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3tables --conf spark.sql.catalog.s3tables=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3tables.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.s3tables.glue.id=111122223333
:s3tablescatalog/amzn-s3-demo-table-bucket
--conf spark.sql.catalog.s3tables.warehouse=s3://amzn-s3-demo-table-bucket
/warehouse/"}
- Amazon S3 Tables REST do Iceberg endpoint
-
Você pode configurar a conexão com seu bucket de tabela por meio de uma sessão do Spark em um trabalho ou com mágicas do AWS Glue Studio em uma sessão interativa. Para usar os exemplos a seguir, substitua os valores de espaço reservado
pelas informações do seu bucket de tabela.
- Usar um script do PySpark
Use o trecho de código a seguir em um script do PySpark para configurar um trabalho do AWS Glue e se conectar ao seu bucket de tabela usando o endpoint.
spark = SparkSession.builder.appName("glue-s3-tables-rest") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3_rest_catalog") \
.config("spark.sql.catalog.s3_rest_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3_rest_catalog.type", "rest") \
.config("spark.sql.catalog.s3_rest_catalog.uri", "https://s3tables.Region
.amazonaws.com/iceberg") \
.config("spark.sql.catalog.s3_rest_catalog.warehouse", "arn:aws:s3tables:Region
:111122223333
:s3tablescatalog/amzn-s3-demo-table-bucket
") \
.config("spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled", "true") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-name", "s3tables") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-region", "Region
") \
.config('spark.sql.catalog.s3_rest_catalog.io-impl','org.apache.iceberg.aws.s3.S3FileIO') \
.config('spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled','false') \
.getOrCreate()
- Usar de uma sessão interativa do AWS Glue
Se você estiver usando uma sessão interativa de caderno com o AWS Glue 5.0, especifique as mesmas configurações usando a mágica do %%configure
em uma célula antes da execução do código. Substitua os valores de espaços reservados pelas informações do seu próprio bucket de tabela.
%%configure
{"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3_rest_catalog --conf spark.sql.catalog.s3_rest_catalog=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3_rest_catalog.type=rest --conf spark.sql.catalog.s3_rest_catalog.uri=https://s3tables.Region
.amazonaws.com/iceberg --conf spark.sql.catalog.s3_rest_catalog.warehouse=arn:aws:s3tables:Region
:111122223333
:s3tablescatalog/amzn-s3-demo-table-bucket
--conf spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled=true --conf spark.sql.catalog.s3_rest_catalog.rest.signing-name=s3tables --conf spark.sql.catalog.s3_rest_catalog.rest.signing-region=Region
--conf spark.sql.catalog.s3_rest_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled=false"}
- Amazon S3 Tables Catalog for Apache Iceberg
-
Um pré-requisito para se conectar a tabelas usando o Catálogo de Tabelas do Amazon S3 para Apache Iceberg é primeiro baixar o JAR do catálogo mais recente e carregá-lo em um bucket do S3. Em seguida, ao criar seu trabalho, adicione o caminho para o JAR do catálogo de cliente como um parâmetro especial. Para ter mais informações sobre parâmetros de trabalho no AWS Glue, consulte Special parameters used in AWS Glue jobs no Guia do desenvolvedor do AWS Glue.
Você pode configurar a conexão com seu bucket de tabela por meio de uma sessão do Spark em um trabalho ou com mágicas do AWS Glue Studio em uma sessão interativa. Para usar os exemplos a seguir, substitua os valores de espaço reservado
pelas informações do seu bucket de tabela.
- Usar um script do PySpark
-
Use o trecho de código a seguir em um script do PySpark para configurar um trabalho do AWS Glue e se conectar ao seu bucket de tabela usando o JAR. Substitua os valores de espaços reservados pelas informações do seu próprio bucket de tabela.
spark = SparkSession.builder.appName("glue-s3-tables") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3tablesbucket") \
.config("spark.sql.catalog.s3tablesbucket", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tablesbucket.catalog-impl", "software.amazon.s3tables.iceberg.S3TablesCatalog") \
.config("spark.sql.catalog.s3tablesbucket.warehouse", "arn:aws:s3tables:Region
:111122223333:bucket/amzn-s3-demo-table-bucket
") \
.getOrCreate()
- Usar de uma sessão interativa do AWS Glue
-
Se você estiver usando uma sessão interativa de caderno com o AWS Glue 5.0, especifique as mesmas configurações usando a mágica do %%configure
em uma célula antes da execução do código. Substitua os valores de espaços reservados pelas informações do seu próprio bucket de tabela.
%%configure
{"conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.defaultCatalog=s3tablesbucket --conf spark.sql.catalog.s3tablesbucket=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.s3tablesbucket.catalog-impl=software.amazon.s3tables.iceberg.S3TablesCatalog --conf spark.sql.catalog.s3tablesbucket.warehouse=arn:aws:s3tables:Region
:111122223333:bucket/amzn-s3-demo-table-bucket
", "extra-jars": "s3://amzn-s3-demo-bucket
/jars/s3-tables-catalog-for-iceberg-runtime-0.1.5
.jar"}
Scripts de amostra
Os scripts de exemplo do PySpark a seguir podem usados para testar a consulta de tabelas do S3 com um trabalho do AWS Glue. Esses scripts se conectam ao bucket de tabela e executam consultas para: criar um namespace, criar uma tabela de exemplo, inserir dados na tabela e retornar os dados da tabela. Para usar os script, substitua os valores de espaço reservado
pelas informações do seu próprio bucket de tabela.
Escolha entre os scripts a seguir com base no seu método de acesso à funcionalidade Tabelas do S3.
- S3 Tables integration with AWS analytics services
-
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("SparkIcebergSQL") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog","s3tables")
.config("spark.sql.catalog.s3tables", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tables.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config("spark.sql.catalog.s3tables.glue.id", "111122223333
:s3tablescatalog/amzn-s3-demo-table-bucket
") \
.config("spark.sql.catalog.s3tables.warehouse", "s3://amzn-s3-demo-table-bucket
/bucket/amzn-s3-demo-table-bucket
") \
.getOrCreate()
namespace = "new_namespace
"
table = "new_table
"
spark.sql("SHOW DATABASES").show()
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
- Amazon S3 Tables REST do Iceberg endpoint
-
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("glue-s3-tables-rest") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3_rest_catalog") \
.config("spark.sql.catalog.s3_rest_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3_rest_catalog.type", "rest") \
.config("spark.sql.catalog.s3_rest_catalog.uri", "https://s3tables.Region
.amazonaws.com/iceberg") \
.config("spark.sql.catalog.s3_rest_catalog.warehouse", "arn:aws:s3tables:Region
:111122223333
:bucket/amzn-s3-demo-table-bucket
") \
.config("spark.sql.catalog.s3_rest_catalog.rest.sigv4-enabled", "true") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-name", "s3tables") \
.config("spark.sql.catalog.s3_rest_catalog.rest.signing-region", "Region
") \
.config('spark.sql.catalog.s3_rest_catalog.io-impl','org.apache.iceberg.aws.s3.S3FileIO') \
.config('spark.sql.catalog.s3_rest_catalog.rest-metrics-reporting-enabled','false') \
.getOrCreate()
namespace = "s3_tables_rest_namespace
"
table = "new_table_s3_rest
"
spark.sql("SHOW DATABASES").show()
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
- Amazon S3 Tables Catalog for Apache Iceberg
-
from pyspark.sql import SparkSession
#Spark session configurations
spark = SparkSession.builder.appName("glue-s3-tables") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.sql.defaultCatalog", "s3tablesbucket") \
.config("spark.sql.catalog.s3tablesbucket", "org.apache.iceberg.spark.SparkCatalog") \
.config("spark.sql.catalog.s3tablesbucket.catalog-impl", "software.amazon.s3tables.iceberg.S3TablesCatalog") \
.config("spark.sql.catalog.s3tablesbucket.warehouse", "arn:aws:s3tables:Region
:111122223333
:bucket/amzn-s3-demo-table-bucket
") \
.getOrCreate()
#Script
namespace = "new_namespace
"
table = "new_table
"
spark.sql(f"CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.{namespace}")
spark.sql(f"DESCRIBE NAMESPACE {namespace}").show()
spark.sql(f"""
CREATE TABLE IF NOT EXISTS {namespace}.{table} (
id INT,
name STRING,
value INT
)
""")
spark.sql(f"""
INSERT INTO {namespace}.{table}
VALUES
(1, 'ABC', 100),
(2, 'XYZ', 200)
""")
spark.sql(f"SELECT * FROM {namespace}.{table} LIMIT 10").show()
Criar um trabalho do AWS Glue que consulte tabelas
Os procedimentos a seguir mostram como configurar trabalhos do AWS Glue que se conectam aos buckets de tabela do S3. Você pode fazer isso usando a AWS CLI ou usando o console com o editor de script do AWS Glue Studio. Para ter mais informações, consulte Criar trabalhos no AWS Glue no Guia do usuário do AWS Glue.
O procedimento a seguir mostra como usar o editor de scripts do AWS Glue Studio para criar um trabalho de ETL que consulta as tabelas do S3.
Abra o console do AWS Glue em https://console.aws.amazon.com/glue/.
-
No painel de navegação, escolha Trabalhos de ETL.
-
Escolha Editor de scripts, depois selecione Fazer upload de script e faça upload do script PySpark que você criou para consultar tabelas do S3.
-
Selecione a guia Detalhes do trabalho e insira as informações a seguir em Propriedades básicas.
-
Em Nome, insira um nome para o trabalho.
-
Em Perfil do IAM, selecione o perfil que você criou para o AWS Glue.
-
(Opcional) Se estiver usando o Catálogo de Tabelas do Amazon S3 para o método de acesso Apache Iceberg, expanda Propriedades avançadas e, em Caminho de JARs dependentes, insira o URI do S3 do JAR do catalogo de cliente client catalog jar que você carregou em um bucket do S3 como pré-requisito. Por exemplo, s3://amzn-s3-demo-bucket1
/jars
/s3-tables-catalog-for-iceberg-runtime-0.1.5
.jar
-
Selecione Salvar para criar o trabalho.
-
Escolha Executar para iniciar o trabalho e revise o status do trabalho na guia Execuções.
O procedimento a seguir mostra como usar a AWS CLI para criar um trabalho de ETL que consulta as tabelas do S3. Para usar os comandos, substitua os valores de espaços reservados
por suas próprias informações.
-
Crie um trabalho do AWS Glue.
aws glue create-job \
--name etl-tables-job
\
--role arn:aws:iam::111122223333
:role/AWSGlueServiceRole
\
--command '{
"Name": "glueetl",
"ScriptLocation": "s3://amzn-s3-demo-bucket1
/scripts/glue-etl-query.py
",
"PythonVersion": "3"
}' \
--default-arguments '{
"--job-language": "python",
"--class": "GlueApp"
}' \
--glue-version "5.0"
(Opcional) Se você estiver usando o Catálogo de Tabelas do Amazon S3 para o método de acesso Apache Iceberg, adicione o JAR do catálogo de cliente a --default-arguments
usando o parâmetro --extra-jars
. Substitua os espaços reservados de entrada
por suas próprias informações ao adicionar o parâmetro.
"--extra-jars": "s3://amzn-s3-demo-bucket
/jar-path
/s3-tables-catalog-for-iceberg-runtime-0.1.5
.jar"
-
Inicie o trabalho.
aws glue start-job-run \
--job-name etl-tables-job
-
Para revisar o status do trabalho, copie o ID de execução do comando anterior e insira-o no comando a seguir.
aws glue get-job-run --job-name etl-tables-job
\
--run-id jr_ec9a8a302e71f8483060f87b6c309601ea9ee9c1ffc2db56706dfcceb3d0e1ad