Lancer une tâche Spark dans un EMR cluster transitoire à l'aide d'une fonction Lambda - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Lancer une tâche Spark dans un EMR cluster transitoire à l'aide d'une fonction Lambda

Créée par Dhrubajyoti Mukherjee () AWS

Environnement : Production

Technologies : Analytique

Charge de travail : Open source

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

Récapitulatif

Ce modèle utilise l'EMR RunJobFlow APIaction Amazon pour lancer un cluster transitoire afin d'exécuter une tâche Spark à partir d'une fonction Lambda. Un EMR cluster transitoire est conçu pour s'arrêter dès que le travail est terminé ou en cas d'erreur. Un cluster transitoire permet de réaliser des économies car il ne s'exécute que pendant le temps de calcul et offre évolutivité et flexibilité dans un environnement cloud.

Le EMR cluster transitoire est lancé à l'aide du Boto3 et API du langage de programmation Python dans une fonction Lambda. La fonction Lambda, écrite en Python, offre la flexibilité supplémentaire de lancer le cluster lorsque cela est nécessaire.

Pour illustrer un exemple de calcul et de sortie par lots, ce modèle lancera une tâche Spark dans un EMR cluster à partir d'une fonction Lambda et exécutera un calcul par lots sur la base des données de vente d'exemple d'une entreprise fictive. Le résultat de la tâche Spark sera un fichier de valeurs séparées par des virgules (CSV) dans Amazon Simple Storage Service (Amazon S3). Le fichier de données d'entrée, le fichier Spark .jar, un extrait de code et un AWS CloudFormation modèle pour un cloud privé virtuel (VPC) et des rôles AWS Identity and Access Management (IAM) pour exécuter le calcul sont fournis en pièce jointe.

Conditions préalables et limitations

Prérequis

  • Un AWS compte actif

Limites

  • Une seule tâche Spark peut être initiée à partir du code à la fois. 

Versions du produit

  • Testé sur Amazon EMR 6.0.0

Architecture

Pile technologique cible

  • Amazon EMR 

  • AWSLambda

  • Amazon S3

  • Apache Spark

Architecture cible

Lambda vers Amazon EMR et Spark vers Amazon S3

Automatisation et évolutivité

Pour automatiser le calcul par EMR lots Spark, vous pouvez utiliser l'une des options suivantes.

  • Implémentez une EventBridge règle Amazon capable de lancer la fonction Lambda dans un calendrier cron. Pour plus d'informations, voir Tutoriel : Planifier des fonctions AWS Lambda à l'aide de. EventBridge

  • Configurez les notifications d'événements Amazon S3 pour lancer la fonction Lambda à l'arrivée du fichier.

  • Transmettez les paramètres d'entrée à la fonction AWS Lambda via le corps de l'événement et les variables d'environnement Lambda.

Outils

AWSservices

  • Amazon EMR est une plateforme de clusters gérés qui simplifie l'exécution de frameworks de mégadonnées AWS pour traiter et analyser de grandes quantités de données.

  • AWSLambda est un service de calcul qui vous permet d'exécuter du code sans avoir à approvisionner ou à gérer des serveurs. Il exécute votre code uniquement lorsque cela est nécessaire et évolue automatiquement, de sorte que vous ne payez que pour le temps de calcul que vous utilisez.

  • Amazon Simple Storage Service (Amazon S3) est un service de stockage d'objets basé sur le cloud qui vous permet de stocker, de protéger et de récupérer n'importe quel volume de données.

Autres outils

  • Apache Spark est un moteur d'analyse multilingue destiné au traitement de données à grande échelle.

Épopées

TâcheDescriptionCompétences requises

Créez les IAM rôles et lesVPC.

Si vous possédez déjà les EMR IAM rôles AWS Lambda et Amazon et unVPC, vous pouvez ignorer cette étape. Pour exécuter le code, le EMR cluster et la fonction Lambda nécessitent IAM des rôles. Le EMR cluster nécessite également un VPC sous-réseau public ou un sous-réseau privé avec une NAT passerelle. Pour créer automatiquement tous les IAM rôles et unVPC, déployez le AWS CloudFormation modèle joint tel quel, ou vous pouvez créer les rôles et le VPC manuellement comme indiqué dans la section Informations supplémentaires.

Architecte du cloud

Notez les clés AWS CloudFormation de sortie du modèle.

Une fois le CloudFormation modèle déployé avec succès, accédez à l'onglet Sorties de la AWS CloudFormation console. Notez les cinq touches de sortie :

  • S3Bucket

  • LambdaExecutionRole

  • ServiceRole

  • JobFlowRole

  • Ec2SubnetId

Vous utiliserez les valeurs de ces clés lorsque vous créerez la fonction Lambda.

Architecte du cloud
TâcheDescriptionCompétences requises

Téléchargez le fichier .jar Spark.

Téléchargez le fichier .jar Spark dans le compartiment S3 créé par la AWS CloudFormation pile. Le nom du bucket est identique à celui de la clé de sortieS3Bucket.

Général AWS
TâcheDescriptionCompétences requises

Créez une fonction Lambda.

Sur la console Lambda, créez une fonction Lambda Python 3.9+ avec un rôle d'exécution. La politique de rôle d'exécution doit permettre à Lambda de lancer un EMR cluster. (Voir le AWS CloudFormation modèle ci-joint.)

Ingénieur de données, ingénieur cloud

Copiez et collez le code.

Remplacez le code du lambda_function.py fichier par le code de la section Informations supplémentaires de ce modèle.

Ingénieur de données, ingénieur cloud

Modifiez les paramètres du code.

Suivez les commentaires du code pour modifier les valeurs des paramètres en fonction de votre AWS compte.

Ingénieur de données, ingénieur cloud

Lancez la fonction pour lancer le cluster.

Lancez la fonction pour lancer la création d'un EMR cluster transitoire avec le fichier Spark .jar fourni. Il exécutera la tâche Spark et s'arrêtera automatiquement lorsque la tâche sera terminée.

Ingénieur de données, ingénieur cloud

Vérifiez l'état EMR du cluster.

Une fois le EMR cluster lancé, il apparaît dans la EMR console Amazon sous l'onglet Clusters. Toute erreur lors du lancement du cluster ou de l'exécution de la tâche peut être vérifiée en conséquence.

Ingénieur de données, ingénieur cloud
TâcheDescriptionCompétences requises

Téléchargez le fichier .jar Spark.

Téléchargez le fichier Spark .jar depuis la section Pièces jointes et chargez-le dans le compartiment S3.

Ingénieur de données, ingénieur cloud

Téléchargez le jeu de données en entrée.

Téléchargez le fake_sales_data.csv fichier joint dans le compartiment S3.

Ingénieur de données, ingénieur cloud

Collez le code Lambda et modifiez les paramètres.

Copiez le code de la section Outils, puis collez-le dans une fonction Lambda en remplaçant le fichier de codelambda_function.py. Modifiez les valeurs des paramètres en fonction de votre compte.

Ingénieur de données, ingénieur cloud

Lancez la fonction et vérifiez le résultat.

Une fois que la fonction Lambda a lancé le cluster avec la tâche Spark fournie, elle génère un fichier .csv dans le compartiment S3.

Ingénieur de données, ingénieur cloud

Ressources connexes

Informations supplémentaires

Code

""" 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/' ] } } ] )

IAMrôles et VPC création

Pour lancer le EMR cluster dans une fonction Lambda, les IAM rôles a VPC et sont nécessaires. Vous pouvez configurer les IAM rôles VPC et en utilisant le AWS CloudFormation modèle de la section Pièces jointes de ce modèle, ou vous pouvez les créer manuellement à l'aide des liens suivants. 

Les IAM rôles suivants sont requis pour exécuter Lambda et Amazon. EMR 

Rôle d'exécution Lambda

Le rôle d'exécution d'une fonction Lambda lui donne l'autorisation d'accéder aux AWS services et aux ressources.

Rôle de service pour Amazon EMR

Le EMRrôle Amazon définit les actions autorisées pour Amazon EMR lors de la mise en service des ressources et de l'exécution de tâches de niveau de service qui ne sont pas effectuées dans le contexte d'une instance Amazon Elastic Compute Cloud (AmazonEC2) exécutée au sein d'un cluster. Par exemple, le rôle de service est utilisé pour provisionner EC2 des instances lors du lancement d'un cluster.

Rôle de service pour les EC2 instances

Le rôle de service pour les EC2 instances de cluster (également appelé profil d'EC2instance pour AmazonEMR) est un type spécial de rôle de service attribué à chaque EC2 instance d'un EMR cluster Amazon lors du lancement de l'instance. Les processus d'application qui s'exécutent sur Apache Hadoop assument ce rôle pour les autorisations d'interaction avec d'autres AWS services.

VPCet création de sous-réseaux

Vous pouvez créer un VPC depuis la VPC console. 

Pièces jointes

Pour accéder au contenu supplémentaire associé à ce document, décompressez le fichier suivant : attachment.zip