[ 
https://issues.apache.org/jira/browse/HBASE-24402?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17111712#comment-17111712
 ] 

Jeongdae Kim edited comment on HBASE-24402 at 5/20/20, 5:35 AM:
----------------------------------------------------------------

I think the reason why this warning occurs is that HBASE-9774 was ported to 
branch-1 HBASE-18060, and HBASE-18060 only fit for hadoop version < 2.6.0 by 
using reflections to remove some internal data. unfortunately, since hadoop 
version 2.6.0 HADOOP-11105 , some more internal data is added, which HBase 
1.4.13 can't remove, so it makes this warning every 5 minutes and the metric 
source for coprocessor will be never re-registered.

 

More specifically, It happens in the following scenario.
 * At first, The warning started to appear after the meta region was moved out 
from a host and then moved back to the host again some minutes after.
{noformat}
2020-04-21 15:08:07,749 DEBUG [RS_CLOSE_META-XXX:11471-0] 
handler.CloseRegionHandler: Closed hbase:meta,,1.1588230740
...
2020-04-21 15:08:19,169 INFO  
[RpcServer.priority.FPBQ.Fifo.handler=18,queue=0,port=11471] 
regionserver.RSRpcServices: Open hbase:meta,,1.1588230740
{noformat}

 * since HBASE-12016 ported to branch-1, the coprocessor 
'MultiRowMutationEndpoint' has added to the meta table.
{noformat}
2020-04-21 15:08:19,172 DEBUG [RS_OPEN_META-XXX:11471-0] 
coprocessor.CoprocessorHost: Loading coprocessor class 
org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint with path null and 
priority 536870911
2020-04-21 15:08:19,173 DEBUG [RS_OPEN_META-XXX:11471-0] regionserver.HRegion: 
Registered coprocessor service: region=hbase:meta,,1 service=MultiRowMut
ationService
2020-04-21 15:08:19,174 INFO  [RS_OPEN_META-XXX:11471-0] 
regionserver.RegionCoprocessorHost: Loaded coprocessor 
org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint from HTD of 
hbase:meta successfully.
{noformat}

 * Because Coprocessor metrics introduced HBASE-18060, whenever meta region is 
closed or opened, a new metric source is added to hadoop metrics2 system or 
removed from it.
{noformat}
// (1) registered a metric source after a region server restarted 
2020-04-20 14:23:04,579 DEBUG [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering adapter for the MetricRegistry: 
RegionServer,sub=Coprocessor.R
egion.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
2020-04-20 14:23:04,580 INFO  [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering 
RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
 Metrics about HBase RegionObservers

// (2) removed it because of moving meta out from the region server
2020-04-21 15:08:14,579 DEBUG [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Removing adapter for the MetricRegistry: 
RegionServer,sub=Coprocessor.Regi
on.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint

// (3) then trying to re-register it after meta region moved into the same 
region server
2020-04-21 15:08:24,579 DEBUG [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering adapter for the MetricRegistry: 
RegionServer,sub=Coprocessor.R
egion.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
2020-04-21 15:08:24,579 INFO  [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering 
RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
 Metrics about HBase RegionObservers

// and, the log appears every 5 minutes
{noformat}
[https://github.com/apache/hbase/blob/rel/1.4.13/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/impl/GlobalMetricRegistriesAdapter.java#L151]
 
[https://github.com/apache/hbase/blob/rel/1.4.13/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/impl/GlobalMetricRegistriesAdapter.java#L170-L176]

 * Since under 2.6.0 hadoop doesn't provide any interface to unregister 
existing metric sources (introduced since 
https://issues.apache.org/jira/browse/HADOOP-10839), branch-1 ported version 
uses reflections to remove a metric source from metric system. 
[https://github.com/apache/hbase/blob/rel/1.4.13/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/impl/GlobalMetricRegistriesAdapter.java#L197-L226]

 * after HADOOP-11105 introduced (2.6.0), a new field 'namedCallbacks' was 
added to re-register the existing sources when metric system restarted. Because 
current HBase implementation couldn't touch that field by reflection, a 
callback to re-register a metric source for the coprocessor still remains in 
the map, even after meta region moved out.

 * a scheduled task restart hadoop metric system every 5 minutes. So, a new 
metric source for MultiRowMutationEndpoint coprocessor is registered every 
restart, even after meta region moved out.
 
[https://github.com/apache/hbase/blob/rel/1.4.13/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java#L59-L63]
 
[https://github.com/apache/hbase/blob/rel/1.4.13/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/impl/JmxCacheBuster.java#L103-L110]

 * When meta region was moved back at the time (3) in above logs, HBase tried 
to register a new metric source, and that try failed because the source with 
the same name already exists. However, even though the registration failed, 
that try replaces existing metric source (re-registered by restart) with new 
one which have 'mbeanName' == null due to registration failure.
 
[https://github.com/apache/hadoop/blob/branch-2.8.5/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java#L267]
 
[https://github.com/apache/hadoop/blob/branch-2.8.5/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java#L124]
 
[https://github.com/apache/hadoop/blob/branch-2.8.5/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java#L222]
{noformat}
2020-04-21 15:08:24,579 INFO  [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering 
RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
 Metrics about HBase RegionObservers
2020-04-21 15:08:24,579 WARN  [HBase-Metrics2-1] util.MBeans: Error creating 
MBean object name: 
Hadoop:service=HBase,name=RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
org.apache.hadoop.metrics2.MetricsException: 
org.apache.hadoop.metrics2.MetricsException: 
Hadoop:service=HBase,name=RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
 already exists!
{noformat}

 * when metric system is stopped by a scheduled task, de-registration process 
by stop for a metric source should unregister MBean and remove its name from 
DefaultMetricsSystem("mBeanNames" field), but it couldn't, because existing 
metric source have null for 'mbeanName' by replacement.
 
[https://github.com/apache/hadoop/blob/branch-2.8.5/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java#L105-L114]

 * So, when metric system starts again, registering a metric source for the 
coprocessor is failed, because its name still exists in DefaultMetricsSystem. 
and finally we can show the exception in log whenever metric system restart 
every 5 minutes.


was (Author: jeongdae kim):
I think the reason why this warning occurs is that HBASE-9774 was ported to 
branch-1 HBASE-18060, and HBASE-18060 only fit for hadoop version < 2.6.0 by 
using reflections to remove some internal data. unfortunately, since hadoop 
version 2.6.0 HADOOP-11105 , some more internal data is added, which HBase 
1.4.13 can't remove, so it makes this warning every 5 minutes and the metric 
source for coprocessor will be never re-registered.

 

More specifically, It happens in the following scenario.
 * At first, The warning started to appear after the meta region was moved out 
from a host and then moved back to the host again some minutes after.
{noformat}
2020-04-21 15:08:07,749 DEBUG [RS_CLOSE_META-XXX:11471-0] 
handler.CloseRegionHandler: Closed hbase:meta,,1.1588230740
...
2020-04-21 15:08:19,169 INFO  
[RpcServer.priority.FPBQ.Fifo.handler=18,queue=0,port=11471] 
regionserver.RSRpcServices: Open hbase:meta,,1.1588230740
{noformat}

 * since HBASE-12016 ported to branch-1, the coprocessor 
'MultiRowMutationEndpoint' has added to the meta table.
{noformat}
2020-04-21 15:08:19,172 DEBUG [RS_OPEN_META-XXX:11471-0] 
coprocessor.CoprocessorHost: Loading coprocessor class 
org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint with path null and 
priority 536870911
2020-04-21 15:08:19,173 DEBUG [RS_OPEN_META-XXX:11471-0] regionserver.HRegion: 
Registered coprocessor service: region=hbase:meta,,1 service=MultiRowMut
ationService
2020-04-21 15:08:19,174 INFO  [RS_OPEN_META-XXX:11471-0] 
regionserver.RegionCoprocessorHost: Loaded coprocessor 
org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint from HTD of 
hbase:meta successfully.
{noformat}

 * Because Coprocessor metrics introduced HBASE-18060, whenever meta region is 
closed or opened, a new metric source is added to hadoop metrics2 system or 
removed from it.
{noformat}
// (1) registered a metric source after a region server restarted 
2020-04-20 14:23:04,579 DEBUG [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering adapter for the MetricRegistry: 
RegionServer,sub=Coprocessor.R
egion.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
2020-04-20 14:23:04,580 INFO  [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering 
RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
 Metrics about HBase RegionObservers

// (2) removed it because of moving meta out from the region server
2020-04-21 15:08:14,579 DEBUG [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Removing adapter for the MetricRegistry: 
RegionServer,sub=Coprocessor.Regi
on.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint

// (3) then trying to re-register it after meta region moved into the same 
region server
2020-04-21 15:08:24,579 DEBUG [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering adapter for the MetricRegistry: 
RegionServer,sub=Coprocessor.R
egion.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
2020-04-21 15:08:24,579 INFO  [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering 
RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
 Metrics about HBase RegionObservers

// and, the log appears every 5 minutes
{noformat}
[https://git.linecorp.com/LINE-Server/line-hbase/blob/1.4.13-line/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/impl/GlobalMetricRegistriesAdapter.java#L151]
 
[https://git.linecorp.com/LINE-Server/line-hbase/blob/1.4.13-line/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/impl/GlobalMetricRegistriesAdapter.java#L170-L176]

 * Since under 2.6.0 hadoop doesn't provide any interface to unregister 
existing metric sources (introduced since 
https://issues.apache.org/jira/browse/HADOOP-10839), branch-1 ported version 
uses reflections to remove a metric source from metric system. 
[https://git.linecorp.com/LINE-Server/line-hbase/blob/1.4.13-line/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/impl/GlobalMetricRegistriesAdapter.java#L197-L226]

 * after HADOOP-11105 introduced (2.6.0), a new field 'namedCallbacks' was 
added to re-register the existing sources when metric system restarted. Because 
current HBase implementation couldn't touch that field by reflection, a 
callback to re-register a metric source for the coprocessor still remains in 
the map, even after meta region moved out.

 * a scheduled task restart hadoop metric system every 5 minutes. So, a new 
metric source for MultiRowMutationEndpoint coprocessor is registered every 
restart, even after meta region moved out.
 
[https://git.linecorp.com/LINE-Server/line-hbase/blob/1.4.13-line/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java#L59-L63]
 
[https://git.linecorp.com/LINE-Server/line-hbase/blob/1.4.13-line/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/impl/JmxCacheBuster.java#L103-L110]

 * When meta region was moved back at the time (3) in above logs, HBase tried 
to register a new metric source, and that try failed because the source with 
the same name already exists. However, even though the registration failed, 
that try replaces existing metric source (re-registered by restart) with new 
one which have 'mbeanName' == null due to registration failure.
 
[https://github.com/apache/hadoop/blob/branch-2.8.5/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSystemImpl.java#L267]
 
[https://github.com/apache/hadoop/blob/branch-2.8.5/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java#L124]
 
[https://github.com/apache/hadoop/blob/branch-2.8.5/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/impl/MetricsSourceAdapter.java#L222]
{noformat}
2020-04-21 15:08:24,579 INFO  [HBase-Metrics2-1] 
impl.GlobalMetricRegistriesAdapter: Registering 
RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
 Metrics about HBase RegionObservers
2020-04-21 15:08:24,579 WARN  [HBase-Metrics2-1] util.MBeans: Error creating 
MBean object name: 
Hadoop:service=HBase,name=RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
org.apache.hadoop.metrics2.MetricsException: 
org.apache.hadoop.metrics2.MetricsException: 
Hadoop:service=HBase,name=RegionServer,sub=Coprocessor.Region.CP_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
 already exists!
{noformat}

 * when metric system is stopped by a scheduled task, de-registration process 
by stop for a metric source should unregister MBean and remove its name from 
DefaultMetricsSystem("mBeanNames" field), but it couldn't, because existing 
metric source have null for 'mbeanName' by replacement.
 
[https://github.com/apache/hadoop/blob/branch-2.8.5/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java#L105-L114]

 * So, when metric system starts again, registering a metric source for the 
coprocessor is failed, because its name still exists in DefaultMetricsSystem. 
and finally we can show the exception in log whenever metric system restart 
every 5 minutes.

> Moving the meta region causes MetricsException when using above 2.6.0 hadoop 
> version
> ------------------------------------------------------------------------------------
>
>                 Key: HBASE-24402
>                 URL: https://issues.apache.org/jira/browse/HBASE-24402
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 1.4.13
>            Reporter: Jeongdae Kim
>            Assignee: Jeongdae Kim
>            Priority: Minor
>
> When the meta region moved out from a region server then moved in to the one 
> again, we got MetricsException below and the metric source for coprocessor 
> couldn't be re-registered. it happened with hadoop 2.8.5
> {noformat}
> 2020-04-21 15:13:02,956 WARN  [HBase-Metrics2-1] util.MBeans: Error creating 
> MBean object name: 
> Hadoop:service=HBase,name=RegionServer,sub=Coprocessor.Region.C
> P_org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint
> org.apache.hadoop.metrics2.MetricsException: 
> org.apache.hadoop.metrics2.MetricsException: 
> Hadoop:service=HBase,name=RegionServer,sub=Coprocessor.Region.CP_org.
> apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint already exists!
>     at 
> org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.newObjectName(DefaultMetricsSystem.java:127)
>     at 
> org.apache.hadoop.metrics2.lib.DefaultMetricsSystem.newMBeanName(DefaultMetricsSystem.java:102)
>     at org.apache.hadoop.metrics2.util.MBeans.getMBeanName(MBeans.java:121)
>     at org.apache.hadoop.metrics2.util.MBeans.register(MBeans.java:64)
>     at 
> org.apache.hadoop.metrics2.impl.MetricsSourceAdapter.startMBeans(MetricsSourceAdapter.java:222)
>     at 
> org.apache.hadoop.metrics2.impl.MetricsSourceAdapter.start(MetricsSourceAdapter.java:100)
>     at 
> org.apache.hadoop.metrics2.impl.MetricsSystemImpl.registerSource(MetricsSystemImpl.java:268)
>     at 
> org.apache.hadoop.metrics2.impl.MetricsSystemImpl$1.postStart(MetricsSystemImpl.java:239)
>     at jdk.internal.reflect.GeneratedMethodAccessor82.invoke(Unknown Source)
>     at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>     at java.base/java.lang.reflect.Method.invoke(Method.java:566)
>     at 
> org.apache.hadoop.metrics2.impl.MetricsSystemImpl$3.invoke(MetricsSystemImpl.java:320)
>     at com.sun.proxy.$Proxy10.postStart(Unknown Source)
>     at 
> org.apache.hadoop.metrics2.impl.MetricsSystemImpl.start(MetricsSystemImpl.java:193)
>     at 
> org.apache.hadoop.metrics2.impl.JmxCacheBuster$JmxCacheBusterRunnable.run(JmxCacheBuster.java:109)
>     at 
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
>     at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
>     at 
> java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
>     at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>     at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>     at java.base/java.lang.Thread.run(Thread.java:834) 
> {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to