@InterfaceAudience.Private public class CoprocessorClassLoader extends ClassLoaderBase
This ClassLoader always tries to load classes from the specified coprocessor jar first actually using URLClassLoader logic before delegating to the parent ClassLoader, thus avoiding dependency conflicts between HBase's classpath and classes in the coprocessor jar.
Certain classes are exempt from being loaded by this ClassLoader because it would prevent them from being cast to the equivalent classes in the region server. For example, the Coprocessor interface needs to be loaded by the region server's ClassLoader to prevent a ClassCastException when casting the coprocessor implementation.
A HDFS path can be used to specify the coprocessor jar. In this case, the jar will be copied to local at first under some folder under ${hbase.local.dir}/jars/tmp/. The local copy will be removed automatically when the HBase server instance is stopped.
This ClassLoader also handles resource loading. In most cases this ClassLoader will attempt to load resources from the coprocessor jar first before delegating to the parent. However, like in class loading, some resources need to be handled differently. For all of the Hadoop default configurations (e.g. hbase-default.xml) we will check the parent ClassLoader first to prevent issues such as failing the HBase default configuration version check.
DEFAULT_LOCAL_DIR, LOCAL_DIR_KEY, parent
Modifier and Type | Method and Description |
---|---|
static void |
clearCache() |
static Collection<? extends ClassLoader> |
getAllCached() |
static CoprocessorClassLoader |
getClassLoader(org.apache.hadoop.fs.Path path,
ClassLoader parent,
String pathPrefix,
org.apache.hadoop.conf.Configuration conf)
Get a CoprocessorClassLoader for a coprocessor jar path from cache.
|
static CoprocessorClassLoader |
getIfCached(org.apache.hadoop.fs.Path path) |
URL |
getResource(String name) |
protected boolean |
isClassExempt(String name,
String[] includedClassPrefixes)
Determines whether the given class should be exempt from being loaded
by this ClassLoader.
|
Class<?> |
loadClass(String name) |
Class<?> |
loadClass(String name,
String[] includedClassPrefixes) |
protected boolean |
loadResourceUsingParentFirst(String name)
Determines whether we should attempt to load the given resource using the
parent first before attempting to load the resource using this ClassLoader.
|
getClassLoadingLock
addURL, close, definePackage, findClass, findResource, findResources, getPermissions, getResourceAsStream, getURLs, newInstance, newInstance
defineClass, defineClass
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findLibrary, findLoadedClass, findSystemClass, getPackage, getPackages, getParent, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, registerAsParallelCapable, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
public static CoprocessorClassLoader getIfCached(org.apache.hadoop.fs.Path path)
public static Collection<? extends ClassLoader> getAllCached()
public static void clearCache()
public static CoprocessorClassLoader getClassLoader(org.apache.hadoop.fs.Path path, ClassLoader parent, String pathPrefix, org.apache.hadoop.conf.Configuration conf) throws IOException
path
- the path to the coprocessor jar file to load classes fromparent
- the parent class loader for exempted classespathPrefix
- a prefix used in temp path name to store the jar file locallyconf
- the configuration used to create the class loader, if neededIOException
public Class<?> loadClass(String name) throws ClassNotFoundException
loadClass
in class ClassLoader
ClassNotFoundException
public Class<?> loadClass(String name, String[] includedClassPrefixes) throws ClassNotFoundException
ClassNotFoundException
public URL getResource(String name)
getResource
in class ClassLoader
protected boolean isClassExempt(String name, String[] includedClassPrefixes)
name
- the name of the class to test.protected boolean loadResourceUsingParentFirst(String name)
name
- the name of the resource to test.Copyright © 2007–2019 The Apache Software Foundation. All rights reserved.