使用 Java SDK 从 AWS EMR 集群获取 Master public DNS 值
Obtain Master public DNS value from AWS EMR Cluster using the Java SDK
我需要通过 Java SDK 获取主 public DNS 值。我将在应用程序开始时获得的唯一信息是静态的 ClusterName。
到目前为止,我已经能够提取我需要的所有其他信息,但不幸的是,这对于申请成功至关重要。
这是我目前正在使用的代码:
List<ClusterSummary> summaries = clusters.getClusters();
for (ClusterSummary cs: summaries) {
if (cs.getName().equals("test") && WHITELIST.contains(cs.getStatus().getState())) {
ListInstancesResult instances = emr.listInstances(new ListInstancesRequest().withClusterId(cs.getId()));
clusterHostName = instances.getInstances().get(0).toString();
jobFlowId = cs.getId();
}
}
我删除了 PublicIpAddress 的获取,因为需要完整的 toString 进行测试。我应该清楚,这种方法确实为我提供了我需要的 DNS,但我无法区分它们。
如果我的EMR有4台机器,我不知道Instance在列表中的哪个位置。对于我的基本试用,我只有两台机器,一台主机和一台工人。 .get(0)
在连续运行中返回了 master 和 worker 的值。
我能够从这些中获得的信息如下 - 我目前唯一能看到的选择是始终使用 'ReadyDateTime' 作为主 'should' 的标识符先做好准备,但这感觉很老套,我希望有一个更简洁的解决方案。
{Id: id,
Ec2InstanceId: id,
PublicDnsName: ec2-54--143.compute-1.amazonaws.com,
PublicIpAddress: 54..143,
PrivateDnsName: ip-10--158.ec2.internal,
PrivateIpAddress: 10..158,
Status: {State: RUNNING,StateChangeReason: {},
Timeline: {CreationDateTime: Tue Feb 21 09:18:08 GMT 2017,
ReadyDateTime: Tue Feb 21 09:25:11 GMT 2017,}},
InstanceGroupId: id,
EbsVolumes: []}
{Id: id,
Ec2InstanceId: id,
PublicDnsName: ec2-54--33.compute-1.amazonaws.com,
PublicIpAddress: 54..33,
PrivateDnsName: ip-10--95.ec2.internal,
PrivateIpAddress: 10..95,
Status: {State: RUNNING,StateChangeReason: {},
Timeline: {CreationDateTime: Tue Feb 21 09:18:08 GMT 2017,
ReadyDateTime: Tue Feb 21 09:22:48 GMT 2017,}},
InstanceGroupId: id
EbsVolumes: []}
不要使用 ListInstances。相反,使用 DescribeCluster,returns 作为 MasterPublicDnsName.
字段之一
扩展 Jonathon 提到的内容:
AmazonEC2Client ec2 = new AmazonEC2Client(cred);
DescribeInstancesResult describeInstancesResult = ec2.describeInstances(new DescribeInstancesRequest().withInstanceIds(clusterInstanceIds));
List<Reservation> reservations = describeInstancesResult.getReservations();
for (Reservation res : reservations) {
for (GroupIdentifier group : res.getGroups()) {
if (group.getGroupName().equals("ElasticMapReduce-master")) { // yaaaaaaaaah, Wahay!
masterDNS = res.getInstances().get(0).getPublicDnsName();
}
}
}
AWSCredentials credentials_profile = null;
credentials_profile = new
DefaultAWSCredentialsProviderChain().getCredentials();
AmazonElasticMapReduceClient emr = new
AmazonElasticMapReduceClient(credentials_profile);
Region euWest1 = Region.getRegion(Regions.US_EAST_1);
emr.setRegion(euWest1);
DescribeClusterFunction fun = new DescribeClusterFunction(emr);
DescribeClusterResult res = fun.apply(new
DescribeClusterRequest().withClusterId(clusterId));
String publicDNSName =res.getCluster().getMasterPublicDnsName();
下面是获取 public DNS 名称的工作代码。
我需要通过 Java SDK 获取主 public DNS 值。我将在应用程序开始时获得的唯一信息是静态的 ClusterName。
到目前为止,我已经能够提取我需要的所有其他信息,但不幸的是,这对于申请成功至关重要。
这是我目前正在使用的代码:
List<ClusterSummary> summaries = clusters.getClusters();
for (ClusterSummary cs: summaries) {
if (cs.getName().equals("test") && WHITELIST.contains(cs.getStatus().getState())) {
ListInstancesResult instances = emr.listInstances(new ListInstancesRequest().withClusterId(cs.getId()));
clusterHostName = instances.getInstances().get(0).toString();
jobFlowId = cs.getId();
}
}
我删除了 PublicIpAddress 的获取,因为需要完整的 toString 进行测试。我应该清楚,这种方法确实为我提供了我需要的 DNS,但我无法区分它们。
如果我的EMR有4台机器,我不知道Instance在列表中的哪个位置。对于我的基本试用,我只有两台机器,一台主机和一台工人。 .get(0)
在连续运行中返回了 master 和 worker 的值。
我能够从这些中获得的信息如下 - 我目前唯一能看到的选择是始终使用 'ReadyDateTime' 作为主 'should' 的标识符先做好准备,但这感觉很老套,我希望有一个更简洁的解决方案。
{Id: id,
Ec2InstanceId: id,
PublicDnsName: ec2-54--143.compute-1.amazonaws.com,
PublicIpAddress: 54..143,
PrivateDnsName: ip-10--158.ec2.internal,
PrivateIpAddress: 10..158,
Status: {State: RUNNING,StateChangeReason: {},
Timeline: {CreationDateTime: Tue Feb 21 09:18:08 GMT 2017,
ReadyDateTime: Tue Feb 21 09:25:11 GMT 2017,}},
InstanceGroupId: id,
EbsVolumes: []}
{Id: id,
Ec2InstanceId: id,
PublicDnsName: ec2-54--33.compute-1.amazonaws.com,
PublicIpAddress: 54..33,
PrivateDnsName: ip-10--95.ec2.internal,
PrivateIpAddress: 10..95,
Status: {State: RUNNING,StateChangeReason: {},
Timeline: {CreationDateTime: Tue Feb 21 09:18:08 GMT 2017,
ReadyDateTime: Tue Feb 21 09:22:48 GMT 2017,}},
InstanceGroupId: id
EbsVolumes: []}
不要使用 ListInstances。相反,使用 DescribeCluster,returns 作为 MasterPublicDnsName.
字段之一扩展 Jonathon 提到的内容:
AmazonEC2Client ec2 = new AmazonEC2Client(cred);
DescribeInstancesResult describeInstancesResult = ec2.describeInstances(new DescribeInstancesRequest().withInstanceIds(clusterInstanceIds));
List<Reservation> reservations = describeInstancesResult.getReservations();
for (Reservation res : reservations) {
for (GroupIdentifier group : res.getGroups()) {
if (group.getGroupName().equals("ElasticMapReduce-master")) { // yaaaaaaaaah, Wahay!
masterDNS = res.getInstances().get(0).getPublicDnsName();
}
}
}
AWSCredentials credentials_profile = null;
credentials_profile = new
DefaultAWSCredentialsProviderChain().getCredentials();
AmazonElasticMapReduceClient emr = new
AmazonElasticMapReduceClient(credentials_profile);
Region euWest1 = Region.getRegion(Regions.US_EAST_1);
emr.setRegion(euWest1);
DescribeClusterFunction fun = new DescribeClusterFunction(emr);
DescribeClusterResult res = fun.apply(new
DescribeClusterRequest().withClusterId(clusterId));
String publicDNSName =res.getCluster().getMasterPublicDnsName();
下面是获取 public DNS 名称的工作代码。