Genera dati di test usando un lavoro AWS Glue e Python - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Genera dati di test usando un lavoro AWS Glue e Python

Creato da Moinul Al-Mamun () AWS

Ambiente: produzione

Tecnologie: analisi CloudNative; data lake DevelopmentAndTesting; serverless; Big data

AWSservizi: AWS Glue; Amazon S3

Riepilogo

Questo modello mostra come generare in modo rapido e semplice milioni di file di esempio contemporaneamente creando un lavoro AWS Glue scritto in Python. I file di esempio sono archiviati in un bucket Amazon Simple Storage Service (Amazon S3). La capacità di generare rapidamente un gran numero di file di esempio è importante per testare o valutare i servizi nel cloud. AWS Ad esempio, puoi testare le prestazioni dei DataBrew job AWS Glue Studio o AWS Glue eseguendo l'analisi dei dati su milioni di file di piccole dimensioni in un prefisso Amazon S3.

Sebbene sia possibile utilizzare altri AWS servizi per generare set di dati di esempio, si consiglia di utilizzare AWS Glue. Non è necessario gestire alcuna infrastruttura perché AWS Glue è un servizio di elaborazione dati senza server. Puoi semplicemente portare il tuo codice ed eseguirlo in un cluster AWS Glue. Inoltre, AWS Glue fornisce, configura e ridimensiona le risorse necessarie per eseguire i lavori. Paghi solo per le risorse che i tuoi job utilizzano durante l'esecuzione.

Prerequisiti e limitazioni

Prerequisiti

  • Un AWS account attivo

  • AWSCommand Line Interface (AWSCLI), installata e configurata per funzionare con l'AWSaccount

Versioni del prodotto

  • Python 3.9

  • AWSCLIversione 2

Limitazioni

Il numero massimo di lavori AWS Glue per trigger è 50. Per ulteriori informazioni, consulta AWSGlue endpoints and quotas.

Architettura

Il diagramma seguente illustra un'architettura di esempio incentrata su un lavoro AWS Glue che scrive il relativo output (ovvero file di esempio) in un bucket S3.

Workflow AWS CLI mostra l'avvio del processo AWS Glue che scrive l'output nel bucket S3.

Il diagramma include il seguente flusso di lavoro:

  1. Si utilizza AWS Management Console o un API per avviare il job AWS Glue. AWS CLI L'AWSCLIor API consente di automatizzare la parallelizzazione del job richiamato e di ridurre il tempo di esecuzione per la generazione di file di esempio.

  2. Il processo AWS Glue genera il contenuto del file in modo casuale, lo converte in CSV formato e quindi lo archivia come oggetto Amazon S3 con un prefisso comune. Ogni file è inferiore a un kilobyte. Il lavoro AWS Glue accetta due parametri di lavoro definiti dall'utente: START_RANGE eEND_RANGE. È possibile utilizzare questi parametri per impostare i nomi dei file e il numero di file generati in Amazon S3 da ogni processo eseguito. È possibile eseguire più istanze di questo processo in parallelo (ad esempio, 100 istanze).

Strumenti

  • Amazon Simple Storage Service (Amazon S3) è un servizio di archiviazione degli oggetti basato sul cloud che consente di archiviare, proteggere e recuperare qualsiasi quantità di dati.

  • AWSCommand Line Interface (AWSCLI) è uno strumento open source che consente di interagire con i AWS servizi tramite comandi nella shell della riga di comando.

  • AWSGlue è un servizio di estrazione, trasformazione e caricamento (ETL) completamente gestito. Ti aiuta a classificare, pulire, arricchire e spostare i dati in modo affidabile tra archivi di dati e flussi di dati.

  • AWSIdentity and Access Management (IAM) consente di gestire in modo sicuro l'accesso alle AWS risorse controllando chi è autenticato e autorizzato a utilizzarle.

Best practice

Prendi in considerazione le seguenti best practice di AWS Glue durante l'implementazione di questo modello:

  • Usa il tipo di AWS Glue worker giusto per ridurre i costi. Ti consigliamo di comprendere le diverse proprietà dei tipi di worker e quindi di scegliere il tipo di worker giusto per il tuo carico di lavoro in CPU base ai requisiti di memoria. Per questo modello, si consiglia di utilizzare un job della shell Python come tipo di lavoro per ridurre al minimo DPU e ridurre i costi. Per ulteriori informazioni, consulta Aggiungere lavori in AWS Glue nella AWS Glue Developer Guide.

  • Usa il giusto limite di concorrenza per scalare il tuo lavoro. Ti consigliamo di basare la massima contemporaneità del tuo lavoro AWS Glue sul tempo richiesto e sul numero di file richiesto.

  • Iniziate a generare un numero limitato di file all'inizio. Per ridurre i costi e risparmiare tempo durante la creazione dei lavori AWS Glue, inizia con un numero limitato di file (ad esempio 1.000). Questo può semplificare la risoluzione dei problemi. Se la generazione di un numero ridotto di file ha esito positivo, è possibile passare a un numero maggiore di file.

  • Esegui prima localmente. Per ridurre i costi e risparmiare tempo durante la creazione dei job AWS Glue, avvia lo sviluppo localmente e testa il codice. Per istruzioni sulla configurazione di un contenitore Docker che può aiutarti a scrivere i job di estrazione, trasformazione e caricamento (ETL) di AWS Glue sia in una shell che in un ambiente di sviluppo integrato (IDE), consulta i ETLjob Developing AWS Glue local using a container sul AWS Big Data Blog.

Per ulteriori best practice su AWS Glue, consulta Best practice nella documentazione di AWS Glue.

Epiche

AttivitàDescrizioneCompetenze richieste

Crea un bucket S3 per archiviare i file.

Crea un bucket S3 e un prefisso al suo interno.

Nota: questo modello utilizza la s3://{your-s3-bucket-name}/small-files/ posizione a scopo dimostrativo.

Sviluppatore di app

Crea e configura un IAM ruolo.

Devi creare un IAM ruolo che il tuo job AWS Glue possa utilizzare per scrivere nel tuo bucket S3.

  1. Crea un IAMruolo (ad esempio, chiamato"AWSGlueServiceRole-smallfiles").

  2. Scegli AWS Glue come entità affidabile della policy.

  3. Allega una policy AWS gestita chiamata "AWSGlueServiceRole" al ruolo.

  4. Crea una politica in linea o una politica gestita dal cliente richiamata in "s3-small-file-access" base alla seguente configurazione. "{bucket}"Sostituiscilo con il nome del tuo bucket.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::{bucket}/small-files/input/*" ] } ] }
  5. Allega la "s3-small-file-access" policy al tuo ruolo.

Sviluppatore di app
AttivitàDescrizioneCompetenze richieste

Crea un lavoro AWS Glue.

Devi creare un lavoro AWS Glue che generi i tuoi contenuti e li memorizzi in un bucket S3.

Crea un lavoro AWS Glue, quindi configura il tuo lavoro completando i seguenti passaggi:

  1. Accedi alla console di AWS gestione e apri la console AWS Glue.

  2. Nel riquadro di navigazione, sotto Data Integration ETL, scegli Jobs.

  3. Nella sezione Crea lavoro, scegli l'editor di script Python Shell.

  4. Nella sezione Opzioni, seleziona Crea un nuovo script con codice boilerplate, quindi scegli Crea.

  5. Scegli Dettagli del lavoro.

  6. Per Nome, inserisci create_small_files.

  7. Per IAMRuolo, selezionate il ruolo che avete creato in IAM precedenza.

  8. Nella sezione Questo lavoro viene eseguito, scegli Un nuovo script da creare da te.

  9. Espandi Proprietà avanzate.

  10. Per Concorrenza massima, inserire 100 a scopo dimostrativo. Nota: la concorrenza massima definisce il numero di istanze del processo che è possibile eseguire in parallelo.

  11. Seleziona Salva.

Sviluppatore di app

Aggiorna il codice del lavoro.

  1. Apri la console AWS Glue.

  2. Nel riquadro di navigazione scegliere Jobs (Processi).

  3. Nella sezione I tuoi lavori, scegli il lavoro che hai creato in precedenza.

  4. Scegli la scheda Script, quindi aggiorna lo script in base al codice seguente. Aggiorna le text_str variabili BUCKET_NAMEPREFIX, e con i tuoi valori.

    from awsglue.utils import getResolvedOptions import sys import boto3 from random import randrange # Two arguments args = getResolvedOptions(sys.argv, ['START_RANGE', 'END_RANGE']) START_RANGE = int(args['START_RANGE']) END_RANGE = int(args['END_RANGE']) BUCKET_NAME = '{BUCKET_NAME}' PREFIX = 'small-files/input/' s3 = boto3.resource('s3') for x in range(START_RANGE, END_RANGE): # generate file name file_name = f"input_{x}.txt" # generate text text_str = str(randrange(100000))+","+str(randrange(100000))+", " + str(randrange(10000000)) + "," + str(randrange(10000)) # write in s3 s3.Object(BUCKET_NAME, PREFIX + file_name).put(Body=text_str)
  5. Seleziona Salva.

Sviluppatore di app
AttivitàDescrizioneCompetenze richieste

Esegui il job AWS Glue dalla riga di comando.

Per eseguire il job AWS Glue da AWSCLI, esegui il comando seguente utilizzando i tuoi valori:

cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"1000000"}' cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000000","--END_RANGE":"2000000"}'

Nota: per istruzioni sull'esecuzione del job AWS Glue dalla AWS Management Console, vedere il job Run the AWS Glue nella storia della AWS Management Console in questo modello.

Suggerimento: si consiglia di utilizzare il comando AWS CLI to run AWS Glue job se si desidera eseguire più esecuzioni contemporaneamente con parametri diversi, come mostrato nell'esempio precedente.

Per generare tutti AWS CLI i comandi necessari per generare un numero definito di file utilizzando un determinato fattore di parallelizzazione, esegui il seguente codice bash (usando i tuoi valori):

# define parameters NUMBER_OF_FILES=10000000; PARALLELIZATION=50; # initialize _SB=0; # generate commands for i in $(seq 1 $PARALLELIZATION); do echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i-1) + _SB))'","--END_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i)))'"}'"'"; _SB=1; done

Se usi lo script precedente, considera quanto segue:

  • Lo script semplifica l'invocazione e la generazione di file di piccole dimensioni su larga scala.

  • Aggiorna NUMBER_OF_FILES e PARALLELIZATION con i tuoi valori.

  • Lo script precedente stampa un elenco di comandi da eseguire. Copia questi comandi di output, quindi eseguili nel tuo terminale.

  • Se desideri eseguire i comandi direttamente dall'interno dello script, rimuovi l'echoistruzione nella riga 11.

Nota: per vedere un esempio di output dello script precedente, vedete l'output dello script Shell nella sezione Informazioni aggiuntive di questo modello.

Sviluppatore di app

Esegui il job AWS Glue nella AWS Management Console.

  1. Accedi alla console di AWS gestione e apri la console AWS Glue.

  2. Nel riquadro di navigazione, sotto Data Integration ETL, scegli Jobs.

  3. Nella sezione I tuoi lavori, scegli il tuo lavoro.

  4. Nella sezione Parametri (opzionale), aggiorna i parametri.

  5. Scegli Azione, quindi scegli Esegui processo.

  6. Ripeti i passaggi da 3 a 5 tutte le volte che desideri. Ad esempio, per creare 10 milioni di file, ripeti questo processo 10 volte.

Sviluppatore di app

Controlla lo stato del tuo lavoro con AWS Glue.

  1. Apri la console AWS Glue.

  2. Nel riquadro di navigazione scegliere Jobs (Processi).

  3. Nella sezione I tuoi lavori, scegli il lavoro che hai creato in precedenza (ovvero,create_small_files).

  4. Per informazioni sull'avanzamento e sulla generazione dei tuoi file, consulta le colonne Run ID, Run Status e altre.

Sviluppatore di app

Risorse correlate

Riferimenti

Guide e pattern

Informazioni aggiuntive

Test di benchmarking

Questo modello è stato utilizzato per generare 10 milioni di file utilizzando diversi parametri di parallelizzazione come parte di un test di benchmarking. La tabella seguente mostra i risultati del test:

Parallelizzazione

Numero di file generati dall'esecuzione di un processo

Durata del lavoro

Velocità

10

1.000.000

6 ore, 40 minuti

Molto lento

50

200.000

80 minuti

Moderata

100

100.000

40 minuti

Veloce

Se desideri velocizzare il processo, puoi configurare più esecuzioni simultanee nella configurazione del processo. Puoi facilmente modificare la configurazione del lavoro in base alle tue esigenze, ma tieni presente che esiste un limite di quota di servizio AWS Glue. Per ulteriori informazioni, consulta AWSGlue endpoints and quotas.

Output dello script Shell

L'esempio seguente mostra l'output dello script di shell dal job Run the AWS Glue dal brano della riga di comando secondo questo schema.

user@MUC-1234567890 MINGW64 ~ $ # define parameters NUMBER_OF_FILES=10000000; PARALLELIZATION=50; # initialize _SB=0; # generate commands for i in $(seq 1 $PARALLELIZATION); do echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) (i-1) + SB))'","--ENDRANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) (i)))'"}'"'"; _SB=1; done aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"200001","--END_RANGE":"400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"400001","--END_RANGE":"600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"600001","--END_RANGE":"800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"800001","--END_RANGE":"1000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000001","--END_RANGE":"1200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1200001","--END_RANGE":"1400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1400001","--END_RANGE":"1600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1600001","--END_RANGE":"1800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1800001","--END_RANGE":"2000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2000001","--END_RANGE":"2200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2200001","--END_RANGE":"2400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2400001","--END_RANGE":"2600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2600001","--END_RANGE":"2800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2800001","--END_RANGE":"3000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3000001","--END_RANGE":"3200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3200001","--END_RANGE":"3400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3400001","--END_RANGE":"3600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3600001","--END_RANGE":"3800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3800001","--END_RANGE":"4000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4000001","--END_RANGE":"4200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4200001","--END_RANGE":"4400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4400001","--END_RANGE":"4600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4600001","--END_RANGE":"4800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4800001","--END_RANGE":"5000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5000001","--END_RANGE":"5200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5200001","--END_RANGE":"5400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5400001","--END_RANGE":"5600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5600001","--END_RANGE":"5800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5800001","--END_RANGE":"6000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6000001","--END_RANGE":"6200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6200001","--END_RANGE":"6400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6400001","--END_RANGE":"6600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6600001","--END_RANGE":"6800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6800001","--END_RANGE":"7000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7000001","--END_RANGE":"7200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7200001","--END_RANGE":"7400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7400001","--END_RANGE":"7600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7600001","--END_RANGE":"7800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7800001","--END_RANGE":"8000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8000001","--END_RANGE":"8200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8200001","--END_RANGE":"8400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8400001","--END_RANGE":"8600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8600001","--END_RANGE":"8800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8800001","--END_RANGE":"9000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9000001","--END_RANGE":"9200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9200001","--END_RANGE":"9400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9400001","--END_RANGE":"9600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9600001","--END_RANGE":"9800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9800001","--END_RANGE":"10000000"}' user@MUC-1234567890 MINGW64 ~

FAQ

Quante esecuzioni simultanee o job paralleli devo usare?

Il numero di esecuzioni simultanee e di lavori paralleli dipende dal tempo richiesto e dal numero desiderato di file di test. Ti consigliamo di controllare la dimensione dei file che stai creando. Innanzitutto, controllate quanto tempo impiega un job AWS Glue per generare il numero di file desiderato. Quindi, utilizza il numero giusto di esecuzioni simultanee per raggiungere i tuoi obiettivi. Ad esempio, se si presuppone che 100.000 file impieghino 40 minuti per completare l'esecuzione ma il tempo previsto sia di 30 minuti, è necessario aumentare l'impostazione di concorrenza per il processo AWS Glue.

Che tipo di contenuto posso creare utilizzando questo modello?

È possibile creare qualsiasi tipo di contenuto, ad esempio file di testo con delimitatori diversi (ad esempio, PIPEJSON, oCSV). Questo modello utilizza Boto3 per scrivere su un file e quindi salva il file in un bucket S3.

Di che livello di IAM autorizzazione ho bisogno nel bucket S3?

È necessario disporre di una politica basata sull'identità che consenta Write l'accesso agli oggetti nel bucket S3. Per ulteriori informazioni, consulta Amazon S3: consente l'accesso in lettura e scrittura agli oggetti in un bucket S3 nella documentazione di Amazon S3.