繁体   English   中英

在AWS EMR中,如何记录类路径以调试类加载器问题

[英]In AWS EMR how do I log the classpath to debug classloader issues

我在Classloader地狱 - Hadoop(高达2.7.2)使用过时版本的HttpClient(4.2.5)

https://hadoop.apache.org/docs/r2.7.2/hadoop-mapreduce-client/hadoop-mapreduce-client-core/dependency-analysis.html

这与我使用4.5.1的HttpClient版本冲突。 我试图在我的EMR作业中首先加载User类路径,但后来我在Codec类上遇到了冲突。 我甚至重写了使用旧版本(4.2.5)的类,但我仍然遇到了一些冲突。

在我的EMR作业中,如何打印StdOut / StdErr或其他地方的完整类路径,以便我可以调试哪些Jars在类路径中?

我知道如何获得“正常”的Java类路径,但想知道是否有任何可能是Hadoop和/或特定于EMR的方面也包括Hadoop / EMR jar。

以下是我使用System Classloader进行的过程,并将其添加到我的Hadoop Driver类中

 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());
    }
  }

(阅读这里类加载器类型之间的区别)线程的上下文类加载器和普通类加载器之间的区别

我在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM