我使用的是Spark版本2.1.0
,我使用的是
./bin/spark-submit --master spark://some_master_host_name:7077 \
--class com.foo.bar.SomeApp \
--deploy-mode cluster \
--conf spark.jars=libraries/avro-1.8.2.jar \
--jars libraries/avro-1.8.2.jar \
--conf spark.executor.extraClassPath=avro-1.8.2.jar \
--conf spark.driver.extraClassPath=avro-1.8.2.jar \
--conf spark.files.fetchTimeout=600s \
--conf spark.driver.extraJavaOptions="-XX:+UnlockDiagnosticVMOptions -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/some_file_name.hprof" \
--conf spark.executor.extraJavaOptions="-XX:+PrintFlagsFinal -XX:+PrintReferenceGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -XX:+UnlockDiagnosticVMOptions -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/some_file_name.hprof" \
/some/where/on/disk/FOO-assembly.jar
将Spark应用程序提交到集群。在应用程序端,我启用了以下调试日志记录以检查类路径
private static void printSystemClasspath() {
System.err.println("-------System Classpath--------------");
String[] entries = System.getProperty("java.class.path").split("\\:");
for (String entry : entries) {
System.err.println(entry + " - " + new File(entry).exists());
}
System.err.println("-------------------------------------");
}
private static void printCurrentThreadClassloaderClasspath() {
System.err.println("-------Current Thread Classpath--------------");
ClassLoader cl = Thread.currentThread().getContextClassLoader();
URL[] urls = ((URLClassLoader) cl).getURLs();
for (URL url : urls) {
System.err.println(url.getFile());
}
System.err.println("-------------------------------------");
}
问题:我试图覆盖spark提供的avro版本,并在运行时提供1.8.2。
我在FOO-assembly.jar
中打包了适当版本的avro类,但是当我使用spark.driver.userClassPathFirst
或spark.executor.userClassPathFirst
时,我遇到了其他一些冲突。我希望能够在运行时将avro库覆盖为升级版本。
我在系统类路径中以avro-1.8.2.jar
的形式收到第一个条目,但是文件不存在于文件系统中(代码评估为false
)
在这种情况下如何覆盖类路径?