Lancer une tâche Spark dans un cluster EMR 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 cluster EMR transitoire à l'aide d'une fonction Lambda

Créée par Dhrubajyoti Mukherjee (AWS)

Récapitulatif

Ce modèle utilise l'action d' RunJobFlow API Amazon EMR pour lancer un cluster transitoire afin d'exécuter une tâche Spark à partir d'une fonction Lambda. Un cluster EMR 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 cluster EMR transitoire est lancé à l'aide de l'API Boto3 et 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 cluster EMR à 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. La sortie 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 CloudFormation modèle AWS pour un cloud privé virtuel (VPC) et les rôles AWS Identity and Access Management (IAM) permettant d'exécuter le calcul sont fournis en pièce jointe.

Conditions préalables et limitations

Prérequis

  • Un compte AWS 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 

  • AWS Lambda

  • Amazon S3

  • Apache Spark

Architecture cible

Lambda vers Amazon EMR et Spark vers Amazon S3

Automatisation et mise à l'échelle

Pour automatiser le calcul par lots de Spark-EMR, 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, consultez Tutoriel : Programmez les 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

Services AWS

  • Amazon EMR est une plate-forme de cluster gérée qui simplifie l'exécution de frameworks de mégadonnées sur AWS afin de traiter et d'analyser de grandes quantités de données.

  • AWS Lambda est un service de calcul qui vous permet d'exécuter du code sans avoir à provisionner 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 rôles IAM et le VPC.

Si vous possédez déjà les rôles IAM AWS Lambda et Amazon EMR ainsi qu'un VPC, vous pouvez ignorer cette étape. Pour exécuter le code, le cluster EMR et la fonction Lambda nécessitent des rôles IAM. Le cluster EMR nécessite également un VPC avec un sous-réseau public ou un sous-réseau privé avec une passerelle NAT. Pour créer automatiquement tous les rôles IAM et un VPC, déployez le modèle CloudFormation AWS 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 de sortie du CloudFormation modèle AWS.

Une fois le CloudFormation modèle déployé avec succès, accédez à l'onglet Outputs de la CloudFormation console AWS. 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 CloudFormation pile AWS. Le nom du bucket est identique à celui de la clé de sortieS3Bucket.

AWS général
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 cluster EMR. (Voir le CloudFormation modèle AWS 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 compte AWS.

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 cluster EMR transitoire à l'aide du 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 du cluster EMR.

Une fois le cluster EMR lancé, il apparaît dans la console Amazon EMR 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 pour qu'elles correspondent à celles 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/' ] } } ] )

Rôles IAM et création de VPC

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

Les rôles IAM 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 services et ressources AWS.

Rôle de service pour Amazon EMR

Le rôle Amazon EMR définit les actions autorisées pour Amazon EMR lors du provisionnement de 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 (Amazon) exécutée au sein d'un cluster. EC2 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' EC2 instance pour Amazon EMR) est un type spécial de rôle de service attribué à chaque EC2 instance d'un cluster Amazon EMR 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 services AWS.

Création de VPC et de sous-réseaux

Vous pouvez créer un VPC à partir de la console VPC. 

Pièces jointes

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