You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ja...@apache.org on 2015/06/10 23:49:37 UTC

ambari git commit: AMBARI-11821. With HBase master HA Ambari sometimes displays incorrect dashboard information. (jaimin)

Repository: ambari
Updated Branches:
  refs/heads/branch-2.1 96f64f680 -> 83ce96d76


AMBARI-11821. With HBase master HA Ambari sometimes displays incorrect dashboard information. (jaimin)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/83ce96d7
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/83ce96d7
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/83ce96d7

Branch: refs/heads/branch-2.1
Commit: 83ce96d760d653fd07eef286226ef1a387f7bfaa
Parents: 96f64f6
Author: Jaimin Jetly <ja...@hortonworks.com>
Authored: Wed Jun 10 14:49:03 2015 -0700
Committer: Jaimin Jetly <ja...@hortonworks.com>
Committed: Wed Jun 10 14:49:03 2015 -0700

----------------------------------------------------------------------
 .../YARN/2.1.0.2.0/YARN_metrics.json            |  10 +-
 .../assets/data/metrics/HBASE/definition.json   |  15 --
 .../app/controllers/global/update_controller.js |  23 ++-
 .../app/mappers/service_metrics_mapper.js       | 150 ++++++++++---------
 ambari-web/app/messages.js                      |   1 -
 ambari-web/app/models/service/hbase.js          |   2 -
 ambari-web/app/models/service/mapreduce2.js     |   1 -
 ambari-web/app/models/service/yarn.js           |   1 -
 .../global/update_controller_test.js            |  19 ++-
 ambari-web/test/mappers/service_mapper_test.js  | 104 ++++++++++---
 10 files changed, 189 insertions(+), 137 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/YARN_metrics.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/YARN_metrics.json b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/YARN_metrics.json
index 92c32d8..9ea1483 100644
--- a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/YARN_metrics.json
+++ b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/YARN_metrics.json
@@ -1842,11 +1842,6 @@
               "pointInTime": true,
               "temporal": false
             },
-            "metrics/jvm/startTime": {
-              "metric": "java.lang:type=Runtime.StartTime",
-              "pointInTime": true,
-              "temporal": false
-            },
             "metrics/yarn/Queue/$1.replaceAll(\",q(\\d+)=\",\"/\").substring(1)/ActiveApplications": {
               "metric": "Hadoop:service=ResourceManager,name=QueueMetrics(.+).ActiveApplications",
               "pointInTime": true,
@@ -2533,6 +2528,11 @@
               "pointInTime": true,
               "temporal": false
             },
+            "metrics/runtime/StartTime": {
+              "metric": "java.lang:type=Runtime.StartTime",
+              "pointInTime": true,
+              "temporal": false
+            },
             "metrics/jvm/memHeapCommittedM": {
               "metric": "Hadoop:service=ResourceManager,name=JvmMetrics.MemHeapCommittedM",
               "pointInTime": true,

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/app/assets/data/metrics/HBASE/definition.json
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/metrics/HBASE/definition.json b/ambari-web/app/assets/data/metrics/HBASE/definition.json
index 3374f2d..6837f7a 100644
--- a/ambari-web/app/assets/data/metrics/HBASE/definition.json
+++ b/ambari-web/app/assets/data/metrics/HBASE/definition.json
@@ -3916,11 +3916,6 @@
                           "temporal" : false,
                           "name" : "hadoop:service=HBase,name=RPCStatistics.deleteTableNumOps"
                         },
-                        "ServiceComponentInfo/Revision" : {
-                          "pointInTime" : true,
-                          "temporal" : false,
-                          "name" : "hadoop:service=HBase,name=Info.revision"
-                        },
                         "metrics/rpc/splitRegionAvgTime" : {
                           "pointInTime" : true,
                           "temporal" : false,
@@ -4131,11 +4126,6 @@
                           "temporal" : false,
                           "name" : "hadoop:service=HBase,name=RPCStatistics.multiMinTime"
                         },
-                        "metrics/hbase/master/revision" : {
-                          "pointInTime" : true,
-                          "temporal" : false,
-                          "name" : "hadoop:service=HBase,name=Info.revision"
-                        },
                         "metrics/rpc/modifyColumnMaxTime" : {
                           "pointInTime" : true,
                           "temporal" : false,
@@ -7279,11 +7269,6 @@
                           "temporal" : false,
                           "name" : "hadoop:service=HBase,name=RPCStatistics.multiMinTime"
                         },
-                        "metrics/hbase/master/revision" : {
-                          "pointInTime" : true,
-                          "temporal" : false,
-                          "name" : "hadoop:service=HBase,name=Info.revision"
-                        },
                         "metrics/rpc/modifyColumnMaxTime" : {
                           "pointInTime" : true,
                           "temporal" : false,

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/app/controllers/global/update_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js
index af7b69e..d03a53b 100644
--- a/ambari-web/app/controllers/global/update_controller.js
+++ b/ambari-web/app/controllers/global/update_controller.js
@@ -371,10 +371,6 @@ App.UpdateController = Em.Controller.extend({
       haComponents = App.get('isHaEnabled') ? 'ServiceComponentInfo/component_name=JOURNALNODE|ServiceComponentInfo/component_name=ZKFC|' : '',
       realUrl = '/components/?' + flumeHandlerParam + atsHandlerParam + haComponents +
         'ServiceComponentInfo/category=MASTER&fields=' +
-        'ServiceComponentInfo/Version,' +
-        'ServiceComponentInfo/StartTime,' +
-        'ServiceComponentInfo/HeapMemoryUsed,' +
-        'ServiceComponentInfo/HeapMemoryMax,' +
         'ServiceComponentInfo/service_name,' +
         'host_components/HostRoles/host_name,' +
         'host_components/HostRoles/state,' +
@@ -421,17 +417,16 @@ App.UpdateController = Em.Controller.extend({
     var serviceSpecificParams = {
       'FLUME': "host_components/processes/HostComponentProcess",
       'YARN': "host_components/metrics/yarn/Queue," +
-        "ServiceComponentInfo/rm_metrics/cluster/activeNMcount," +
-        "ServiceComponentInfo/rm_metrics/cluster/lostNMcount," +
-        "ServiceComponentInfo/rm_metrics/cluster/unhealthyNMcount," +
-        "ServiceComponentInfo/rm_metrics/cluster/rebootedNMcount," +
-        "ServiceComponentInfo/rm_metrics/cluster/decommissionedNMcount",
+        "host_components/metrics/yarn/ClusterMetrics/NumActiveNMs," +
+        "host_components/metrics/yarn/ClusterMetrics/NumLostNMs," +
+        "host_components/metrics/yarn/ClusterMetrics/NumUnhealthyNMs," +
+        "host_components/metrics/yarn/ClusterMetrics/NumRebootedNMs," +
+        "host_components/metrics/yarn/ClusterMetrics/NumDecommissionedNMs",
       'HBASE': "host_components/metrics/hbase/master/IsActiveMaster," +
-        "ServiceComponentInfo/MasterStartTime," +
-        "ServiceComponentInfo/MasterActiveTime," +
-        "ServiceComponentInfo/AverageLoad," +
-        "ServiceComponentInfo/Revision," +
-        "ServiceComponentInfo/RegionsInTransition",
+        "host_components/metrics/hbase/master/MasterStartTime," +
+        "host_components/metrics/hbase/master/MasterActiveTime," +
+        "host_components/metrics/hbase/master/AverageLoad," +
+        "host_components/metrics/master/AssignmentManger/ritCount",
       'STORM': /^2.1/.test(App.get('currentStackVersionNumber')) ? 'metrics/api/cluster/summary' : 'metrics/api/v1/cluster/summary,metrics/api/v1/topology/summary'
     };
     var services = App.cache['services'];

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/app/mappers/service_metrics_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/service_metrics_mapper.js b/ambari-web/app/mappers/service_metrics_mapper.js
index 9c39fc6..1ce43df 100644
--- a/ambari-web/app/mappers/service_metrics_mapper.js
+++ b/ambari-web/app/mappers/service_metrics_mapper.js
@@ -31,7 +31,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     passive_state: 'ServiceInfo.passive_state',
     critical_alerts_count: 'ServiceInfo.critical_alerts_count',
     $rand: Math.random(),
-    $alerts: [ 1, 2, 3 ],
+    $alerts: [1, 2, 3],
     host_components: 'host_components',
     tool_tip_content: 'tool_tip_content',
     installed_clients: 'installed_clients',
@@ -72,8 +72,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     nfs_gateways_total: 'nfs_gateways_total'
   },
   yarnConfig: {
-    version: 'resourceManagerComponent.ServiceComponentInfo.Version',
-    resource_manager_start_time: 'resourceManagerComponent.ServiceComponentInfo.StartTime',
+    resource_manager_start_time: 'resourceManagerComponent.host_components[0].metrics.runtime.StartTime',
     jvm_memory_heap_used: 'resourceManagerComponent.host_components[0].metrics.jvm.HeapMemoryUsed',
     jvm_memory_heap_max: 'resourceManagerComponent.host_components[0].metrics.jvm.HeapMemoryMax',
     containers_allocated: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AllocatedContainers',
@@ -85,11 +84,11 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     apps_completed: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsCompleted',
     apps_killed: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsKilled',
     apps_failed: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AppsFailed',
-    node_managers_count_active: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.activeNMcount',
-    node_managers_count_lost: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.lostNMcount',
-    node_managers_count_unhealthy: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.unhealthyNMcount',
-    node_managers_count_rebooted: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.rebootedNMcount',
-    node_managers_count_decommissioned: 'resourceManagerComponent.ServiceComponentInfo.rm_metrics.cluster.decommissionedNMcount',
+    node_managers_count_active: 'resourceManagerComponent.host_components[0].metrics.yarn.ClusterMetrics.NumActiveNMs',
+    node_managers_count_lost: 'resourceManagerComponent.host_components[0].metrics.yarn.ClusterMetrics.NumLostNMs',
+    node_managers_count_unhealthy: 'resourceManagerComponent.host_components[0].metrics.yarn.ClusterMetrics.NumUnhealthyNMs',
+    node_managers_count_rebooted: 'resourceManagerComponent.host_components[0].metrics.yarn.ClusterMetrics.NumRebootedNMs',
+    node_managers_count_decommissioned: 'resourceManagerComponent.host_components[0].metrics.yarn.ClusterMetrics.NumDecommissionedNMs',
     allocated_memory: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AllocatedMB',
     available_memory: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.AvailableMB',
     reserved_memory: 'resourceManagerComponent.host_components[0].metrics.yarn.Queue.root.ReservedMB',
@@ -99,18 +98,15 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     node_managers_total: 'node_managers_total'
   },
   mapReduce2Config: {
-    version: 'jobHistoryServerComponent.ServiceComponentInfo.Version',
     map_reduce2_clients: 'map_reduce2_clients'
   },
   hbaseConfig: {
-    version: 'masterComponent.ServiceComponentInfo.Version',
-    master_start_time: 'masterComponent.ServiceComponentInfo.MasterStartTime',
-    master_active_time: 'masterComponent.ServiceComponentInfo.MasterActiveTime',
-    average_load: 'masterComponent.ServiceComponentInfo.AverageLoad',
+    master_start_time: 'masterComponent.host_components[0].metrics.hbase.master.MasterStartTime',
+    master_active_time: 'masterComponent.host_components[0].metrics.hbase.master.MasterActiveTime',
+    average_load: 'masterComponent.host_components[0].metrics.hbase.master.AverageLoad',
+    heap_memory_used: 'masterComponent.host_components[0].metrics.jvm.HeapMemoryUsed',
+    heap_memory_max: 'masterComponent.host_components[0].metrics.jvm.HeapMemoryMax',
     regions_in_transition: 'regions_in_transition',
-    revision: 'masterComponent.ServiceComponentInfo.Revision',
-    heap_memory_used: 'masterComponent.ServiceComponentInfo.HeapMemoryUsed',
-    heap_memory_max: 'masterComponent.ServiceComponentInfo.HeapMemoryMax',
     region_servers_started: 'region_servers_started',
     region_servers_installed: 'region_servers_installed',
     region_servers_total: 'region_servers_total',
@@ -147,7 +143,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
   config3: {
     id: 'id',
     work_status: 'HostRoles.state',
-    passive_state:'HostRoles.maintenance_state',
+    passive_state: 'HostRoles.maintenance_state',
     desired_status: 'HostRoles.desired_state',
     component_name: 'HostRoles.component_name',
     host_id: 'HostRoles.host_name',
@@ -173,11 +169,11 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
        * services contains constructed service-components structure from components array
        */
 
-      services.forEach(function(service) {
+      services.forEach(function (service) {
         service.host_components = [];
         service.components = [];
       });
-      
+
       json.items.forEach(function (component) {
         var serviceName = component.ServiceComponentInfo.service_name;
         var service = services.findProperty('ServiceInfo.service_name', serviceName);
@@ -266,23 +262,23 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       //load services to model
       App.store.loadMany(this.get('model'), result);
       /*if (previousResponse.length !== result.length) {
-        App.store.loadMany(this.get('model'), result);
-      } else {
-        result.forEach(function (serviceJson) {
-          var fields = ['passive_state','work_status', 'rand', 'alerts', 'quick_links', 'host_components', 'tool_tip_content', 'critical_alerts_count'];
-          var service = this.get('model').find(serviceJson.id);
-          var modifiedData = this.getDiscrepancies(serviceJson, previousResponse.findProperty('id', serviceJson.id), fields);
-          if (modifiedData.isLoadNeeded) {
-            App.store.load(this.get('model'), serviceJson);
-          } else {
-            for (var property in modifiedData) {
-              service.set(stringUtils.underScoreToCamelCase(property), modifiedData[property]);
-            }
-          }
-        }, this)
-      }
+       App.store.loadMany(this.get('model'), result);
+       } else {
+       result.forEach(function (serviceJson) {
+       var fields = ['passive_state','work_status', 'rand', 'alerts', 'quick_links', 'host_components', 'tool_tip_content', 'critical_alerts_count'];
+       var service = this.get('model').find(serviceJson.id);
+       var modifiedData = this.getDiscrepancies(serviceJson, previousResponse.findProperty('id', serviceJson.id), fields);
+       if (modifiedData.isLoadNeeded) {
+       App.store.load(this.get('model'), serviceJson);
+       } else {
+       for (var property in modifiedData) {
+       service.set(stringUtils.underScoreToCamelCase(property), modifiedData[property]);
+       }
+       }
+       }, this)
+       }
 
-      previousResponse = result;*/
+       previousResponse = result;*/
     }
     console.timeEnd('App.serviceMetricsMapper execution time');
   },
@@ -298,7 +294,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     services.setEach('tool_tip_content', '');
     // set tooltip for client-only services
     var clientOnlyServiceNames = App.get('services.clientOnly');
-    clientOnlyServiceNames.forEach(function(serviceName) {
+    clientOnlyServiceNames.forEach(function (serviceName) {
       var service = services.findProperty('ServiceInfo.service_name', serviceName);
       if (service) {
         service.tool_tip_content = Em.I18n.t('services.service.summary.clientOnlyService.ToolTip');
@@ -357,8 +353,8 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
    * @param finalJson
    * @param item
    */
-  mapQuickLinks: function (finalJson, item){
-    if(!(item && item.ServiceInfo)) return;
+  mapQuickLinks: function (finalJson, item) {
+    if (!(item && item.ServiceInfo)) return;
     var quickLinks = {
       OOZIE: [19],
       GANGLIA: [20],
@@ -377,10 +373,11 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     var finalConfig = jQuery.extend({}, this.config);
     // Change the JSON so that it is easy to map
     var hdfsConfig = this.hdfsConfig;
+    var self = this;
     item.components.forEach(function (component) {
       if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "NAMENODE") {
         //enabled HA
-        if ( component.host_components.length == 2) {
+        if (component.host_components.length == 2) {
           var haState1;
           var haState2;
           if (component.host_components[1].metrics && component.host_components[1].metrics.dfs) {
@@ -424,12 +421,8 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
               item.standby_name_node2_id = 'NAMENODE' + '_' + standby_name_nodes[1];
               break;
           }
-          // important: active nameNode always at host_components[0]; if no active, then any nameNode could work.
-          if (haState2 == "active") { // change places for all model bind with host_component[0]
-            var tmp = component.host_components[1];
-            component.host_components[1] = component.host_components[0];
-            component.host_components[0] = tmp;
-          }
+          var activeHostComponentIndex = haState2 == "active" ? 1 : 0;
+          self.setActiveAsFirstHostComponent(component, activeHostComponentIndex);
         }
         item.nameNodeComponent = component;
         finalConfig = jQuery.extend(finalConfig, hdfsConfig);
@@ -446,13 +439,13 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
         item.dead_data_nodes = [];
         item.live_data_nodes = [];
         for (var host in decommissionNodesJson) {
-          item.decommission_data_nodes.push('DATANODE'+ '_' + host);
+          item.decommission_data_nodes.push('DATANODE' + '_' + host);
         }
         for (var host in deadNodesJson) {
-          item.dead_data_nodes.push('DATANODE'+ '_' + host);
+          item.dead_data_nodes.push('DATANODE' + '_' + host);
         }
         for (var host in liveNodesJson) {
-          item.live_data_nodes.push('DATANODE'+ '_' + host);
+          item.live_data_nodes.push('DATANODE' + '_' + host);
         }
       }
       if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "JOURNALNODE") {
@@ -472,6 +465,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
 
     return finalJson;
   },
+
   yarnMapper: function (item) {
     var result = [];
     var self = this;
@@ -485,11 +479,8 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
         // if YARN has two host components, ACTIVE one should be first in component.host_components array for proper metrics mapping
         if (component.host_components.length === 2) {
           var activeRM = component.host_components.findProperty('HostRoles.ha_state', 'ACTIVE');
-          // if "second" RM isn't STARTED his ha_status is null (not STANDBY)
-          var standbyRM = component.host_components.filter(function(host_component) {return host_component.HostRoles.ha_state !== 'ACTIVE';})[0];
-          if (activeRM && standbyRM) {
-            component.host_components = [activeRM, standbyRM];
-          }
+          var activeHostComponentIndex = component.host_components.indexOf(activeRM);
+          self.setActiveAsFirstHostComponent(component, activeHostComponentIndex);
         }
 
         if (component.host_components[0].metrics && component.host_components[0].metrics.yarn) {
@@ -504,11 +495,11 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     });
     // Map
     var finalJson = this.parseIt(item, finalConfig);
-    finalJson.quick_links = [ 23, 24, 25, 26 ];
+    finalJson.quick_links = [23, 24, 25, 26];
     return finalJson;
   },
 
-  parseObject: function(obj) {
+  parseObject: function (obj) {
     var res = {};
     for (var p in obj) {
       if (obj.hasOwnProperty(p)) {
@@ -538,6 +529,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     return finalJson;
   },
   hbaseMapper: function (item) {
+    var self = this;
     // Change the JSON so that it is easy to map
     var finalConfig = jQuery.extend({}, this.config);
     var hbaseConfig = this.hbaseConfig;
@@ -545,12 +537,17 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == "HBASE_MASTER") {
         item.masterComponent = component;
         finalConfig = jQuery.extend(finalConfig, hbaseConfig);
-        var regionsArray = App.parseJSON(component.ServiceComponentInfo.RegionsInTransition);
-        //regions_in_transition can have various type of value: null, array or int
-        if (Array.isArray(regionsArray)) {
-          item.regions_in_transition = regionsArray.length;
-        } else {
-          item.regions_in_transition = regionsArray == null ? 0 : regionsArray;
+        if (component.host_components.length) {
+          var activeMaster = component.host_components.findProperty('metrics.hbase.master.IsActiveMaster', 'true');
+          var activeHostComponentIndex = component.host_components.indexOf(activeMaster);
+          self.setActiveAsFirstHostComponent(component, activeHostComponentIndex);
+          var regionsArray = App.parseJSON(component.host_components[0].metrics.master.AssignmentManger.ritCount);
+          //regions_in_transition can have various type of value: null, array or int
+          if (Array.isArray(regionsArray)) {
+            item.regions_in_transition = regionsArray.length;
+          } else {
+            item.regions_in_transition = regionsArray == null ? 0 : regionsArray;
+          }
         }
       }
     });
@@ -560,7 +557,22 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     finalJson.quick_links = [13, 14, 15, 16, 17, 18];
     return finalJson;
   },
-  
+
+  /**
+   * Sets the active host component as the first host component
+   * @param component {Object}
+   * @param activeHostComponentIndex {Number}
+   */
+  setActiveAsFirstHostComponent: function (component, activeHostComponentIndex) {
+    // important: active component always at host_components[0];
+    if (activeHostComponentIndex && activeHostComponentIndex !== -1) {
+      var tmp = component.host_components[activeHostComponentIndex];
+      component.host_components[activeHostComponentIndex] = component.host_components[0];
+      component.host_components[0] = tmp;
+    }
+  }
+  ,
+
   /**
    * Flume is different from other services, in that the important
    * data is in customizable channels. Hence we directly transfer
@@ -576,9 +588,9 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     flumeHandlers = flumeHandlers ? flumeHandlers.host_components : [];
     finalJson.agents = [];
     finalJson.agentJsons = [];
-    flumeHandlers.forEach(function(flumeHandler){
+    flumeHandlers.forEach(function (flumeHandler) {
       var hostName = flumeHandler.HostRoles.host_name;
-      flumeHandler.processes.forEach(function(process){
+      flumeHandler.processes.forEach(function (process) {
         var agentJson = self.parseIt(process, self.flumeAgentConfig);
         var agentId = agentJson.name + "-" + hostName;
         finalJson.agents.push(agentId);
@@ -587,12 +599,13 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       });
     });
     return finalJson;
-  },
+  }
+  ,
 
   /**
    * Storm mapper
    */
-  stormMapper: function(item) {
+  stormMapper: function (item) {
     var finalConfig = jQuery.extend({}, this.config);
     var stormConfig = this.stormConfig;
     var metricsInfoComponent = /^2.1/.test(App.get('currentStackVersionNumber')) ? 'STORM_REST_API' : 'STORM_UI_SERVER';
@@ -601,7 +614,7 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
       STORM_UI_SERVER: 'metrics.api.v1.cluster.summary'
     }[metricsInfoComponent];
 
-    item.components.forEach(function(component) {
+    item.components.forEach(function (component) {
       if (component.ServiceComponentInfo && component.ServiceComponentInfo.component_name == metricsInfoComponent) {
         if (Em.get(component, metricsPath)) {
           item.restApiComponent = App.keysDottedToCamelCase(Em.get(component, metricsPath));
@@ -616,4 +629,5 @@ App.serviceMetricsMapper = App.QuickDataMapper.create({
     });
     return this.parseIt(item, finalConfig);
   }
-});
+})
+;

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 88c716d..99305a8 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -2474,7 +2474,6 @@ Em.I18n.translations = {
   'dashboard.services.hbase.phoenixServers':'Phoenix Query Servers',
   'dashboard.services.hbase.phoenixServersSummary':'{0} live / {1} total',
   'dashboard.services.hbase.chart.label':'Request Count',
-  'dashboard.services.hbase.version':'Version',
   'dashboard.services.hbase.masterWebUI':'Master Web UI',
   'dashboard.services.hbase.regions.transition':'Regions In Transition',
   'dashboard.services.hbase.masterStarted':'Master Started',

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/app/models/service/hbase.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/service/hbase.js b/ambari-web/app/models/service/hbase.js
index 662577f..5b39771 100644
--- a/ambari-web/app/models/service/hbase.js
+++ b/ambari-web/app/models/service/hbase.js
@@ -18,7 +18,6 @@
 var App = require('app');
 
 App.HBaseService = App.Service.extend({
-  version: DS.attr('string'),
   master: function () {
     return this.get('hostComponents').findProperty('componentName', 'HBASE_MASTER');
   }.property('hostComponents'),
@@ -32,7 +31,6 @@ App.HBaseService = App.Service.extend({
   masterActiveTime: DS.attr('number'),
   averageLoad: DS.attr('number'),
   regionsInTransition: DS.attr('number'),
-  revision: DS.attr('string'),
   heapMemoryUsed: DS.attr('number'),
   heapMemoryMax: DS.attr('number')
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/app/models/service/mapreduce2.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/service/mapreduce2.js b/ambari-web/app/models/service/mapreduce2.js
index 388b236..ad343e1 100644
--- a/ambari-web/app/models/service/mapreduce2.js
+++ b/ambari-web/app/models/service/mapreduce2.js
@@ -18,7 +18,6 @@
 var App = require('app');
 
 App.MapReduce2Service = App.Service.extend({
-  version: DS.attr('string'),
   jobHistoryServer: function () {
     return this.get('hostComponents').findProperty('componentName', 'HISTORYSERVER');
   }.property('hostComponents'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/app/models/service/yarn.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/service/yarn.js b/ambari-web/app/models/service/yarn.js
index eb33886..3534b4e 100644
--- a/ambari-web/app/models/service/yarn.js
+++ b/ambari-web/app/models/service/yarn.js
@@ -19,7 +19,6 @@ var App = require('app');
 var objectUtils = require('utils/object_utils');
 
 App.YARNService = App.Service.extend({
-  version: DS.attr('string'),
   resourceManager: function() {
     return this.get('hostComponents').findProperty('componentName', 'RESOURCEMANAGER');
   }.property('hostComponents'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/test/controllers/global/update_controller_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/controllers/global/update_controller_test.js b/ambari-web/test/controllers/global/update_controller_test.js
index f55136b..87be07b 100644
--- a/ambari-web/test/controllers/global/update_controller_test.js
+++ b/ambari-web/test/controllers/global/update_controller_test.js
@@ -147,11 +147,11 @@ describe('App.UpdateController', function () {
           }
         ],
         result: ["host_components/metrics/yarn/Queue," +
-          "ServiceComponentInfo/rm_metrics/cluster/activeNMcount," +
-          "ServiceComponentInfo/rm_metrics/cluster/lostNMcount," +
-          "ServiceComponentInfo/rm_metrics/cluster/unhealthyNMcount," +
-          "ServiceComponentInfo/rm_metrics/cluster/rebootedNMcount," +
-          "ServiceComponentInfo/rm_metrics/cluster/decommissionedNMcount"]
+        "host_components/metrics/yarn/ClusterMetrics/NumActiveNMs," +
+        "host_components/metrics/yarn/ClusterMetrics/NumLostNMs," +
+        "host_components/metrics/yarn/ClusterMetrics/NumUnhealthyNMs," +
+        "host_components/metrics/yarn/ClusterMetrics/NumRebootedNMs," +
+        "host_components/metrics/yarn/ClusterMetrics/NumDecommissionedNMs"]
       },
       {
         title: 'HBASE service',
@@ -163,11 +163,10 @@ describe('App.UpdateController', function () {
           }
         ],
         result: ["host_components/metrics/hbase/master/IsActiveMaster," +
-          "ServiceComponentInfo/MasterStartTime," +
-          "ServiceComponentInfo/MasterActiveTime," +
-          "ServiceComponentInfo/AverageLoad," +
-          "ServiceComponentInfo/Revision," +
-          "ServiceComponentInfo/RegionsInTransition"]
+        "host_components/metrics/hbase/master/MasterStartTime," +
+        "host_components/metrics/hbase/master/MasterActiveTime," +
+        "host_components/metrics/hbase/master/AverageLoad," +
+        "host_components/metrics/master/AssignmentManger/ritCount"]
       },
       {
         title: 'STORM service',

http://git-wip-us.apache.org/repos/asf/ambari/blob/83ce96d7/ambari-web/test/mappers/service_mapper_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/mappers/service_mapper_test.js b/ambari-web/test/mappers/service_mapper_test.js
index 1ab4cf9..3545c03 100644
--- a/ambari-web/test/mappers/service_mapper_test.js
+++ b/ambari-web/test/mappers/service_mapper_test.js
@@ -32,48 +32,112 @@ describe('App.serviceMetricsMapper', function () {
         {
           components: [
             {
-                ServiceComponentInfo: {
-                  AverageLoad: 1.23456789,
-                  component_name: "HBASE_MASTER",
-                  RegionsInTransition : [ ]
+              ServiceComponentInfo: {
+                component_name: "HBASE_MASTER",
+                RegionsInTransition : [ ]
+              },
+              host_components: [
+                {
+                  metrics:{
+                    hbase: {
+                      master: {
+                        IsActiveMaster: 'true',
+                        AverageLoad: 1.23456789
+                      }
+                    },
+                    master: {
+                      AssignmentManger: {
+                        ritCount: 0
+                      }
+                    }
+                  }
                 }
-              }
+              ]
+            }
           ],
           e: '1.23'
         },
         {
           components: [
             {
-                ServiceComponentInfo: {
-                  AverageLoad: 1.00,
-                  component_name: "HBASE_MASTER",
-                  RegionsInTransition : [ ]
+              ServiceComponentInfo: {
+                component_name: "HBASE_MASTER",
+                RegionsInTransition : [ ]
+              },
+              host_components: [
+                {
+                  metrics:{
+                    hbase: {
+                      master: {
+                        IsActiveMaster: 'true',
+                        AverageLoad: 1.00
+                      }
+                    },
+                    master: {
+                      AssignmentManger: {
+                        ritCount: 0
+                      }
+                    }
+                  }
                 }
-              }
+              ]
+            }
           ],
           e: '1.00'
         },
         {
           components: [
             {
-                ServiceComponentInfo: {
-                  AverageLoad: 1,
-                  component_name: "HBASE_MASTER",
-                  RegionsInTransition : [ ]
+              ServiceComponentInfo: {
+                component_name: "HBASE_MASTER",
+                RegionsInTransition : [ ]
+              },
+              host_components: [
+                {
+                  metrics:{
+                    hbase: {
+                      master: {
+                        IsActiveMaster: 'true',
+                        AverageLoad: 1
+                      }
+                    },
+                    master: {
+                      AssignmentManger: {
+                        ritCount: 0
+                      }
+                    }
+                  }
                 }
-              }
+              ]
+            }
           ],
           e: '1.00'
         },
         {
           components: [
             {
-                ServiceComponentInfo: {
-                  AverageLoad: 1.2,
-                  component_name: "HBASE_MASTER",
-                  RegionsInTransition : [ ]
+              ServiceComponentInfo: {
+                component_name: "HBASE_MASTER",
+                RegionsInTransition : [ ]
+              },
+              host_components: [
+                {
+                  metrics:{
+                    hbase: {
+                      master: {
+                        IsActiveMaster: 'true',
+                        AverageLoad: 1.2
+                      }
+                    },
+                    master: {
+                      AssignmentManger: {
+                        ritCount: 0
+                      }
+                    }
+                  }
                 }
-              }
+              ]
+            }
           ],
           e: '1.20'
         }