2017-02-21 28 views
1

Java SDKを使用してマスター公開DNS値を取得する必要があります。アプリケーションの開始時に私が持っている唯一の情報は静的なClusterNameです。Java SDKを使用してAWS EMRクラスターからマスターパブリックDNS値を取得

これまでのところ私はこれを除外する必要がある他のすべての情報を引き出すことができましたが、残念なことにアプリケーションが成功するためには不可欠です。

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

私が削除したテスト用のフルのtoStringを望んでいたようPublicIpAddressために得る:

この

は、私は現在で働いていたコードです。私はこの方法が私に必要なDNSを与えてくれる点ではっきりしているべきですが、私はそれらの間を区別する方法がありません。

私のEMRに4台のマシンがある場合、リスト内のインスタンスの位置はわかりません。私の基本的な試行では、私は2台のマシン、1名のマスターと1名のワーカーしか持っていません。 .get(0)は、連続実行時にmasterとworkerの両方の値を返しました。

これらから入手できる情報は以下のとおりです。私は現時点で見ることができる唯一の選択肢は、マスター 'は常に最初に準備する必要があるため、識別子として' 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を使用しないでください。代わりに、MasterPublicDnsNameフィールドの1つとして返されるDescribeClusterを使用します。ジョナサンで言及されたものに拡大すること

+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名を取得するための作業コードです。

関連する問題