HADOOP-6502. Improve the performance of Configuration.getClassByName when the class is not found by caching negative results. Contributed by Sharad Agarwal and Todd Lipcon.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.23@1244619 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9ea26a7b08
commit
7565d7c5cd
|
@ -17,6 +17,10 @@ Release 0.23.2 - UNRELEASED
|
|||
HADOOP-8071. Avoid an extra packet in client code when nagling is
|
||||
disabled. (todd)
|
||||
|
||||
HADOOP-6502. Improve the performance of Configuration.getClassByName when
|
||||
the class is not found by caching negative results.
|
||||
(sharad, todd via todd)
|
||||
|
||||
BUG FIXES
|
||||
|
||||
HADOOP-8042 When copying a file out of HDFS, modifying it, and uploading
|
||||
|
|
|
@ -1146,6 +1146,22 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|||
* @throws ClassNotFoundException if the class is not found.
|
||||
*/
|
||||
public Class<?> getClassByName(String name) throws ClassNotFoundException {
|
||||
Class<?> ret = getClassByNameOrNull(name);
|
||||
if (ret == null) {
|
||||
throw new ClassNotFoundException("Class " + name + " not found");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a class by name, returning null rather than throwing an exception
|
||||
* if it couldn't be loaded. This is to avoid the overhead of creating
|
||||
* an exception.
|
||||
*
|
||||
* @param name the class name
|
||||
* @return the class object, or null if it could not be found.
|
||||
*/
|
||||
public Class<?> getClassByNameOrNull(String name) {
|
||||
Map<String, Class<?>> map;
|
||||
|
||||
synchronized (CACHE_CLASSES) {
|
||||
|
@ -1157,12 +1173,20 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
|
|||
}
|
||||
}
|
||||
|
||||
Class<?> clazz = map.get(name);
|
||||
if (clazz == null) {
|
||||
clazz = Class.forName(name, true, classLoader);
|
||||
if (clazz != null) {
|
||||
// two putters can race here, but they'll put the same class
|
||||
map.put(name, clazz);
|
||||
Class<?> clazz = null;
|
||||
if (!map.containsKey(name)) {
|
||||
try {
|
||||
clazz = Class.forName(name, true, classLoader);
|
||||
} catch (ClassNotFoundException e) {
|
||||
map.put(name, null); //cache negative that class is not found
|
||||
return null;
|
||||
}
|
||||
// two putters can race here, but they'll put the same class
|
||||
map.put(name, clazz);
|
||||
} else { // check already performed on this class name
|
||||
clazz = map.get(name);
|
||||
if (clazz == null) { // found the negative
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -86,17 +86,22 @@ public class ReflectionUtils {
|
|||
//invoke configure on theObject
|
||||
try {
|
||||
Class<?> jobConfClass =
|
||||
conf.getClassByName("org.apache.hadoop.mapred.JobConf");
|
||||
conf.getClassByNameOrNull("org.apache.hadoop.mapred.JobConf");
|
||||
if (jobConfClass == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Class<?> jobConfigurableClass =
|
||||
conf.getClassByName("org.apache.hadoop.mapred.JobConfigurable");
|
||||
if (jobConfClass.isAssignableFrom(conf.getClass()) &&
|
||||
conf.getClassByNameOrNull("org.apache.hadoop.mapred.JobConfigurable");
|
||||
if (jobConfigurableClass == null) {
|
||||
return;
|
||||
}
|
||||
if (jobConfClass.isAssignableFrom(conf.getClass()) &&
|
||||
jobConfigurableClass.isAssignableFrom(theObject.getClass())) {
|
||||
Method configureMethod =
|
||||
jobConfigurableClass.getMethod("configure", jobConfClass);
|
||||
configureMethod.invoke(theObject, conf);
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
//JobConf/JobConfigurable not in classpath. no need to configure
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Error in configuring object", e);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue