

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
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function"></a>

*Dhrubajyoti Mukherjee, Amazon Web Services*

## Résumé
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-summary"></a>

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 à partir 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
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-prereqs"></a>

**Conditions préalables**
+ 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
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-architecture"></a>

**Pile technologique cible**
+ Amazon EMR 
+ AWS Lambda
+ Amazon S3
+ Apache Spark

**Architecture cible**

![\[Lambda vers Amazon EMR et Spark vers Amazon S3\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/6c999fa7-9550-4929-a5c1-60394142175d/images/eb4fbb3f-2114-44d2-b9da-3fdcb9ca456e.png)


**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](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-run-lambda-schedule.html) à l'aide de. EventBridge
+ Configurez [les notifications d'événements Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html) 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
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-tools"></a>

**Services AWS**
+ [Amazon EMR](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-what-is-emr.html) 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](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 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)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 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](https://spark.apache.org/docs/latest/) est un moteur d'analyse multilingue destiné au traitement de données à grande échelle.

## Épopées
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-epics"></a>

### Création des rôles Amazon EMR et Lambda IAM et du VPC
<a name="create-the-amazon-emr-and-lambda-iam-roles-and-the-vpc"></a>


| Sous-tâche | Description | Compé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 : [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function.html)Vous utiliserez les valeurs de ces clés lorsque vous créerez la fonction Lambda. | Architecte du cloud | 

### Téléchargez le fichier Spark .jar
<a name="upload-the-spark-jar-file"></a>


| Sous-tâche | Description | Compé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 sortie`S3Bucket`.  | AWS général | 

### Créez la fonction Lambda pour lancer le cluster EMR
<a name="create-the-lambda-function-to-launch-the-emr-cluster"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| créer une fonction Lambda ; | Sur la console Lambda, créez une fonction Lambda Python 3.9\$1 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 | 

### Configuration et exécution de l'exemple de démonstration
<a name="set-up-and-run-the-sample-demo"></a>


| Sous-tâche | Description | Compé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 code`lambda_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
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-resources"></a>
+ [Construire Spark](https://spark.apache.org/docs/latest/building-spark.html)
+ [Apache Spark et Amazon EMR](https://docs.aws.amazon.com/emr/latest/ReleaseGuide/emr-spark.html)
+ [Documentation de Boto3 Docs run\$1job\$1flow](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/emr.html#EMR.Client.run_job_flow)
+ [Informations et documentation sur Apache Spark](https://spark.apache.org/)

## Informations supplémentaires
<a name="launch-a-spark-job-in-a-transient-emr-cluster-using-a-lambda-function-additional"></a>

**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](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) 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](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role.html) 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](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-role-for-ec2.html) (é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](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#create-vpc-and-other-resources) à partir de la console VPC. 

## Pièces jointes
<a name="attachments-6c999fa7-9550-4929-a5c1-60394142175d"></a>

[Pour accéder au contenu supplémentaire associé à ce document, décompressez le fichier suivant : attachment.zip](samples/p-attach/6c999fa7-9550-4929-a5c1-60394142175d/attachments/attachment.zip)