diff --git a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp
index bec5710..2c749ff 100644
--- a/hbase-server/src/main/resources/hbase-webapps/master/table.jsp
+++ b/hbase-server/src/main/resources/hbase-webapps/master/table.jsp
@@ -19,9 +19,16 @@
--%>
<%@ page contentType="text/html;charset=UTF-8"
import="static org.apache.commons.lang.StringEscapeUtils.escapeXml"
+ import="com.google.protobuf.ByteString"
+ import="java.util.ArrayList"
import="java.util.TreeMap"
+ import="java.util.List"
+ import="java.util.LinkedHashMap"
import="java.util.Map"
+ import="java.util.Collections"
+ import="java.util.Comparator"
import="org.apache.hadoop.conf.Configuration"
+ import="org.apache.hadoop.util.StringUtils"
import="org.apache.hadoop.hbase.client.HTable"
import="org.apache.hadoop.hbase.client.Admin"
import="org.apache.hadoop.hbase.client.HConnectionManager"
@@ -36,6 +43,8 @@
import="org.apache.hadoop.hbase.util.FSUtils"
import="org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest"
import="org.apache.hadoop.hbase.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState"
+ import="org.apache.hadoop.hbase.protobuf.generated.ClusterStatusProtos"
+ import="org.apache.hadoop.hbase.protobuf.generated.HBaseProtos"
import="org.apache.hadoop.hbase.TableName"
import="org.apache.hadoop.hbase.client.RegionReplicaUtil"
import="org.apache.hadoop.hbase.HBaseConfiguration" %>
@@ -44,6 +53,11 @@
Configuration conf = master.getConfiguration();
MetaTableLocator metaTableLocator = new MetaTableLocator();
String fqtn = request.getParameter("name");
+ String sortKey = request.getParameter("sort");
+ String reverse = request.getParameter("reverse");
+ final boolean reverseOrder = (reverse==null||!reverse.equals("false"));
+ String showWholeKey = request.getParameter("showwhole");
+ final boolean showWhole = (showWholeKey!=null && showWholeKey.equals("true"));
HTable table = null;
String tableHeader;
boolean withReplica = false;
@@ -122,10 +136,10 @@
if ( fqtn != null ) {
table = new HTable(conf, fqtn);
if (table.getTableDescriptor().getRegionReplication() > 1) {
- tableHeader = "
Table Regions
| Name | Region Server | Start Key | End Key | Locality | Requests | ReplicaID |
";
+ tableHeader = "Table Regions
| Name | Region Server | ReadRequests | WriteRequests | StorefileSize | Num.Storefiles | MemSize | Locality | Start Key | End Key | ReplicaID |
";
withReplica = true;
} else {
- tableHeader = "Table Regions
| Name | Region Server | Start Key | End Key | Locality | Requests |
";
+ tableHeader = "Table Regions
| Name | Region Server | ReadRequests | WriteRequests | StorefileSize | Num.Storefiles | MemSize | Locality | Start Key | End Key |
";
}
if ( !readOnly && action != null ) {
%>
@@ -179,16 +193,42 @@ if ( fqtn != null ) {
HRegionInfo.FIRST_META_REGIONINFO, j);
ServerName metaLocation = metaTableLocator.waitMetaRegionLocation(master.getZooKeeper(), j, 1);
for (int i = 0; i < 1; i++) {
- String url = "//" + metaLocation.getHostname() + ":" +
- master.getRegionServerInfoPort(metaLocation) + "/";
+ String url = "";
+ String readReq = "N/A";
+ String writeReq = "N/A";
+ String fileSize = "N/A";
+ String fileCount = "N/A";
+ String memSize = "N/A";
+ float locality = 0.0f;
+
+ if (metaLocation != null) {
+ ServerLoad sl = master.getServerManager().getLoad(metaLocation);
+ url = "//" + metaLocation.getHostname() + ":" + master.getRegionServerInfoPort(metaLocation) + "/";
+ if (sl != null) {
+ Map map = sl.getRegionsLoad();
+ if (map.containsKey(meta.getRegionName())) {
+ RegionLoad load = map.get(meta.getRegionName());
+ readReq = String.format("%,1d", load.getReadRequestsCount());
+ writeReq = String.format("%,1d", load.getWriteRequestsCount());
+ fileSize = StringUtils.byteDesc(load.getStorefileSizeMB()*1024l*1024);
+ fileCount = String.format("%,1d", load.getStorefiles());
+ memSize = StringUtils.byteDesc(load.getMemStoreSizeMB()*1024l*1024);
+ locality = load.getDataLocality();
+ }
+ }
+ }
%>
| <%= escapeXml(meta.getRegionNameAsString()) %> |
<%= metaLocation.getHostname().toString() + ":" + master.getRegionServerInfoPort(metaLocation) %> |
+ <%= readReq%> |
+ <%= writeReq%> |
+ <%= fileSize%> |
+ <%= fileCount%> |
+ <%= memSize%> |
+ <%= locality%> |
<%= escapeXml(Bytes.toString(meta.getStartKey())) %> |
<%= escapeXml(Bytes.toString(meta.getEndKey())) %> |
- - |
- - |
<% } %>
<%} %>
@@ -235,27 +275,263 @@ if ( fqtn != null ) {
<% } %>
<%
+ long totalReadReq = 0;
+ long totalWriteReq = 0;
+ long totalSize = 0;
+ long totalStoreFileCount = 0;
+ long totalMemSize = 0;
+ String urlRegionServer = null;
Map regDistribution = new TreeMap();
Map primaryRegDistribution = new TreeMap();
Map regions = table.getRegionLocations();
- if(regions != null && regions.size() > 0) { %>
-<%= tableHeader %>
-<%
+ Map regionsToLoad = new LinkedHashMap();
for (Map.Entry hriEntry : regions.entrySet()) {
HRegionInfo regionInfo = hriEntry.getKey();
ServerName addr = hriEntry.getValue();
- long req = 0;
- float locality = 0.0f;
- String urlRegionServer = null;
if (addr != null) {
ServerLoad sl = master.getServerManager().getLoad(addr);
if (sl != null) {
Map map = sl.getRegionsLoad();
- if (map.containsKey(regionInfo.getRegionName())) {
- req = map.get(regionInfo.getRegionName()).getRequestsCount();
- locality = map.get(regionInfo.getRegionName()).getDataLocality();
+ RegionLoad regionload = map.get(regionInfo.getRegionName());
+ regionsToLoad.put(regionInfo, regionload);
+ if(regionload != null) {
+ totalReadReq += regionload.getReadRequestsCount();
+ totalWriteReq += regionload.getWriteRequestsCount();
+ totalSize += regionload.getStorefileSizeMB();
+ totalStoreFileCount += regionload.getStorefiles();
+ totalMemSize += regionload.getMemStoreSizeMB();
+ } else {
+ RegionLoad load0 = new RegionLoad(ClusterStatusProtos.RegionLoad.newBuilder().setRegionSpecifier(HBaseProtos.RegionSpecifier.newBuilder().setValue(ByteString.copyFrom(regionInfo.getRegionName())).build()).build());
+ regionsToLoad.put(regionInfo, load0);
}
+ }else{
+ RegionLoad load0 = new RegionLoad(ClusterStatusProtos.RegionLoad.newBuilder().setRegionSpecifier(HBaseProtos.RegionSpecifier.newBuilder().setValue(ByteString.copyFrom(regionInfo.getRegionName())).build()).build());
+ regionsToLoad.put(regionInfo, load0);
+ }
+ }else{
+ RegionLoad load0 = new RegionLoad(ClusterStatusProtos.RegionLoad.newBuilder().setRegionSpecifier(HBaseProtos.RegionSpecifier.newBuilder().setValue(ByteString.copyFrom(regionInfo.getRegionName())).build()).build());
+ regionsToLoad.put(regionInfo, load0);
+ }
+ }
+
+ if(regions != null && regions.size() > 0) { %>
+Table Regions
+Sort As
+
+Ascending
+ShowDetailName&Start/End Key
+
+
+
+
+
+| Name(<%= String.format("%,1d", regions.size())%>) |
+Region Server |
+ReadRequests (<%= String.format("%,1d", totalReadReq)%>) |
+WriteRequests (<%= String.format("%,1d", totalWriteReq)%>) |
+StorefileSize (<%= StringUtils.byteDesc(totalSize*1024l*1024)%>) |
+Num.Storefiles (<%= String.format("%,1d", totalStoreFileCount)%>) |
+MemSize (<%= StringUtils.byteDesc(totalMemSize*1024l*1024)%>) |
+Locality |
+Start Key |
+End Key |
+<%
+ if (withReplica) {
+%>
+ReplicaID |
+<%
+ }
+%>
+
+
+<%
+ List> entryList = new ArrayList>(regionsToLoad.entrySet());
+ if(sortKey != null) {
+ if (sortKey.equals("readrequest")) {
+ Collections.sort(entryList,
+ new Comparator>() {
+ public int compare(
+ Map.Entry entry1,
+ Map.Entry entry2) {
+ if (entry1 == null || entry1.getValue() == null) {
+ return -1;
+ } else if (entry2 == null || entry2.getValue() == null) {
+ return 1;
+ }
+ int result = 0;
+ if (entry1.getValue().getReadRequestsCount() < entry2.getValue().getReadRequestsCount()) {
+ result = -1;
+ } else if (entry1.getValue().getReadRequestsCount() > entry2.getValue().getReadRequestsCount()) {
+ result = 1;
+ }
+ if (reverseOrder) {
+ result = -1 * result;
+ }
+ return result;
+ }
+ });
+ } else if (sortKey.equals("writerequest")) {
+ Collections.sort(entryList,
+ new Comparator>() {
+ public int compare(
+ Map.Entry entry1,
+ Map.Entry entry2) {
+ if (entry1 == null || entry1.getValue() == null) {
+ return -1;
+ } else if (entry2 == null || entry2.getValue() == null) {
+ return 1;
+ }
+ int result = 0;
+ if (entry1.getValue().getWriteRequestsCount() < entry2.getValue()
+ .getWriteRequestsCount()) {
+ result = -1;
+ } else if (entry1.getValue().getWriteRequestsCount() > entry2.getValue()
+ .getWriteRequestsCount()) {
+ result = 1;
+ }
+ if (reverseOrder) {
+ result = -1 * result;
+ }
+ return result;
+ }
+ });
+ } else if (sortKey.equals("size")) {
+ Collections.sort(entryList,
+ new Comparator>() {
+ public int compare(
+ Map.Entry entry1,
+ Map.Entry entry2) {
+ if (entry1 == null || entry1.getValue() == null) {
+ return -1;
+ } else if (entry2 == null || entry2.getValue() == null) {
+ return 1;
+ }
+ int result = 0;
+ if (entry1.getValue().getStorefileSizeMB() < entry2.getValue()
+ .getStorefileSizeMB()) {
+ result = -1;
+ } else if (entry1.getValue().getStorefileSizeMB() > entry2
+ .getValue().getStorefileSizeMB()) {
+ result = 1;
+ }
+ if (reverseOrder) {
+ result = -1 * result;
+ }
+ return result;
+ }
+ });
+ } else if (sortKey.equals("filecount")) {
+ Collections.sort(entryList,
+ new Comparator>() {
+ public int compare(
+ Map.Entry entry1,
+ Map.Entry entry2) {
+ if (entry1 == null || entry1.getValue() == null) {
+ return -1;
+ } else if (entry2 == null || entry2.getValue() == null) {
+ return 1;
+ }
+ int result = 0;
+ if (entry1.getValue().getStorefiles() < entry2.getValue()
+ .getStorefiles()) {
+ result = -1;
+ } else if (entry1.getValue().getStorefiles() > entry2.getValue()
+ .getStorefiles()) {
+ result = 1;
+ }
+ if (reverseOrder) {
+ result = -1 * result;
+ }
+ return result;
+ }
+ });
+ } else if (sortKey.equals("memstore")) {
+ Collections.sort(entryList,
+ new Comparator>() {
+ public int compare(
+ Map.Entry entry1,
+ Map.Entry entry2) {
+ if (entry1 == null || entry1.getValue()==null) {
+ return -1;
+ } else if (entry2 == null || entry2.getValue()==null) {
+ return 1;
+ }
+ int result = 0;
+ if (entry1.getValue().getMemStoreSizeMB() < entry2.getValue()
+ .getMemStoreSizeMB()) {
+ result = -1;
+ } else if (entry1.getValue().getMemStoreSizeMB() > entry2
+ .getValue().getMemStoreSizeMB()) {
+ result = 1;
+ }
+ if (reverseOrder) {
+ result = -1 * result;
+ }
+ return result;
+ }
+ });
+ } else if (sortKey.equals("locality")) {
+ Collections.sort(entryList,
+ new Comparator>() {
+ public int compare(
+ Map.Entry entry1,
+ Map.Entry entry2) {
+ if (entry1 == null || entry1.getValue()==null) {
+ return -1;
+ } else if (entry2 == null || entry2.getValue()==null) {
+ return 1;
+ }
+ int result = 0;
+ if (entry1.getValue().getDataLocality() < entry2.getValue()
+ .getDataLocality()) {
+ result = -1;
+ } else if (entry1.getValue().getDataLocality() > entry2
+ .getValue().getDataLocality()) {
+ result = 1;
+ }
+ if (reverseOrder) {
+ result = -1 * result;
+ }
+ return result;
+ }
+ });
+ }
+ }
+
+ for (Map.Entry hriEntry : entryList) {
+ HRegionInfo regionInfo = hriEntry.getKey();
+ ServerName addr = regions.get(regionInfo);
+ RegionLoad load = hriEntry.getValue();
+ String readReq = "N/A";
+ String writeReq = "N/A";
+ String regionSize = "N/A";
+ String fileCount = "N/A";
+ String memSize = "N/A";
+ float locality = 0.0f;
+ if(load != null) {
+ readReq = String.format("%,1d", load.getReadRequestsCount());
+ writeReq = String.format("%,1d", load.getWriteRequestsCount());
+ regionSize = StringUtils.byteDesc(load.getStorefileSizeMB()*1024l*1024);
+ fileCount = String.format("%,1d", load.getStorefiles());
+ memSize = StringUtils.byteDesc(load.getMemStoreSizeMB()*1024l*1024);
+ locality = load.getDataLocality();
+ }
+
+ if (addr != null) {
+ ServerLoad sl = master.getServerManager().getLoad(addr);
+ // This port might be wrong if RS actually ended up using something else.
+ urlRegionServer =
+ "//" + addr.getHostname() + ":" + master.getRegionServerInfoPort(addr) + "/";
+ if(sl != null) {
Integer i = regDistribution.get(addr);
if (null == i) i = Integer.valueOf(0);
regDistribution.put(addr, i + 1);
@@ -268,13 +544,12 @@ if ( fqtn != null ) {
}
%>
- | <%= escapeXml(Bytes.toStringBinary(regionInfo.getRegionName())) %> |
+ <%= escapeXml(showWhole?Bytes.toStringBinary(regionInfo.getRegionName()):regionInfo.getEncodedName()) %> |
<%
- if (addr != null) {
- String url = "//" + addr.getHostname() + ":" + master.getRegionServerInfoPort(addr) + "/rs-status";
+ if (urlRegionServer != null) {
%>
- <%= addr.getHostname().toString() + ":" + addr.getPort() %>
+ <%= addr.getHostname().toString() + ":" + master.getRegionServerInfoPort(addr) %>
|
<%
} else {
@@ -283,10 +558,14 @@ if ( fqtn != null ) {
<%
}
%>
- <%= escapeXml(Bytes.toStringBinary(regionInfo.getStartKey())) %> |
- <%= escapeXml(Bytes.toStringBinary(regionInfo.getEndKey())) %> |
+ <%= readReq%> |
+ <%= writeReq%> |
+ <%= regionSize%> |
+ <%= fileCount%> |
+ <%= memSize%> |
<%= locality%> |
- <%= req%> |
+ <%= escapeXml(showWhole?Bytes.toStringBinary(regionInfo.getStartKey()):"-")%> |
+ <%= escapeXml(showWhole?Bytes.toStringBinary(regionInfo.getEndKey()):"-")%> |
<%
if (withReplica) {
%>
@@ -315,7 +594,7 @@ if (withReplica) {
String url = "//" + addr.getHostname() + ":" + master.getRegionServerInfoPort(addr) + "/rs-status";
%>
- | <%= addr.getHostname().toString() + ":" + addr.getPort() %> |
+ <%= addr.getHostname().toString() + ":" + master.getRegionServerInfoPort(addr) %> |
<%= rdEntry.getValue()%> |
<%
if (withReplica) {
@@ -395,3 +674,35 @@ Actions: