Skip to content

Commit 691ee00

Browse files
committed
It works ish
1 parent dc4fe44 commit 691ee00

File tree

4 files changed

+35
-28
lines changed

4 files changed

+35
-28
lines changed

core/src/main/java/org/apache/spark/util/ParentClassLoader.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@
1818
package org.apache.spark.util;
1919

2020
/**
21-
* A class loader which makes findClass accesiable to the child
21+
* A class loader which makes findClass accesible to the child
2222
*/
2323
public class ParentClassLoader extends ClassLoader {
24-
public ParentClassLoader(ClassLoader parent) {
25-
super(parent);
24+
public ParentClassLoader(ClassLoader myParent) {
25+
super(myParent);
2626
}
27+
2728
@Override
2829
public Class<?> findClass(String name) throws ClassNotFoundException {
29-
return super.loadClass(name);
30+
return super.findClass(name);
3031
}
3132
}

core/src/main/scala/org/apache/spark/executor/Executor.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,16 +291,19 @@ private[spark] class Executor(
291291
* Create a ClassLoader for use in tasks, adding any JARs specified by the user or any classes
292292
* created by the interpreter to the search path
293293
*/
294-
private def createClassLoader(): ExecutorURLClassLoader = {
295-
val loader = Thread.currentThread().getContextClassLoader
294+
private def createClassLoader(): AddableURLClassLoader = {
295+
val loader = this.getClass.getClassLoader
296296

297297
// For each of the jars in the jarSet, add them to the class loader.
298298
// We assume each of the files has already been fetched.
299299
val urls = currentJars.keySet.map { uri =>
300300
new File(uri.split("/").last).toURI.toURL
301301
}.toArray
302302
val userClassPathFirst = conf.getBoolean("spark.classpath.userClassPathFirst", false)
303-
new ExecutorURLClassLoader(urls, loader, userClassPathFirst)
303+
userClassPathFirst match {
304+
case true => new ChildExecutorURLClassLoader(urls, loader)
305+
case false => new ExecutorURLClassLoader(urls, loader)
306+
}
304307
}
305308

306309
/**

core/src/main/scala/org/apache/spark/executor/ExecutorURLClassLoader.scala

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,13 @@ import org.apache.spark.util.ParentClassLoader
2626
* We also make changes so user classes can come before the default classes.
2727
*/
2828

29-
private[spark] class ExecutorURLClassLoader(urls: Array[URL], parent: ClassLoader, userFirst: Boolean)
30-
extends ClassLoader {
29+
trait AddableURLClassLoader extends ClassLoader {
30+
def addURL(url: URL)
31+
def getURLs(): Array[URL]
32+
}
33+
34+
private[spark] class ChildExecutorURLClassLoader(urls: Array[URL], parent: ClassLoader)
35+
extends ClassLoader with AddableURLClassLoader {
3136

3237
object userClassLoader extends URLClassLoader(urls, null){
3338
override def addURL(url: URL) {
@@ -41,22 +46,11 @@ private[spark] class ExecutorURLClassLoader(urls: Array[URL], parent: ClassLoade
4146
val parentClassLoader = new ParentClassLoader(parent)
4247

4348
override def findClass(name: String): Class[_] = {
44-
if (!userFirst) {
45-
try {
46-
val c = parentClassLoader.findClass(name)
47-
c
48-
} catch {
49-
case e: ClassNotFoundException => {
50-
userClassLoader.findClass(name)
51-
}
52-
}
53-
} else {
54-
try {
55-
userClassLoader.findClass(name)
56-
} catch {
57-
case e: ClassNotFoundException => {
58-
parentClassLoader.findClass(name)
59-
}
49+
try {
50+
userClassLoader.findClass(name)
51+
} catch {
52+
case e: ClassNotFoundException => {
53+
parentClassLoader.findClass(name)
6054
}
6155
}
6256
}
@@ -69,3 +63,12 @@ private[spark] class ExecutorURLClassLoader(urls: Array[URL], parent: ClassLoade
6963
userClassLoader.getURLs()
7064
}
7165
}
66+
67+
private[spark] class ExecutorURLClassLoader(urls: Array[URL], parent: ClassLoader)
68+
extends URLClassLoader(urls, parent) with AddableURLClassLoader {
69+
70+
override def addURL(url: URL) {
71+
super.addURL(url)
72+
}
73+
}
74+

core/src/test/scala/org/apache/spark/executor/ExecutorURLClassLoaderSuite.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,16 @@ class ExecutorURLClassLoaderSuite extends FunSuite {
2828
val urls = List(new File(spark_home + "/core/src/test/resources/fake-spark-class.jar").toURI.toURL).toArray
2929
val urls2 = List(new File(spark_home + "/core/src/test/resources/fake-spark-class-2.jar").toURI.toURL).toArray
3030
test("child first") {
31-
val parentLoader = new ExecutorURLClassLoader(urls2, null, false)
32-
val classLoader = new ExecutorURLClassLoader(urls, parentLoader, true)
31+
val parentLoader = new URLClassLoader(urls2, null)
32+
val classLoader = new ChildExecutorURLClassLoader(urls, parentLoader)
3333
val fakeClass = classLoader.loadClass("org.apache.spark.test.FakeClass2").newInstance()
3434
val fakeClassVersion = fakeClass.toString
3535
assert(fakeClassVersion === "1")
3636
}
3737

3838
test("parent first") {
3939
val parentLoader = new URLClassLoader(urls2, null)
40-
val classLoader = new ExecutorURLClassLoader(urls, parentLoader, false)
40+
val classLoader = new ExecutorURLClassLoader(urls, parentLoader)
4141
val fakeClass = classLoader.loadClass("org.apache.spark.test.FakeClass1").newInstance()
4242
val fakeClassVersion = fakeClass.toString
4343
assert(fakeClassVersion === "2")

0 commit comments

Comments
 (0)