我陷入了 Classloader hell - Hadoop(最高 2.7.2)使用了过时版本的 HttpClient (4.2.5)
这与我使用的 HttpClient 版本 4.5.1 冲突。 我试图在我的 EMR 作业中首先加载用户类路径,但随后我在 Codec 类上发生冲突。 我什至重写了类以使用旧版本 (4.2.5),但仍然遇到一些冲突。
在我的 EMR 作业中,如何打印 StdOut/StdErr 或其他地方的完整类路径,以便我可以调试类路径中有哪些 Jar?
我知道如何获得“正常”的 Java 类路径,但想知道是否有任何可能是 Hadoop 和/或 EMR 特定的方面也包括 Hadoop/EMR jar。
最佳答案
这是我使用系统类加载器的过程,我将它添加到我的 Hadoop 驱动程序类中
public static void logClasspathToStdOut() {
try {
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
int i = 1;
System.out.println("SystemClassLoader classpath includes:");
for (URL url : urls) {
System.out.println(i + " : " + url.getFile());
i++;
}
} catch(Exception e) {
System.err.println("Exception logging classpath " + e.getMessage());
}
}
(在此处了解类加载器类型之间的区别 Difference between thread's context class loader and normal classloader )
我在 EMR 的“stdout”上得到了以下输出
SystemClassLoader classpath includes:
1 : /home/hadoop/.versions/2.4.0/etc/hadoop/
2 : /home/hadoop/.versions/2.4.0/share/hadoop/common/lib/httpclient-4.2.5.jar
3 : /usr/share/aws/emr/kinesis/lib/EmrKinesisHadoop-1.0.1.jar
.
.
354 : /usr/share/aws/emr/lib/gson-2.2.2.jar
355 : /usr/share/aws/emr/lib/commons-httpclient-3.0.jar
关于java - 在 AWS EMR 中,我如何记录类路径以调试类加载器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39494253/