在aws emr中如何记录类路径以调试类加载器问题

c86crjj0  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(320)

我在类加载器地狱-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
这与我使用的httpclient 4.5.1版本冲突。在emr作业中,我尝试先加载用户类路径,但后来在编解码器类上发生冲突。我甚至重写了类以使用旧版本(4.2.5),但仍然有一些冲突。
在我的emr工作中,如何打印stdout/stderr或其他地方的完整类路径,以便调试类路径中的jar?
我知道如何获得一个“普通的”java类路径,但我想知道是否有任何方面可能是hadoop和/或emr特定的,以包括hadoop/emr jar。

holgip5t

holgip5t1#

下面是我使用系统类加载器的过程,我将它添加到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());
    }
  }

(阅读这里的类加载器类型之间的区别线程的上下文类加载器和普通类加载器之间的区别)
我在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

相关问题