(TWILL-271) Add custom ClassLoader dependencies
Signed-off-by: Terence Yim <terencey@google.com>
diff --git a/twill-yarn/src/main/java/org/apache/twill/yarn/YarnTwillPreparer.java b/twill-yarn/src/main/java/org/apache/twill/yarn/YarnTwillPreparer.java
index 1ea2ab3..c69b009 100644
--- a/twill-yarn/src/main/java/org/apache/twill/yarn/YarnTwillPreparer.java
+++ b/twill-yarn/src/main/java/org/apache/twill/yarn/YarnTwillPreparer.java
@@ -113,6 +113,7 @@
import java.util.concurrent.TimeUnit;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
+import java.util.stream.Collectors;
import javax.annotation.Nullable;
/**
@@ -121,12 +122,6 @@
final class YarnTwillPreparer implements TwillPreparer {
private static final Logger LOG = LoggerFactory.getLogger(YarnTwillPreparer.class);
- private static final Function<Class<?>, String> CLASS_TO_NAME = new Function<Class<?>, String>() {
- @Override
- public String apply(Class<?> cls) {
- return cls.getName();
- }
- };
private final Configuration config;
private final TwillSpecification twillSpec;
@@ -575,13 +570,24 @@
// Add the TwillRunnableEventHandler class
if (twillSpec.getEventHandler() != null) {
- classes.add(getClassLoader().loadClass(twillSpec.getEventHandler().getClassName()));
+ classes.add(classLoader.loadClass(twillSpec.getEventHandler().getClassName()));
+ }
+
+ // Optionally add the custom classloader class
+ if (classLoaderClassName != null) {
+ try {
+ classes.add(classLoader.loadClass(classLoaderClassName));
+ } catch (ClassNotFoundException e) {
+ // Don't throw if the classloader class is not found, as it can be available
+ // in the target cluster with appropriate classpath setting
+ LOG.debug("Cannot load custom classloader class '{}' when preparing for application launch",
+ classLoaderClassName);
+ }
}
// The location name is computed from the MD5 of all the classes names
// The localized name is always APPLICATION_JAR
- List<String> classList = Lists.newArrayList(Iterables.transform(classes, CLASS_TO_NAME));
- Collections.sort(classList);
+ List<String> classList = classes.stream().map(Class::getName).sorted().collect(Collectors.toList());
Hasher hasher = Hashing.md5().newHasher();
for (String name : classList) {
hasher.putString(name);
diff --git a/twill-yarn/src/test/java/org/apache/twill/yarn/LogLevelChangeTestRun.java b/twill-yarn/src/test/java/org/apache/twill/yarn/LogLevelChangeTestRun.java
index a1d8ae6..43787f0 100644
--- a/twill-yarn/src/test/java/org/apache/twill/yarn/LogLevelChangeTestRun.java
+++ b/twill-yarn/src/test/java/org/apache/twill/yarn/LogLevelChangeTestRun.java
@@ -277,7 +277,7 @@
if (matchCount == expectedInstances) {
return;
}
- TimeUnit.MILLISECONDS.sleep(100);
+ TimeUnit.SECONDS.sleep(1);
}
Assert.fail("Timeout waiting for expected log levels");