使用Java SDK从AWS EMR Cluster获取Master公共DNS值

时间:2017-02-21 09:39:49

标签: java amazon-web-services dns aws-sdk amazon-emr

我需要通过Java SDK获取主公共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的get,因为需要完整的toString进行测试。我应该清楚,这种方法确实给了我需要的DNS,但我无法区分它们。

如果我的EMR有4台机器,我不知道实例将在列表中的哪个位置。对于我的基本试用,我只有两台机器,一个主人和一个工人。 .get(0)在连续运行时返回了master和worker的值。

我能够从中获取的信息如下 - 我目前唯一可以看到的选项是使用&#39; ReadyDateTime&#39;作为主人的标识符&#39;应该&#39;我总是先做好准备,但这感觉很糟糕,而且我希望有一个更清洁的解决方案。

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

3 个答案:

答案 0 :(得分:3)

不要使用ListInstances。而是使用DescribeCluster,它返回MasterPublicDnsName。

字段之一

答案 1 :(得分: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();
            }
        }
    }

答案 2 :(得分: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名称的工作代码。

相关问题