AWS CLI EMR 获取主节点实例 ID 并标记它

AWS CLI EMR get Master node Instance ID and tag it

我想自动化集群的 运行 并且可以使用标签获取 EC2 实例的属性,例如它的实例 ID。

https://docs.aws.amazon.com/cli/latest/reference/emr/create-cluster.html 上的文档指出

--tags (list)

A list of tags to associate with a cluster, which apply to each Amazon EC2 instance in the cluster. Tags are key-value pairs that consist of a required key string with a maximum of 128 characters, and an optional value string with a maximum of 256 characters.

You can specify tags in key=value format or you can add a tag without a value using only the key name, for example key . Use a space to separate multiple tags.

所以这会将标签应用于每个 EC2 实例,包括主实例和从实例。如何辨别哪个实例是主节点?

附加信息: 我正在使用以下命令根据标签从 aws cli 获取属性,您可以在其中分别用您的标签键值对替换 "Name" 和 "Prod"。

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

正如您在创建 EMR 集群时所指出的,所有节点(主节点、从节点、任务节点)的标签都相同。

您会发现使用 AWS CLI 的这个过程很复杂。我的建议是查看下面的示例,然后编写一个 Python 程序来执行此操作。

将您自己的标签添加到 EC2 实例的过程。

第 1 步:列出您的 EMR 集群: aws emr list-clusters

这将输出 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
        }
    ]
}

第 2 步:记下 JSON:

中的集群 ID
"Id": "j-ABCDEFGHIJKLM",

第 3 步:描述您的 EMR 集群: aws emr describe-cluster --cluster-id j-ABCDEFGHIJKLM

这将输出 JSON(我已将此输出截断为仅 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": {}
            },
....
        ]
    }
}

第 4 步:InstanceGroups 是一个数组。找到 InstanceGroupTypeMASTER 的条目。记下 Id.

"Id": "ig-2EHOYXFABCDEF",

第 5 步:列出您的集群实例: aws emr list-instances --cluster-id j-ABCDEFGHIJKLM

这将输出 JSON(我截断了输出):

{
    "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": []
        }
    ]
}

第 6 步:找到匹配项 InstanceGroupId ig-2EHOYXFABCDEF。这将为您提供 MASTER 的 EC2 实例 ID:"Ec2InstanceId": "i-0524ec45912345678"

第 7 步:标记您的 EC2 实例:

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

使用 CLI Filters 和/或 jq,上述步骤可能会更简单,但这应该足以让您了解如何查找和标记 EMR 主实例。

下面可以直接获取实例Id

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

在您没有aws cli的环境中,您可以cat以下文件:

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

内容示例如下:

{
  "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
    }
  ]

注意:我省略了作业的 ID,在需要数字的地方使用 0,在需要字母的地方使用 X。

以下示例适用于实例队列,它保存了集群ID实例队列ID主 IP 作为环境变量。

将集群名称“My-Cluster”替换为实际的集群名称。

export CLUSTER_ID=$(aws emr list-clusters --active --query 'Clusters[?Name==`My-Cluster`].Id' --output text)
export INSTANCE_FLEET=$(aws emr describe-cluster --cluster-id $CLUSTER_ID | jq -r '.[].InstanceFleets | .[] | select(.InstanceFleetType=="MASTER") | .Id')
export PRIVATE_IP=aws emr list-instances --cluster-id $CLUSTER_ID --instance-fleet-id $INSTANCE_FLEET  --query 'Instances[*].PrivateIpAddress' --output text

您可以通过 3 行代码以编程方式执行此操作,而无需复制粘贴任何特定信息:

# get cluster id
CLUSTER_ID=$(aws emr list-clusters --active --query "Clusters[0].Id" --output text)

# get instance id
INSTANCE_ID=$(aws emr list-instances --cluster-id $CLUSTER_ID --instance-group-types MASTER --query "Instances[0].Ec2InstanceId" --output text)

# tag
aws ec2 create-tags --resources $INSTANCE_ID --tags Key=EMR,Value=MASTER

“最干净”的方式:

aws emr list-clusters --active 

搜索主集群 ID (j-xxxxxxxxxxx),然后

aws emr list-instances --region {your_region} --instance-group-types MASTER --cluster-id j-xxxxxxxxxxxxx

使用 --instance-group-types MASTER 标志立即过滤掉主实例及其信息。

对于标记,请参考带有 aws {resource} create-tags 和 --tag 标志的其他答案。