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á.
Crie pipelines de ETL usando AWS Glue
As equipes de engenharia de dados geralmente têm dados brutos chegando em um volume FSx for ONTAP de aplicativos, descartes diários de arquivos ou integrações de parceiros via NFS ou SMB. Preparar esses dados para análises posteriores exige lê-los, transformá-los, enriquecê-los ou reparticioná-los em grande escala e disponibilizar a saída selecionada para analistas e aplicativos.
Com um ponto de acesso Amazon S3 conectado ao volume FSx for ONTAP, AWS Glue lê os dados de origem, os transforma com sua escolha de tempo de execução (Apache Spark, Python shell ou Ray) e grava a saída selecionada de volta no mesmo volume. Tanto os conjuntos de dados brutos quanto os selecionados permanecem no FSx for ONTAP, portanto, as políticas de snapshot, backup e retenção do volume se aplicam uniformemente em todo o pipeline. Como um volume FSx for ONTAP pode ser acessado simultaneamente por NFS, SMB e pela API do Amazon S3, os dados brutos podem ser produzidos por clientes NFS ou SMB e a saída selecionada pode ser consumida por qualquer um desses protocolos.
Neste tutorial, você usa o conjunto de dados de viagem de táxi de Nova York do Consulte arquivos com SQL usando o Amazon Athena tutorial. Uma tarefa de AWS Glue ETL lê os dados brutos do Parquet, adiciona colunas computadas, filtra registros inválidos e grava a saída transformada de volta no volume particionado por hora do dia.
nota
Este tutorial leva aproximadamente 25 a 35 minutos para ser concluído. Os Serviços da AWS usados incorrem em cobranças pelos recursos que você cria. Se você concluir todas as etapas, incluindo a seção Limpeza imediatamente, o custo esperado é inferior a $1 no Leste dos EUA (Norte da Virgínia) Região da AWS. Essa estimativa não inclui cobranças contínuas do FSx para o volume do ONTAP em si.
Pré-requisitos
Antes de começar, você deve ter o seguinte:
Conclua as etapas 1 a 3 do Consulte arquivos com SQL usando o Amazon Athena tutorial. Esse procedimento carrega o conjunto de dados do NYC Taxi para o ponto de acesso, cria o
fsxn_taxi_demobanco de dados no e registra a AWS Glue Data Catalog tabela.taxi_dataEste tutorial se baseia nesses recursos, portanto, não execute a seção Limpeza do tutorial do Athena até terminar este tutorial.Uma função do IAM AWS Glue com uma política embutida que concede acesso de gravação aos CloudWatch registros, read/write acesso ao ponto de acesso e acesso ao AWS Glue Data Catalog banco de dados usado neste tutorial. As etapas a seguir criam uma função com as permissões mínimas necessárias para este tutorial.
Salve a seguinte política de confiança como
glue-trust-policy.json. Isso permite AWS Glue assumir o papel.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "glue.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }Salve a seguinte política de permissões como
glue-permissions.json. Substituaregion,, eaccount-idpor seus valores.access-point-name{ "Version": "2012-10-17", "Statement": [ { "Sid": "Logs", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:region:account-id:log-group:/aws-glue/*" }, { "Sid": "AccessPoint", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:region:account-id:accesspoint/access-point-name", "arn:aws:s3:region:account-id:accesspoint/access-point-name/object/*" ] }, { "Sid": "DataCatalog", "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:GetTable", "glue:GetTables", "glue:CreateTable", "glue:UpdateTable", "glue:DeleteTable", "glue:BatchCreatePartition", "glue:BatchDeletePartition", "glue:CreatePartition", "glue:UpdatePartition", "glue:GetPartition", "glue:GetPartitions" ], "Resource": [ "arn:aws:glue:region:account-id:catalog", "arn:aws:glue:region:account-id:database/fsxn_taxi_demo", "arn:aws:glue:region:account-id:table/fsxn_taxi_demo/*" ] } ] }Crie a função e anexe a política em linha.
$aws iam create-role \ --role-namefsxn-tutorial-glue-etl-role\ --assume-role-policy-document file://glue-trust-policy.json aws iam put-role-policy \ --role-namefsxn-tutorial-glue-etl-role\ --policy-name glue-fsxn-access \ --policy-document file://glue-permissions.json
Este tutorial armazena o script ETL no próprio ponto de acesso, portanto, nenhum bucket separado do Amazon S3 é necessário. A
AccessPointinstrução abrange tanto o script quanto os dados do táxi; aDataCataloginstrução define o escopo do acesso ao AWS Glue catálogo aofsxn_taxi_demobanco de dados que o rastreador atualiza na Etapa 4.
Importante
O ponto de acesso do Amazon S3 deve usar uma origem de rede na Internet. AWS Glue os trabalhos acessam o Amazon S3 a partir da infraestrutura gerenciada, não da sua VPC.
Etapa 1: criar o script ETL
O PySpark script a seguir lê os dados brutos da viagem de táxi do seu volume FSx for ONTAP, aplica transformações e grava os resultados de volta no volume. Salve esse script comotaxi_transform.py.
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from pyspark.sql.functions import col, hour, dayofweek, when, round as spark_round args = getResolvedOptions(sys.argv, ['JOB_NAME', 'AP_ALIAS']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) ap_alias = args['AP_ALIAS'] # Read raw taxi data from FSx through the access point df = spark.read.parquet(f"s3://{ap_alias}/taxi-data/") # Transform: filter invalid records, add computed columns transformed = df \ .filter(col("trip_distance") > 0) \ .filter(col("total_amount") > 0) \ .filter(col("passenger_count") > 0) \ .withColumn("pickup_hour", hour(col("tpep_pickup_datetime"))) \ .withColumn("pickup_day_of_week", dayofweek(col("tpep_pickup_datetime"))) \ .withColumn("cost_per_mile", spark_round(col("total_amount") / col("trip_distance"), 2)) \ .withColumn("time_of_day", when(hour(col("tpep_pickup_datetime")).between(6, 11), "morning") .when(hour(col("tpep_pickup_datetime")).between(12, 16), "afternoon") .when(hour(col("tpep_pickup_datetime")).between(17, 21), "evening") .otherwise("night") ) \ .select( "tpep_pickup_datetime", "tpep_dropoff_datetime", "passenger_count", "trip_distance", "PULocationID", "DOLocationID", "fare_amount", "tip_amount", "total_amount", "pickup_hour", "pickup_day_of_week", "cost_per_mile", "time_of_day" ) # Write transformed data back to FSx, partitioned by time of day transformed.write \ .mode("overwrite") \ .partitionBy("time_of_day") \ .parquet(f"s3://{ap_alias}/taxi-data-transformed/") job.commit()
O script executa as seguintes transformações:
Filtra registros com distância de viagem, tarifa ou contagem de passageiros zero ou negativa.
Adiciona colunas computadas:
pickup_hourpickup_day_of_week,cost_per_mile,, etime_of_day(manhã, tarde, tarde ou noite).Seleciona um subconjunto de colunas relevantes para análise.
Particiona a saída por
time_of_day, o que melhora o desempenho da consulta ao filtrar por período de tempo.
Etapa 2: Carregar o script e criar o trabalho
Carregue o script ETL em seu volume FSx for ONTAP por meio do ponto de acesso e crie AWS Glue um trabalho que faça referência a ele. AWS Glue carrega o script do ponto de acesso na inicialização do trabalho, da mesma forma que carrega scripts de um bucket padrão do Amazon S3.
$# Upload the script to the access point aws s3 cp taxi_transform.py \ s3://my-ap-alias-ext-s3alias/glue-scripts/taxi_transform.py # Create the Glue job aws glue create-job \ --namefsxn-taxi-transform\ --rolemy-glue-role-arn\ --command '{ "Name": "glueetl", "ScriptLocation": "s3://my-ap-alias-ext-s3alias/glue-scripts/taxi_transform.py", "PythonVersion": "3" }' \ --default-arguments '{ "--AP_ALIAS": "my-ap-alias-ext-s3alias", "--job-language": "python" }' \ --glue-version "4.0" \ --number-of-workers 2 \ --worker-type "G.1X"
Etapa 3: Executar o trabalho
$aws glue start-job-run --job-namefsxn-taxi-transform
Monitore o status do trabalho. O trabalho normalmente é concluído em um a dois minutos com dois G.1X trabalhadores.
$aws glue get-job-runs --job-namefsxn-taxi-transform\ --query "JobRuns[0].{State:JobRunState,Duration:ExecutionTime,Error:ErrorMessage}"
Quando o trabalho for concluído, verifique a saída transformada em seu FSx para o volume ONTAP.
$aws s3 ls s3://my-ap-alias-ext-s3alias/taxi-data-transformed/PRE time_of_day=afternoon/ PRE time_of_day=evening/ PRE time_of_day=morning/ PRE time_of_day=night/
A saída é particionada em quatro diretórios por hora do dia. Cada partição contém arquivos Parquet com os dados transformados.
Etapa 4: consultar os dados transformados
Execute um AWS Glue rastreador na saída transformada para registrá-la no e, em seguida AWS Glue Data Catalog, consulte-a com o Athena.
$# Create a crawler for the transformed data aws glue create-crawler \ --namefsxn-taxi-transformed-crawler\ --rolemy-glue-role-arn\ --database-namefsxn_taxi_demo\ --targets '{"S3Targets": [{"Path": "s3://my-ap-alias-ext-s3alias/taxi-data-transformed/"}]}' # Run the crawler aws glue start-crawler --namefsxn-taxi-transformed-crawler
Depois que o rastreador for concluído, consulte os dados transformados no Athena. A estrutura particionada permite que o Athena digitalize somente as partições relevantes.
-- Average cost per mile by time of day SELECT time_of_day, COUNT(*) AS trip_count, ROUND(AVG(cost_per_mile), 2) AS avg_cost_per_mile, ROUND(AVG(tip_amount), 2) AS avg_tip FROM fsxn_taxi_demo.taxi_data_transformed GROUP BY time_of_day ORDER BY trip_count DESC
-- Busiest pickup locations during morning rush SELECT PULocationID AS pickup_location, COUNT(*) AS trip_count, ROUND(AVG(trip_distance), 2) AS avg_distance FROM fsxn_taxi_demo.taxi_data_transformed WHERE time_of_day = 'morning' GROUP BY PULocationID ORDER BY trip_count DESC LIMIT 10
Como os dados são particionados portime_of_day, a segunda consulta verifica somente a morning partição, reduzindo a quantidade de dados lidos e melhorando o desempenho da consulta.
Considerações
É necessária uma origem na Internet. AWS Glue os trabalhos acessam o Amazon S3 a partir de uma infraestrutura gerenciada fora da sua VPC. Você deve usar um ponto de acesso de origem na Internet.
Leia e escreva. AWS Glue As tarefas de ETL podem ler e gravar em seu volume FSx for ONTAP por meio do ponto de acesso. A política do ponto de acesso e o usuário do sistema de arquivos devem permitir tanto
s3:GetObjects3:PutObjecte.Dimensionamento do trabalhador. O número e o tipo de AWS Glue trabalhadores afetam o desempenho e o custo do trabalho. Para o conjunto de dados de amostra de 48 MB, dois G.1X trabalhadores são suficientes. Para conjuntos de dados maiores, aumente o número de trabalhadores ou use G.2X trabalhadores.
Particionamento. A gravação de saída particionada melhora o desempenho da consulta downstream no Athena e em outros serviços de análise. Escolha as chaves de partição com base na forma como os dados são normalmente consultados.
Armazenamento de scripts. AWS Glue carrega scripts ETL do Amazon S3 na inicialização do trabalho. Este tutorial armazena o script no ponto de acesso para que ele fique junto com os dados, mas você também pode hospedá-lo em um bucket padrão do Amazon S3. Se você usar um bucket autônomo, estenda a política embutida da função com o
s3:GetObjectARN do bucket de scripts.
Limpeza
Para evitar cobranças contínuas, exclua os recursos que você criou neste tutorial.
No editor de consultas do Athena, solte a tabela criada pelo rastreador:
DROP TABLE IF EXISTS fsxn_taxi_demo.taxi_data_transformed;
$# Delete the Glue job and crawler aws glue delete-job --namefsxn-taxi-transformaws glue delete-crawler --namefsxn-taxi-transformed-crawler# Delete the ETL script and transformed data from the access point aws s3 rm s3://my-ap-alias-ext-s3alias/glue-scripts/taxi_transform.py aws s3 rm s3://my-ap-alias-ext-s3alias/taxi-data-transformed/ --recursive # Delete the IAM role aws iam delete-role-policy \ --role-namefsxn-tutorial-glue-etl-role\ --policy-name glue-fsxn-access aws iam delete-role --role-namefsxn-tutorial-glue-etl-role