From e466a1bf13f8e27afc6521f91deb8ac93631bc99 Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 21 Feb 2019 16:19:21 +0800 Subject: [PATCH] HBASE-21938 Add a new ClusterMetrics.Option SERVERS_NAME to only return the live region servers's name without metrics --- .../org/apache/hadoop/hbase/ClusterMetrics.java | 8 ++++- .../apache/hadoop/hbase/ClusterMetricsBuilder.java | 35 ++++++++++++++++++++-- .../org/apache/hadoop/hbase/ClusterStatus.java | 20 +++++++++++-- .../src/main/protobuf/ClusterStatus.proto | 2 ++ .../org/apache/hadoop/hbase/master/HMaster.java | 6 ++++ .../hadoop/hbase/TestClientClusterMetrics.java | 7 ++++- .../hadoop/hbase/TestClientClusterStatus.java | 7 +++-- 7 files changed, 76 insertions(+), 9 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetrics.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetrics.java index 103c107..acced3e 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetrics.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetrics.java @@ -139,6 +139,8 @@ public interface ClusterMetrics { int getMasterInfoPort(); + List getServersName(); + /** * @return the average cluster load */ @@ -193,6 +195,10 @@ public interface ClusterMetrics { /** * metrics info port */ - MASTER_INFO_PORT + MASTER_INFO_PORT, + /** + * metrics about live region servers name + */ + SERVERS_NAME } } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetricsBuilder.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetricsBuilder.java index ab6d353..e767054 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetricsBuilder.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterMetricsBuilder.java @@ -33,6 +33,7 @@ import org.apache.hbase.thirdparty.com.google.common.base.Preconditions; import org.apache.hbase.thirdparty.com.google.protobuf.UnsafeByteOperations; import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos; +import org.apache.hadoop.hbase.shaded.protobuf.generated.ClusterStatusProtos.Option; import org.apache.hadoop.hbase.shaded.protobuf.generated.FSProtos; import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos; @@ -67,7 +68,9 @@ public final class ClusterMetricsBuilder { .setRegionState(r.convert()) .build()) .collect(Collectors.toList())) - .setMasterInfoPort(metrics.getMasterInfoPort()); + .setMasterInfoPort(metrics.getMasterInfoPort()) + .addAllServersName(metrics.getServersName().stream().map(ProtobufUtil::toServerName) + .collect(Collectors.toList())); if (metrics.getMasterName() != null) { builder.setMaster(ProtobufUtil.toServerName((metrics.getMasterName()))); } @@ -103,6 +106,8 @@ public final class ClusterMetricsBuilder { .collect(Collectors.toList())) .setMasterCoprocessorNames(proto.getMasterCoprocessorsList().stream() .map(HBaseProtos.Coprocessor::getName) + .collect(Collectors.toList())) + .setServerNames(proto.getServersNameList().stream().map(ProtobufUtil::toServerName) .collect(Collectors.toList())); if (proto.hasClusterId()) { builder.setClusterId(ClusterId.convert(proto.getClusterId()).toString()); @@ -142,6 +147,7 @@ public final class ClusterMetricsBuilder { case MASTER: return ClusterMetrics.Option.MASTER; case BACKUP_MASTERS: return ClusterMetrics.Option.BACKUP_MASTERS; case BALANCER_ON: return ClusterMetrics.Option.BALANCER_ON; + case SERVERS_NAME: return ClusterMetrics.Option.SERVERS_NAME; case MASTER_INFO_PORT: return ClusterMetrics.Option.MASTER_INFO_PORT; // should not reach here default: throw new IllegalArgumentException("Invalid option: " + option); @@ -164,6 +170,7 @@ public final class ClusterMetricsBuilder { case MASTER: return ClusterStatusProtos.Option.MASTER; case BACKUP_MASTERS: return ClusterStatusProtos.Option.BACKUP_MASTERS; case BALANCER_ON: return ClusterStatusProtos.Option.BALANCER_ON; + case SERVERS_NAME: return Option.SERVERS_NAME; case MASTER_INFO_PORT: return ClusterStatusProtos.Option.MASTER_INFO_PORT; // should not reach here default: throw new IllegalArgumentException("Invalid option: " + option); @@ -206,6 +213,7 @@ public final class ClusterMetricsBuilder { @Nullable private Boolean balancerOn; private int masterInfoPort; + private List serversName = Collections.emptyList(); private ClusterMetricsBuilder() { } @@ -251,6 +259,10 @@ public final class ClusterMetricsBuilder { this.masterInfoPort = value; return this; } + public ClusterMetricsBuilder setServerNames(List serversName) { + this.serversName = serversName; + return this; + } public ClusterMetrics build() { return new ClusterMetricsImpl( hbaseVersion, @@ -262,7 +274,8 @@ public final class ClusterMetricsBuilder { clusterId, masterCoprocessorNames, balancerOn, - masterInfoPort); + masterInfoPort, + serversName); } private static class ClusterMetricsImpl implements ClusterMetrics { @Nullable @@ -279,6 +292,7 @@ public final class ClusterMetricsBuilder { @Nullable private final Boolean balancerOn; private final int masterInfoPort; + private final List serversName; ClusterMetricsImpl(String hbaseVersion, List deadServerNames, Map liveServerMetrics, @@ -288,7 +302,8 @@ public final class ClusterMetricsBuilder { String clusterId, List masterCoprocessorNames, Boolean balancerOn, - int masterInfoPort) { + int masterInfoPort, + List serversName) { this.hbaseVersion = hbaseVersion; this.deadServerNames = Preconditions.checkNotNull(deadServerNames); this.liveServerMetrics = Preconditions.checkNotNull(liveServerMetrics); @@ -299,6 +314,7 @@ public final class ClusterMetricsBuilder { this.masterCoprocessorNames = Preconditions.checkNotNull(masterCoprocessorNames); this.balancerOn = balancerOn; this.masterInfoPort = masterInfoPort; + this.serversName = serversName; } @Override @@ -352,6 +368,11 @@ public final class ClusterMetricsBuilder { } @Override + public List getServersName() { + return Collections.unmodifiableList(serversName); + } + + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("Master: " + getMasterName()); @@ -391,6 +412,14 @@ public final class ClusterMetricsBuilder { sb.append("\n " + state.toDescriptiveString()); } } + + int serversNameSize = getServersName().size(); + sb.append("\nNumber of live region servers: " + serversNameSize); + if (serversSize > 0) { + for (ServerName serverName : getServersName()) { + sb.append("\n " + serverName.getServerName()); + } + } return sb.toString(); } } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java index f13de1e..270ab8e 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ClusterStatus.java @@ -91,7 +91,8 @@ public class ClusterStatus implements ClusterMetrics { final List rit, final String[] masterCoprocessors, final Boolean balancerOn, - final int masterInfoPort) { + final int masterInfoPort, + final List serversName) { // TODO: make this constructor private this(ClusterMetricsBuilder.newBuilder().setHBaseVersion(hbaseVersion) .setDeadServerNames(new ArrayList<>(deadServers)) @@ -103,6 +104,7 @@ public class ClusterStatus implements ClusterMetrics { .setMasterName(master) .setMasterInfoPort(masterInfoPort) .setRegionsInTransition(rit) + .setServerNames(serversName) .build()); } @@ -219,7 +221,8 @@ public class ClusterStatus implements ClusterMetrics { Objects.equal(getMaster(), other.getMaster()) && getBackupMasters().containsAll(other.getBackupMasters()) && Objects.equal(getClusterId(), other.getClusterId()) && - getMasterInfoPort() == other.getMasterInfoPort(); + getMasterInfoPort() == other.getMasterInfoPort() && + getServersName().containsAll(other.getServersName()); } @Override @@ -345,6 +348,11 @@ public class ClusterStatus implements ClusterMetrics { } @Override + public List getServersName() { + return metrics.getServersName(); + } + + @Override public String toString() { StringBuilder sb = new StringBuilder(1024); sb.append("Master: " + metrics.getMasterName()); @@ -384,6 +392,14 @@ public class ClusterStatus implements ClusterMetrics { sb.append("\n " + state.toDescriptiveString()); } } + + int serversNameSize = getServersName().size(); + sb.append("\nNumber of live region servers: " + serversNameSize); + if (serversSize > 0) { + for (ServerName serverName : metrics.getServersName()) { + sb.append("\n " + serverName.getServerName()); + } + } return sb.toString(); } } diff --git a/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto b/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto index d39db36..c98bedc 100644 --- a/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto +++ b/hbase-protocol-shaded/src/main/protobuf/ClusterStatus.proto @@ -232,6 +232,7 @@ message ClusterStatus { repeated ServerName backup_masters = 8; optional bool balancer_on = 9; optional int32 master_info_port = 10 [default = -1]; + repeated ServerName servers_name = 11; } enum Option { @@ -245,4 +246,5 @@ enum Option { REGIONS_IN_TRANSITION = 7; BALANCER_ON = 8; MASTER_INFO_PORT = 9; + SERVERS_NAME = 10; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 9d2a743..5a449a0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -2801,6 +2801,12 @@ public class HMaster extends HRegionServer implements MasterServices { } break; } + case SERVERS_NAME: { + if (serverManager != null) { + builder.setServerNames(serverManager.getOnlineServersList()); + } + break; + } } } return builder.build(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClientClusterMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClientClusterMetrics.java index ff04bb2..2ea03a6 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClientClusterMetrics.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestClientClusterMetrics.java @@ -96,6 +96,7 @@ public class TestClientClusterMetrics { Assert.assertEquals(origin.getLiveServerMetrics().size(), defaults.getLiveServerMetrics().size()); Assert.assertEquals(origin.getMasterInfoPort(), defaults.getMasterInfoPort()); + Assert.assertEquals(origin.getServersName().size(), defaults.getServersName().size()); } @Test @@ -121,6 +122,7 @@ public class TestClientClusterMetrics { Assert.assertEquals(origin.getLiveServerMetrics().size(), defaults.getLiveServerMetrics().size()); Assert.assertEquals(origin.getMasterInfoPort(), defaults.getMasterInfoPort()); + Assert.assertEquals(origin.getServersName().size(), defaults.getServersName().size()); } } @@ -146,7 +148,8 @@ public class TestClientClusterMetrics { } }); // Retrieve live servers and dead servers info. - EnumSet