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

Creato da Dhrubajyoti Mukherjee (AWS)

Ambiente: produzione

Tecnologie: analisi

Carico di lavoro: open source

Servizi AWS: Amazon EMR; AWS Identity and Access Management; AWS Lambda; Amazon VPC

Riepilogo

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

Il cluster EMR transitorio viene avviato utilizzando l'API Boto3 e il linguaggio di programmazione 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 cluster EMR 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 file con valori separati da virgole (CSV) in Amazon Simple Storage Service (Amazon S3). Il file di dati di input, il file Spark .jar, uno snippet di codice e un CloudFormation modello AWS per un cloud privato virtuale (VPC) e i ruoli AWS Identity and Access Management (IAM) per eseguire il calcolo sono forniti come allegato.

Prerequisiti e limitazioni

Prerequisiti

  • Un account AWS attivo

Limitazioni

  • È possibile avviare un solo job Spark alla volta dal codice. 

Versioni del prodotto

  • Testato su Amazon EMR 6.0.0

Architettura

Stack tecnologico Target

  • Amazon EMR 

  • AWS Lambda

  • Amazon S3

  • Apache Spark

Architettura di destinazione

Da Lambda ad Amazon EMR e da Spark ad Amazon S3

Automazione e scalabilità

Per automatizzare il calcolo in batch Spark-EMR, 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

Servizi AWS

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

  • AWS Lambda è un servizio di elaborazione che ti aiuta a eseguire codice senza dover fornire o gestire server. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di calcolo 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 ruoli IAM e il VPC.

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

Architetto del cloud

Nota le chiavi di output CloudFormation del modello AWS.

Dopo che il CloudFormation modello è stato distribuito correttamente, vai alla scheda Outputs nella console CloudFormation AWS. 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

Informazioni generali su 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 cluster EMR. (Vedi il CloudFormation modello AWS 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 account AWS.

Ingegnere dei dati, ingegnere del cloud

Avvia la funzione per avviare il cluster.

Avvia la funzione per avviare la creazione di un cluster EMR 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

Verificare lo stato del cluster EMR.

Dopo l'avvio, il cluster EMR viene visualizzato nella console Amazon EMR nella scheda Clusters. 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/' ] } } ] )

Ruoli IAM e creazione di VPC

Per avviare il cluster EMR in una funzione Lambda, sono necessari ruoli VPC e IAM. Puoi configurare i ruoli VPC e IAM utilizzando il CloudFormation modello AWS nella sezione Attachments di questo modello oppure puoi crearli manualmente utilizzando i seguenti link. 

I seguenti ruoli IAM 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 ai servizi e alle risorse AWS.

Ruolo di servizio per Amazon EMR

Il ruolo Amazon EMR 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 (Amazon EC2) in esecuzione all'interno di un cluster. Ad esempio, il ruolo del servizio viene utilizzato per effettuare il provisioning di istanze EC2 quando viene avviato un cluster.

Ruolo di servizio per le istanze EC2

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

Creazione di VPC e sottoreti

Puoi creare un VPC dalla console VPC. 

Allegati

Per accedere a contenuti aggiuntivi associati a questo documento, decomprimi il seguente file: attachment.zip