只要肯尝试,方法总比问题多那么一丢丢~~~~~~~~
首先需要在pom文件中添加如下依赖:
<dependency>
<groupId>com.cloudera.api</groupId>
<artifactId>cloudera-manager-api</artifactId>
<version>5.14.2</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.8</version>
</dependency>
具体的java代码如下:
package adsa.adsa;
import java.io.IOException;
import com.cloudera.api.ClouderaManagerClientBuilder;
import com.cloudera.api.model.ApiHost;
import com.cloudera.api.model.ApiNameservice;
import com.cloudera.api.model.ApiRole;
import com.cloudera.api.model.ApiRoleList;
import com.cloudera.api.v12.RootResourceV12;
//通过调用api获取想要的地址----
public class App {
public static void main( String[] args ) throws IOException{
RootResourceV12 apiRoot = new ClouderaManagerClientBuilder().withHost("10.221.195.221")
.withUsernamePassword("admin", "admin").build().getRootV12();
//得到nameservice
ApiNameservice readNameservice= apiRoot.getClustersResource().getServicesResource("cluster").getNameservicesResource("hdfs").readNameservice("nameservice1");
String roleName = readNameservice.getActive().getRoleName();
System.out.println(roleName);//----获得active namenode的rolename,也就是打印出 活跃的nameservice1的id
ApiRoleList readRoles = apiRoot.getClustersResource().getServicesResource("cluster").getRolesResource("hdfs").readRoles();
for (ApiRole apiRole : readRoles) {
//----根据上面获得的id,和机器服务生成的id进行比对,获取hostId,都是唯一标识
if(roleName.equals(apiRole.getName())){
String hostId = apiRole.getHostRef().getHostId();
System.out.println(hostId);
//-----将hostId传进方法中,获取具体的ip地址,即最后所想要的active namenode的ip地址
ApiHost readHost = apiRoot.getHostsResource().readHost(hostId);
String ipAddress = readHost.getIpAddress();
System.out.println(ipAddress);
}
}
}
}