2017-02-21 8 views
1

Мне нужно получить главное общедоступное значение DNS через Java SDK. Единственная информация, которую я буду иметь в начале приложения, - это статическое значение ClusterName.Получить общее общедоступное значение DNS из кластера AWS EMR с использованием Java SDK

До сих пор я смог вытащить всю другую информацию, которая мне нужна, за исключением этого и, к сожалению, жизненно важно для приложения, чтобы быть успешным.

Это код, который я в настоящее время работаю с:

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 машины, я не знаю, какую позицию в списке будет Экземпляр. Для моего основного испытания у меня есть только две машины, 1 мастер и рабочий. .get(0) возвратил как значения для мастера, так и работника при последовательных запусках.

Информация, которую я могу получить от них, ниже - моя единственная опция, которую я могу видеть на данный момент, - использовать «ReadyDateTime» в качестве идентификатора, поскольку мастер «должен» всегда быть готов первым, но это чувствует себя взломанным, и я надеялся на более чистое решение.

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

ответ

1

Чтобы расширить то, что было упомянуто Джонатон:

 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(); 
      } 
     } 
    } 
3

Не используйте ListInstances. Вместо этого используйте DescribeCluster, который возвращает как одно из полей MasterPublicDnsName.

+0

Да, я должен был закрыть этот вопрос раньше, спасибо! – null

0
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(); 

Ниже рабочий код, чтобы получить имя публичного DNS.

Смежные вопросы