[英]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 是一個數組。 找到InstanceGroupType
為MASTER
的條目。 記下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 ID 、 Instance Fleet ID和Master 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.