簡體   English   中英

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(列表)

與集群關聯的標簽列表,適用於集群中的每個 Amazon EC2 實例。 標簽是鍵值對,由最多 128 個字符的必需鍵字符串和最多 256 個字符的可選值字符串組成。

您可以以 key=value 格式指定標簽,也可以僅使用鍵名稱添加沒有值的標簽,例如 key 。 使用空格分隔多個標簽。

因此,這會將標簽應用於每個 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 aws emr list-clusters :列出您的 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 aws emr describe-cluster --cluster-id j-ABCDEFGHIJKLM :描述您的 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 :列出您的集群實例: 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 主實例。

下面可以直接獲取instance 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 表示需要 ltter。

下面的示例是Instance Fleet ,它將Cluster IDInstance Fleet IDMaster 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM