Quiero automatizar la ejecución de un clúster y puedo usar etiquetas para obtener atributos de una instancia EC2 como su id-instancia.

La documentación en https://docs.aws.amazon .com / cli / latest / reference / emr / create-cluster.html establece que

--etiquetas (lista)

Una lista de etiquetas para asociar con un clúster, que se aplican a cada instancia de Amazon EC2 en el clúster. Las etiquetas son pares clave-valor que consisten en una cadena de clave requerida con un máximo de 128 caracteres y una cadena de valor opcional con un máximo de 256 caracteres.

Puede especificar etiquetas en formato clave = valor o puede agregar una etiqueta sin un valor utilizando solo el nombre de la clave, por ejemplo clave. Use un espacio para separar múltiples etiquetas.

Por lo tanto, esto aplica etiquetas a cada instancia de EC2, incluidos los maestros y esclavos. ¿Cómo puedo discernir qué instancia es el nodo maestro?

Información adicional: Estoy usando el siguiente comando para obtener atributos de aws cli basados en etiquetas donde puede reemplazar el "Nombre" y "Prod" con sus pares de etiquetas clave-valor respectivamente.

aws ec2 describe-instances | jq '.Reservations[].Instances | select(.[].Tags[].Value | startswith("Prod") ) |   select(.[].Tags[].Key == "Name") |   {InstanceId: .[].InstanceId, PublicDnsName: .[].PublicDnsName, State: .[].State, LaunchTime: .[].LaunchTime, Tags: .[].Tags}   | [.]' | jq .[].InstanceId
3
devssh 10 sep. 2018 a las 14:04

3 respuestas

La mejor respuesta

Como notó cuando creó un clúster EMR, las etiquetas son las mismas para todos los nodos (Maestro, Esclavo, Tarea).

Encontrará que este proceso con la AWS CLI es complicado. Mi recomendación es revisar los ejemplos a continuación y luego escribir un programa Python para hacer esto.

Proceso para agregar sus propias etiquetas a las instancias EC2.

PASO 1: enumere sus clústeres de EMR: aws emr list-clusters

Esto generará JSON:

{
    "Clusters": [
        {
            "Id": "j-ABCDEFGHIJKLM",
            "Name": "'MyCluster'",
            "Status": {
                "State": "WAITING",
                "StateChangeReason": {
                    "Message": "Cluster ready after last step completed."
                },
                "Timeline": {
                    "CreationDateTime": 1536626095.303,
                    "ReadyDateTime": 1536626568.482
                }
            },
            "NormalizedInstanceHours": 0
        }
    ]
}

PASO 2: tome nota de la ID del clúster del JSON:

"Id": "j-ABCDEFGHIJKLM",

PASO 3: Describa su clúster EMR: aws emr describe-cluster --cluster-id j-ABCDEFGHIJKLM

Esto generará JSON (he truncado esta salida solo a la sección MASTER):

{
    "Cluster": {
        "Id": "j-ABCDEFGHIJKLM",
        "Name": "'Test01'",
....
        "InstanceGroups": [
            {
                "Id": "ig-2EHOYXFABCDEF",
                "Name": "Master Instance Group",
                "Market": "ON_DEMAND",
                "InstanceGroupType": "MASTER",
                "InstanceType": "m3.xlarge",
                "RequestedInstanceCount": 1,
                "RunningInstanceCount": 1,
                "Status": {
                    "State": "RUNNING",
                    "StateChangeReason": {
                        "Message": ""
                    },
                    "Timeline": {
                        "CreationDateTime": 1536626095.316,
                        "ReadyDateTime": 1536626533.886
                    }
                },
                "Configurations": [],
                "EbsBlockDevices": [],
                "ShrinkPolicy": {}
            },
....
        ]
    }
}

PASO 4: InstanceGroups es una matriz. Encuentre la entrada donde InstanceGroupType es MASTER. Tome nota de Id.

"Id": "ig-2EHOYXFABCDEF",

PASO 5: enumere sus instancias de clúster: aws emr list-instances --cluster-id j-ABCDEFGHIJKLM

Esto generará JSON (he truncado la salida):

{
    "Instances": [
....
        {
            "Id": "ci-31LGK4KIECHNY",
            "Ec2InstanceId": "i-0524ec45912345678",
            "PublicDnsName": "ec2-52-123-201-221.us-west-2.compute.amazonaws.com",
            "PublicIpAddress": "52.123.201.221",
            "PrivateDnsName": "ip-172-31-41-111.us-west-2.compute.internal",
            "PrivateIpAddress": "172.31.41.111",
            "Status": {
                "State": "RUNNING",
                "StateChangeReason": {},
                "Timeline": {
                    "CreationDateTime": 1536626164.073,
                    "ReadyDateTime": 1536626533.886
                }
            },
            "InstanceGroupId": "ig-2EHOYXFABCDEF",
            "Market": "ON_DEMAND",
            "InstanceType": "m3.xlarge",
            "EbsVolumes": []
        }
    ]
}

PASO 6: Encuentre el InstanceGroupId ig-2EHOYXFABCDEF correspondiente. Esto le dará la ID de instancia EC2 para el MAESTRO: "Ec2InstanceId": "i-0524ec45912345678"

Paso 7: etiqueta tu instancia EC2:

aws ec2 create-tags --resources i-0524ec45912345678 --tags Key=EMR,Value=MASTER

Los pasos anteriores pueden ser más simples con CLI Filters y / o jq, pero esto debería ser suficiente información para que sepa cómo encontrar y etiquetar la instancia maestra EMR.

3
John Hanley 11 sep. 2018 a las 01:27

En un entorno donde no tiene el aws cli, puede cat el siguiente archivo:

cat /mnt/var/lib/info/job-flow.json

Un ejemplo del contenido es el siguiente:

{
  "jobFlowId": "j-0000X0X0X00XX",
  "jobFlowCreationInstant": 1579512208006,
  "instanceCount": 2,
  "masterInstanceId": "i-00x0xx0000xxx0x00",
  "masterPrivateDnsName": "localhost",
  "masterInstanceType": "m5.xlarge",
  "slaveInstanceType": "m5.xlarge",
  "hadoopVersion": "2.8.5",
  "instanceGroups": [
    {
      "instanceGroupId": "ig-0XX00XX0X0XXX",
      "instanceGroupName": "Master - 1",
      "instanceRole": "Master",
      "marketType": "OnDemand",
      "instanceType": "m5.xlarge",
      "requestedInstanceCount": 1
    },
    {
      "instanceGroupId": "ig-000X0XXXXXXX",
      "instanceGroupName": "Core - 2",
      "instanceRole": "Core",
      "marketType": "OnDemand",
      "instanceType": "m5.xlarge",
      "requestedInstanceCount": 1
    }
  ]

NOTA: He omitido la ID de los trabajos usando 0 donde se espera un número y X donde se espera un ltter.

1
alessiosavi 9 mar. 2020 a las 09:19

A continuación se puede usar para obtener directamente el Id. De instancia

aws emr list-instances --cluster-id ${aws_emr_cluster.cluster.id} --instance- 
group-id ${aws_emr_cluster.cluster.master_instance_group.0.id}  --query 
'Instances[*].Ec2InstanceId' --output text
1
naval jain 4 dic. 2019 a las 07:54