

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.

# Répondre aux événements d'expiration liés au redimensionnement de la flotte d'instances du cluster Amazon EMR
<a name="emr-events-response-timeout-events"></a>

## Présentation de
<a name="emr-events-response-timeout-events-overview"></a>

Lors de l'exécution de l'opération de redimensionnement pour les clusters de flotte d'instances, les clusters Amazon EMR émettent des [événements](emr-manage-cloudwatch-events.md#emr-cloudwatch-instance-fleet-resize-events). Les événements liés au délai de mise en service sont émis lorsqu'Amazon EMR arrête de fournir de la capacité Spot ou à la demande pour la flotte après l'expiration du délai. La durée du délai d'expiration peut être configurée par l'utilisateur dans le cadre des [spécifications de redimensionnement](https://docs.aws.amazon.com/emr/latest/APIReference/API_InstanceFleetResizingSpecifications.html) des flottes d'instances. Dans les scénarios de redimensionnement consécutifs pour la même flotte d'instances, Amazon EMR émet les événements `Spot provisioning timeout - continuing resize` ou `On-Demand provisioning timeout - continuing resize` lorsque le délai d'expiration est dépassé pour l'opération de redimensionnement en cours. Amazon EMR commence ensuite à fournir la capacité pour la prochaine opération de redimensionnement de la flotte.

## Répondre aux événements liés au redimensionnement de la flotte d'instances
<a name="emr-events-response-timeout-events-rec"></a>

Lors d'un événement d'expiration de délai, nous vous recommandons de réagir de l'une des manières suivantes :
+ Consultez les [spécifications de redimensionnement](https://docs.aws.amazon.com/emr/latest/APIReference/API_InstanceFleetResizingSpecifications.html) et réessayez l'opération de redimensionnement. Comme la capacité change fréquemment, vos clusters seront redimensionnés avec succès dès que la capacité Amazon EC2 sera disponible. Nous recommandons aux clients de configurer des valeurs inférieures pour le délai d'expiration pour les tâches nécessitant des mesures plus strictesSLAs.
+ Vous pouvez également :
  + Lancer un nouveau cluster avec des types d'instances diversifiés en fonction des [meilleures pratiques pour les instances et de la flexibilité de la zone de disponibilité](emr-flexibility.md#emr-flexibility-types), ou
  + Lancement d'un cluster avec une capacité à la demande
+ En ce qui concerne l'événement relatif au délai d'expiration de la mise en service et au redimensionnement continu, vous pouvez également attendre que les opérations de redimensionnement soient traitées. Amazon EMR continuera de traiter les opérations de redimensionnement déclenchées pour la flotte de manière séquentielle, en respectant les spécifications de redimensionnement configurées.

Vous pouvez également configurer des règles ou des réponses automatisées à cet événement, comme décrit dans la section suivante.

## Restauration automatique après un événement d'expiration de la mise en service
<a name="emr-events-response-timeout-events-ex"></a>

Vous pouvez créer une automatisation en réponse aux événements Amazon EMR avec le code d'événement `Spot Provisioning timeout`. Par exemple, la fonction AWS Lambda suivante met fin à un cluster EMR avec une flotte d'instances qui utilise des instances Spot pour les nœuds de tâches, puis crée un nouveau cluster EMR avec une flotte d'instances contenant des types d'instances plus diversifiés que ceux de la demande initiale. Dans cet exemple, l'événement `Spot Provisioning timeout` émis pour les nœuds de tâches déclenchera l'exécution de la fonction Lambda.

**Example Exemple de fonction pour répondre à un événement `Spot Provisioning timeout`**  

```
// Lambda code with Python 3.10 and handler is lambda_function.lambda_handler
// Note: related IAM role requires permission to use Amazon EMR
 
import json
import boto3
import datetime
from datetime import timezone
 
SPOT_PROVISIONING_TIMEOUT_EXCEPTION_DETAIL_TYPE = "EMR Instance Fleet Resize"
SPOT_PROVISIONING_TIMEOUT_EXCEPTION_EVENT_CODE = (
    "Spot Provisioning timeout"
)
 
CLIENT = boto3.client("emr", region_name="us-east-1")
 
# checks if the incoming event is 'EMR Instance Fleet Resize' with eventCode 'Spot provisioning timeout'
def is_spot_provisioning_timeout_event(event):
    if not event["detail"]:
        return False
    else:
        return (
            event["detail-type"] == SPOT_PROVISIONING_TIMEOUT_EXCEPTION_DETAIL_TYPE
            and event["detail"]["eventCode"]
            == SPOT_PROVISIONING_TIMEOUT_EXCEPTION_EVENT_CODE
        )
 
 
# checks if the cluster is eligible for termination
def is_cluster_eligible_for_termination(event, describeClusterResponse):
    # instanceFleetType could be CORE, MASTER OR TASK
    instanceFleetType = event["detail"]["instanceFleetType"]
 
    # Check if instance fleet receiving Spot provisioning timeout event is TASK
    if (instanceFleetType == "TASK"):
        return True
    else:
        return False
 
 
# create a new cluster by choosing different InstanceType.
def create_cluster(event):
    # instanceFleetType cloud be CORE, MASTER OR TASK
    instanceFleetType = event["detail"]["instanceFleetType"]
 
    # the following two lines assumes that the customer that created the cluster already knows which instance types they use in original request
    instanceTypesFromOriginalRequestMaster = "m5.xlarge"
    instanceTypesFromOriginalRequestCore = "m5.xlarge"
   
    # select new instance types to include in the new createCluster request
    instanceTypesForTask = [
        "m5.xlarge",
        "m5.2xlarge",
        "m5.4xlarge",
        "m5.8xlarge",
        "m5.12xlarge"
    ]
    
    print("Starting to create cluster...")
    instances = {
        "InstanceFleets": [
            {
                "InstanceFleetType":"MASTER",
                "TargetOnDemandCapacity":1,
                "TargetSpotCapacity":0,
                "InstanceTypeConfigs":[
                    {
                        'InstanceType': instanceTypesFromOriginalRequestMaster,
                        "WeightedCapacity":1,
                    }
                ]
            },
            {
                "InstanceFleetType":"CORE",
                "TargetOnDemandCapacity":1,
                "TargetSpotCapacity":0,
                "InstanceTypeConfigs":[
                    {
                        'InstanceType': instanceTypesFromOriginalRequestCore,
                        "WeightedCapacity":1,
                    }
                ]
            },
            {
                "InstanceFleetType":"TASK",
                "TargetOnDemandCapacity":0,
                "TargetSpotCapacity":100,
                "LaunchSpecifications":{},
                "InstanceTypeConfigs":[
                    {
                        'InstanceType': instanceTypesForTask[0],
                        "WeightedCapacity":1,
                    },
                    {
                        'InstanceType': instanceTypesForTask[1],
                        "WeightedCapacity":2,
                    },
                    {
                        'InstanceType': instanceTypesForTask[2],
                        "WeightedCapacity":4,
                    },
                    {
                        'InstanceType': instanceTypesForTask[3],
                        "WeightedCapacity":8,
                    },
                    {
                        'InstanceType': instanceTypesForTask[4],
                        "WeightedCapacity":12,
                    }
                ],
                "ResizeSpecifications": {
                    "SpotResizeSpecification": {
                        "TimeoutDurationMinutes": 30
                    }
                }
            }
        ]
    }
    response = CLIENT.run_job_flow(
        Name="Test Cluster",
        Instances=instances,
        VisibleToAllUsers=True,
        JobFlowRole="EMR_EC2_DefaultRole",
        ServiceRole="EMR_DefaultRole",
        ReleaseLabel="emr-6.10.0",
    )
 
    return response["JobFlowId"]
 
 
# terminated the cluster using clusterId received in an event
def terminate_cluster(event):
    print("Trying to terminate cluster, clusterId: " + event["detail"]["clusterId"])
    response = CLIENT.terminate_job_flows(JobFlowIds=[event["detail"]["clusterId"]])
    print(f"Terminate cluster response: {response}")
 
 
def describe_cluster(event):
    response = CLIENT.describe_cluster(ClusterId=event["detail"]["clusterId"])
    return response
 
 
def lambda_handler(event, context):
    if is_spot_provisioning_timeout_event(event):
        print(
            "Received spot provisioning timeout event for instanceFleet, clusterId: "
            + event["detail"]["clusterId"]
        )
 
        describeClusterResponse = describe_cluster(event)
 
        shouldTerminateCluster = is_cluster_eligible_for_termination(
            event, describeClusterResponse
        )
        if shouldTerminateCluster:
            terminate_cluster(event)
 
            clusterId = create_cluster(event)
            print("Created a new cluster, clusterId: " + clusterId)
        else:
            print(
                "Cluster is not eligible for termination, clusterId: "
                + event["detail"]["clusterId"]
            )
 
    else:
        print("Received event is not spot provisioning timeout event, skipping")
```