I'm getting the following problem when running some HBase code. It looks like it is originating in the MXBean bits. I'm totally clueless on this, but looks pretty low-level.
javax.management.NotCompliantMBeanException: org.apache.hadoop.hbase.master.MXBean: Method org.apache.hadoop.hbase.master.MXBean.getRegionServers has parameter or return type that cannot be translated into an open type
at com.sun.jmx.mbeanserver.Introspector.throwException(Introspector.java:419)
at com.sun.jmx.mbeanserver.MBeanAnalyzer.<init>(MBeanAnalyzer.java:118)
at com.sun.jmx.mbeanserver.MBeanAnalyzer.analyzer(MBeanAnalyzer.java:104)
at com.sun.jmx.mbeanserver.MXBeanIntrospector.getAnalyzer(MXBeanIntrospector.java:71)
at com.sun.jmx.mbeanserver.MBeanIntrospector.getPerInterface(MBeanIntrospector.java:181)
at com.sun.jmx.mbeanserver.MBeanSupport.<init>(MBeanSupport.java:136)
at com.sun.jmx.mbeanserver.MXBeanSupport.<init>(MXBeanSupport.java:66)
at com.sun.jmx.mbeanserver.Introspector.makeDynamicMBean(Introspector.java:184)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:936)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:330)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:516)
at org.apache.hadoop.metrics.util.MBeanUtil.registerMBean(MBeanUtil.java:58)
at org.apache.hadoop.hbase.master.HMaster.registerMBean(HMaster.java:1646)
at org.apache.hadoop.hbase.master.HMaster.finishInitialization(HMaster.java:527)
at org.apache.hadoop.hbase.master.HMaster.run(HMaster.java:336)
at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.IllegalArgumentException: Method org.apache.hadoop.hbase.master.MXBean.getRegionServers has parameter or return type that cannot be translated into an open type
at com.sun.jmx.mbeanserver.ConvertingMethod.from(ConvertingMethod.java:45)
at com.sun.jmx.mbeanserver.MXBeanIntrospector.mFrom(MXBeanIntrospector.java:81)
at com.sun.jmx.mbeanserver.MXBeanIntrospector.mFrom(MXBeanIntrospector.java:51)
at com.sun.jmx.mbeanserver.MBeanAnalyzer.initMaps(MBeanAnalyzer.java:135)
at com.sun.jmx.mbeanserver.MBeanAnalyzer.<init>(MBeanAnalyzer.java:116)
... 14 more
Caused by: javax.management.openmbean.OpenDataException: Cannot obtain array class
at com.sun.jmx.mbeanserver.OpenConverter.openDataException(OpenConverter.java:1389)
at com.sun.jmx.mbeanserver.OpenConverter.makeArrayOrCollectionConverter(OpenConverter.java:346)
at com.sun.jmx.mbeanserver.OpenConverter.makeConverter(OpenConverter.java:295)
at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:277)
at com.sun.jmx.mbeanserver.OpenConverter.makeTabularConverter(OpenConverter.java:376)
at com.sun.jmx.mbeanserver.OpenConverter.makeParameterizedConverter(OpenConverter.java:417)
at com.sun.jmx.mbeanserver.OpenConverter.makeConverter(OpenConverter.java:312)
at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:277)
at com.sun.jmx.mbeanserver.OpenConverter.makeCompositeConverter(OpenConverter.java:482)
at com.sun.jmx.mbeanserver.OpenConverter.makeConverter(OpenConverter.java:309)
at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:277)
at com.sun.jmx.mbeanserver.OpenConverter.makeTabularConverter(OpenConverter.java:377)
at com.sun.jmx.mbeanserver.OpenConverter.makeParameterizedConverter(OpenConverter.java:417)
at com.sun.jmx.mbeanserver.OpenConverter.makeConverter(OpenConverter.java:312)
at com.sun.jmx.mbeanserver.OpenConverter.toConverter(OpenConverter.java:277)
at com.sun.jmx.mbeanserver.ConvertingMethod.<init>(ConvertingMethod.java:197)
at com.sun.jmx.mbeanserver.ConvertingMethod.from(ConvertingMethod.java:40)
... 18 more
Caused by: java.lang.ClassNotFoundException: [Lbyte;
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:186)
at com.sun.jmx.mbeanserver.OpenConverter.makeArrayOrCollectionConverter(OpenConverter.java:344)
... 33 more
Looks like this has been reported on the HBase JIRA
https://issues.apache.org/jira/browse/HBASE-5718
They think it's a JMX issue, which I tend to agree with after looking at the source code below. Note the comment about never seeing primitive arrays. Somehow a primitive array made it into here, and is being treated as if it were an object class.
323 /* Make the converter for an array type, or a collection such as
324 * List<String> or Set<Integer>. We never see one-dimensional
325 * primitive arrays (e.g. int[]) here because they use the identity
326 * converter and are registered as such in the static initializer.
327 */
328 private static OpenConverter
329 makeArrayOrCollectionConverter(Type collectionType, Type elementType)
330 throws OpenDataException {
331
332 final OpenConverter elementConverter = toConverter(elementType);
333 final OpenType<?> elementOpenType = elementConverter.getOpenType();
334 final ArrayType<?> openType = ArrayType.getArrayType(elementOpenType);
335 final Class<?> elementOpenClass = elementConverter.getOpenClass();
336
337 final Class<?> openArrayClass;
338 final String openArrayClassName;
339 if (elementOpenClass.isArray())
340 openArrayClassName = "[" + elementOpenClass.getName();
341 else
342 openArrayClassName = "[L" + elementOpenClass.getName() + ";";
343 try {
344 openArrayClass = Class.forName(openArrayClassName);
collectionType and elementType arguments being passed in. Since it seems only your specific code surfaces the bug, this might be the only option to pinpoint the bug - Jim Garrison 2012-04-05 03:57
Verify you are not using OpenJDK to run HBase. Although not obvious from the prerequisite list in the online docs, apparently some older Hbase versions may require Oracle Java. See this link.
[Lbyte;names an array ([) of Object (L) of a class namedbyte, which isn't normally possible. An array of Java native bytes would have a descriptor of[B, so something withinmakeArrayOrCollectionConverteris confused. Did you define your own MXBeans - Jim Garrison 2012-04-05 01:38