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

标签 java amazon-web-services hadoop elastic-map-reduce

我陷入了 Classloader hell - 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 作业中首先加载用户类路径,但随后我在 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/

相关文章:

java - 使用 Mockito 测试方法调用

amazon-web-services - Kubernetes DNS 大多数时候无法解析,但有时可以解决。我能做什么来解决这个问题?

amazon-web-services - 如何增加 AWS CPU 积分余额降为零?

apache - Apache Nutch爬虫如何排除静态文件夹之类; cgi-bin,图片,css是否从NutCrawer中排除?

hadoop - 尝试在 Hadoop 上运行 Mahout 测试分类器时出现 "GC overhead limit exceeded"

hadoop - 无法远程调试mapreduce作业的原因

java - 将 Spring Boot jar 部署到 Azure,并使 Azure 重新启动

java - 什么是最小的 Java Web MVC 框架?

java - 使用 Java 以编程方式将数据从 Google Cloud Storage 加载到 Bigquery 的选项?

Python Awis API 给出未定义的错误