stack created HBASE-19804:
-----------------------------

             Summary: [hbase-indexer] Metrics source RegionServer,sub=Server 
already exists!
                 Key: HBASE-19804
                 URL: https://issues.apache.org/jira/browse/HBASE-19804
             Project: HBase
          Issue Type: Improvement
          Components: hbase-indexer
    Affects Versions: 2.0.0-beta-1
            Reporter: stack
            Assignee: stack
             Fix For: 2.0.0-beta-2


In the past, the hbase-indexer runs multiple RegionServers per JVM. In old 
days, they had their own cut-down "RegionServer". In 2.0.0, we made it so they 
could run an actual RegionServer but with services disabled. The latter has an 
issue if you run more than one instance per JVM and it is NOT a 
minihbasecluster instance. It fails with:
{code:java}
1:09:13.371 PM  ERROR  HRegionServer  
Failed init
org.apache.hadoop.metrics2.MetricsException: Metrics source 
RegionServer,sub=Server already exists!
  at 
org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.newSourceName(DefaultMetricsSystem.java:152)
  at 
org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.sourceName(DefaultMetricsSystem.java:125)
  at 
org.apache.hadoop.metrics2.impl.MetricsSystemImpl.register(MetricsSystemImpl.java:229)
  at 
org.apache.hadoop.hbase.metrics.BaseSourceImpl.<init>(BaseSourceImpl.java:115)
  at 
org.apache.hadoop.hbase.regionserver.MetricsRegionServerSourceImpl.<init>(MetricsRegionServerSourceImpl.java:101)
  at 
org.apache.hadoop.hbase.regionserver.MetricsRegionServerSourceImpl.<init>(MetricsRegionServerSourceImpl.java:93)
  at 
org.apache.hadoop.hbase.regionserver.MetricsRegionServerSourceFactoryImpl.createServer(MetricsRegionServerSourceFactoryImpl.java:69)
  at 
org.apache.hadoop.hbase.regionserver.MetricsRegionServer.<init>(MetricsRegionServer.java:56)
  at 
org.apache.hadoop.hbase.regionserver.HRegionServer.handleReportForDutyResponse(HRegionServer.java:1519)
  at 
org.apache.hadoop.hbase.regionserver.HRegionServer.run(HRegionServer.java:954)
  at com.ngdata.sep.impl.SepConsumer$1.run(SepConsumer.java:203){code}
 

If you look in [10:26 AM] Wolfgang Hoschek: DefaultMetricsSystem code (found by 
[~whoschek]), you'll see this:
{code:java}
synchronized ObjectName newObjectName(String name) {
    try {
      if (mBeanNames.map.containsKey(name) && !miniClusterMode) {
        throw new MetricsException(name +" already exists!");
      }
      return new ObjectName(mBeanNames.uniqueName(name));
    } catch (Exception e) {
      throw new MetricsException(e);
    }
  }{code}
i.e. if we are in a mini cluster context, we will not fail registering the 
second bean instance.

 

If you look in master startup in HMasterCommandLine, you will see:

 
{code:java}
// If 'local', defer to LocalHBaseCluster instance.  Starts master
// and regionserver both in the one JVM.
if (LocalHBaseCluster.isLocal(conf)) {
  DefaultMetricsSystem.setMiniClusterMode(true);
....{code}
... will ensure we don't get the above exception in minihbasecluster context.

 

So, the idea here is to make it so being able to run more than one RS per JVM 
is cleaner than doing the above hack. It needs to be a config too.... a config. 
which says don't fail startup if second mbean registration just because two RS 
in the one context (A later issue will be the accounting of metrics per RS... 
If more than one RS, then we should make a unique mbean per RS in the JVM).



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to