Avvia un job Spark in un EMR cluster transitorio utilizzando una funzione Lambda - 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à.

Avvia un job Spark in un EMR cluster transitorio utilizzando una funzione Lambda

Creato da Dhrubajyoti Mukherjee () AWS

Ambiente: produzione

Tecnologie: analisi

Carico di lavoro: open source

AWSservizi: AmazonEMR; AWS Identity and Access Management; AWS Lambda; Amazon VPC

Riepilogo

Questo modello utilizza l'EMR RunJobFlow APIazione Amazon per avviare un cluster transitorio per eseguire un job Spark da una funzione Lambda. Un EMR cluster temporaneo è progettato per terminare non appena il processo è completo o in caso di errore. Un cluster transitorio offre risparmi sui costi perché viene eseguito solo durante il periodo di calcolo e offre scalabilità e flessibilità in un ambiente cloud.

Il EMR cluster transitorio viene avviato utilizzando il linguaggio di programmazione Boto3 e API Python in una funzione Lambda. La funzione Lambda, scritta in Python, offre la flessibilità aggiuntiva di avviare il cluster quando è necessario.

Per dimostrare il calcolo e l'output di un batch di esempio, questo modello avvierà un job Spark in un EMR cluster da una funzione Lambda ed eseguirà un calcolo in batch con i dati di vendita di esempio di un'azienda fittizia. L'output del job Spark sarà un CSV file di valori separati da virgole () in Amazon Simple Storage Service (Amazon S3). Il file di dati di input, il file Spark .jar, un frammento di codice e un AWS CloudFormation modello per un cloud privato virtuale (VPC) e i ruoli AWS Identity and Access Management (IAM) per eseguire il calcolo vengono forniti come allegato.

Prerequisiti e limitazioni

Prerequisiti

  • Un account attivo AWS

Limitazioni

  • Dal codice può essere avviato un solo job Spark alla volta. 

Versioni del prodotto

  • Testato su Amazon EMR 6.0.0

Architettura

Stack tecnologico Target

  • Amazon EMR 

  • AWSLambda

  • Amazon S3

  • Apache Spark

Architettura Target

Lambda su Amazon EMR e Spark su Amazon S3

Automazione e scalabilità

Per automatizzare il calcolo EMR in batch di Spark, puoi utilizzare una delle seguenti opzioni.

  • Implementa una EventBridge regola Amazon in grado di avviare la funzione Lambda in una pianificazione cron. Per ulteriori informazioni, consulta Tutorial: Schedule AWS Lambda functions using. EventBridge

  • Configura le notifiche degli eventi di Amazon S3 per avviare la funzione Lambda all'arrivo dei file.

  • Passa i parametri di input alla funzione AWS Lambda tramite il corpo dell'evento e le variabili di ambiente Lambda.

Strumenti

AWSservizi

  • Amazon EMR è una piattaforma di cluster gestita che semplifica l'esecuzione di framework di big data AWS per elaborare e analizzare grandi quantità di dati.

  • AWSLambda è un servizio di elaborazione che ti aiuta a eseguire il codice senza dover fornire o gestire server. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di elaborazione che utilizzi.

  • 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.

Altri strumenti

  • Apache Spark è un motore di analisi multilingue per l'elaborazione di dati su larga scala.

Epiche

AttivitàDescrizioneCompetenze richieste

Crea i IAM ruoli e ilVPC.

Se disponi già dei EMR IAM ruoli AWS Lambda e Amazon e unVPC, puoi saltare questo passaggio. Per eseguire il codice, sia il EMR cluster che la funzione Lambda richiedono IAM ruoli. Il EMR cluster richiede anche una VPC sottorete pubblica o una sottorete privata con un gateway. NAT Per creare automaticamente tutti i IAM ruoli e unVPC, distribuisci il AWS CloudFormation modello allegato così com'è oppure puoi creare i ruoli e farlo VPC manualmente come specificato nella sezione Informazioni aggiuntive.

Architetto del cloud

Nota le chiavi AWS CloudFormation di output del modello.

Dopo che il CloudFormation modello è stato distribuito correttamente, vai alla scheda Output nella AWS CloudFormation console. Nota i cinque tasti di output:

  • S3Bucket

  • LambdaExecutionRole

  • ServiceRole

  • JobFlowRole

  • Ec2SubnetId

Utilizzerai i valori di queste chiavi quando creerai la funzione Lambda.

Architetto del cloud
AttivitàDescrizioneCompetenze richieste

Carica il file.jar di Spark.

Carica il file Spark .jar nel bucket S3 creato dallo stack. AWS CloudFormation Il nome del bucket è lo stesso della chiave di output. S3Bucket

Generale AWS
AttivitàDescrizioneCompetenze richieste

Creazione di una funzione Lambda.

Sulla console Lambda, crea una funzione Lambda Python 3.9+ con un ruolo di esecuzione. La politica del ruolo di esecuzione deve consentire a Lambda di avviare un EMR cluster. (Vedi il AWS CloudFormation modello allegato).

Ingegnere dei dati, ingegnere del cloud

Copia e incolla il codice.

Sostituisci il codice nel lambda_function.py file con il codice della sezione Informazioni aggiuntive di questo modello.

Ingegnere dei dati, ingegnere del cloud

Modifica i parametri nel codice.

Segui i commenti nel codice per modificare i valori dei parametri in modo che corrispondano al tuo AWS account.

Ingegnere dei dati, ingegnere del cloud

Avvia la funzione per avviare il cluster.

Avvia la funzione per avviare la creazione di un EMR cluster transitorio con il file Spark .jar fornito. Eseguirà il job Spark e terminerà automaticamente quando il job sarà completo.

Ingegnere dei dati, ingegnere del cloud

Controlla lo stato EMR del cluster.

Dopo l'avvio, il EMR cluster viene visualizzato nella EMR console Amazon nella scheda Cluster. Eventuali errori durante l'avvio del cluster o l'esecuzione del processo possono essere controllati di conseguenza.

Ingegnere dei dati, ingegnere del cloud
AttivitàDescrizioneCompetenze richieste

Carica il file.jar di Spark.

Scarica il file Spark .jar dalla sezione Allegati e caricalo nel bucket S3.

Ingegnere dei dati, ingegnere del cloud

Carica il set di dati di input.

Carica il fake_sales_data.csv file allegato nel bucket S3.

Ingegnere dei dati, ingegnere del cloud

Incolla il codice Lambda e modifica i parametri.

Copia il codice dalla sezione Strumenti e incolla il codice in una funzione Lambda, sostituendo il file di codice. lambda_function.py Modifica i valori dei parametri in modo che corrispondano al tuo account.

Ingegnere dei dati, ingegnere del cloud

Avvia la funzione e verifica l'output.

Dopo che la funzione Lambda ha avviato il cluster con il job Spark fornito, genera un file.csv nel bucket S3.

Ingegnere dei dati, ingegnere del cloud

Risorse correlate

Informazioni aggiuntive

Codice

""" Copy paste the following code in your Lambda function. Make sure to change the following key parameters for the API as per your account -Name (Name of Spark cluster) -LogUri (S3 bucket to store EMR logs) -Ec2SubnetId (The subnet to launch the cluster into) -JobFlowRole (Service role for EC2) -ServiceRole (Service role for Amazon EMR) The following parameters are additional parameters for the Spark job itself. Change the bucket name and prefix for the Spark job (located at the bottom). -s3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar (Spark jar file) -s3://your-bucket-name/prefix/fake_sales_data.csv (Input data file in S3) -s3://your-bucket-name/prefix/outputs/report_1/ (Output location in S3) """ import boto3 client = boto3.client('emr') def lambda_handler(event, context): response = client.run_job_flow( Name='spark_job_cluster', LogUri='s3://your-bucket-name/prefix/logs', ReleaseLabel='emr-6.0.0', Instances={ 'MasterInstanceType': 'm5.xlarge', 'SlaveInstanceType': 'm5.large', 'InstanceCount': 1, 'KeepJobFlowAliveWhenNoSteps': False, 'TerminationProtected': False, 'Ec2SubnetId': 'subnet-XXXXXXXXXXXXXX' }, Applications=[{'Name': 'Spark'}], Configurations=[ {'Classification': 'spark-hive-site', 'Properties': { 'hive.metastore.client.factory.class': 'com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory'} } ], VisibleToAllUsers=True, JobFlowRole='EMRLambda-EMREC2InstanceProfile-XXXXXXXXX', ServiceRole='EMRLambda-EMRRole-XXXXXXXXX', Steps=[ { 'Name': 'flow-log-analysis', 'ActionOnFailure': 'TERMINATE_CLUSTER', 'HadoopJarStep': { 'Jar': 'command-runner.jar', 'Args': [ 'spark-submit', '--deploy-mode', 'cluster', '--executor-memory', '6G', '--num-executors', '1', '--executor-cores', '2', '--class', 'com.aws.emr.ProfitCalc', 's3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar', 's3://your-bucket-name/prefix/fake_sales_data.csv', 's3://your-bucket-name/prefix/outputs/report_1/' ] } } ] )

IAMruoli e creazione VPC

Per avviare il EMR cluster in una funzione Lambda, sono necessari IAM i ruoli a VPC e. È possibile configurare i IAM ruoli VPC and utilizzando il AWS CloudFormation modello nella sezione Allegati di questo modello oppure è possibile crearli manualmente utilizzando i seguenti collegamenti. 

I seguenti IAM ruoli sono necessari per eseguire Lambda e Amazon. EMR 

Ruolo di esecuzione Lambda

Il ruolo di esecuzione di una funzione Lambda le concede l'autorizzazione ad accedere a AWS servizi e risorse.

Ruolo di servizio per Amazon EMR

Il EMRruolo Amazon definisce le azioni consentite per Amazon EMR durante il provisioning di risorse e l'esecuzione di attività a livello di servizio che non vengono eseguite nel contesto di un'istanza Amazon Elastic Compute Cloud (EC2Amazon) in esecuzione all'interno di un cluster. Ad esempio, il ruolo di servizio viene utilizzato per fornire EC2 istanze all'avvio di un cluster.

Ruolo di servizio per le istanze EC2

Il ruolo di servizio per EC2 le istanze di cluster (chiamato anche profilo di EC2 istanza per AmazonEMR) è un tipo speciale di ruolo di servizio assegnato a ogni EC2 istanza di un EMR cluster Amazon all'avvio dell'istanza. I processi applicativi eseguiti su Apache Hadoop assumono questo ruolo per le autorizzazioni di interazione con altri servizi. AWS

VPCe creazione di sottoreti

È possibile creare un file VPC dalla VPC console. 

Allegati

Per accedere al contenuto aggiuntivo associato a questo documento, decomprimi il seguente file: attachment.zip