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 是一个数组。找到 InstanceGroupType
为 MASTER
的条目。记下 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 标志的其他答案。
我想自动化集群的 运行 并且可以使用标签获取 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 是一个数组。找到 InstanceGroupType
为 MASTER
的条目。记下 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 标志的其他答案。