有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有没有一种方法可以理解spark是如何加载类路径以及加载顺序的?

我正在尝试在EMR上运行一个带有定制spark的spark作业,并尝试在驱动程序的额外类路径中使用定制jar,如

spark.driver.extraClassPath /usr/lib/hadoop/lib/hadoop-lzo.jar:/usr/local/java/avro-1.8.2.jar:/usr/local/java/avro-mapred-1.8.2-hadoop2.jar

但不知何故,它仍然加载默认的avrojar(旧的1.7.4),我通过类路径verbose选项找到了它

[Loaded org.apache.avro.generic.GenericContainer from file:/usr/lib/hadoop/lib/avro-1.7.4.jar]

我想了解类路径的加载顺序和优先级。为什么它仍然选择旧的通用hadoop avro 1.7.4,而不加载我想要使用的

是否有办法查看spark submit运行加载的确切类路径顺序,任何jvm选项等都会有所帮助

简单地说一下类路径的顺序(顺序,首先是我的custome jar vs spark jar vs hadoop jar)


共 (1) 个答案

  1. # 1 楼答案

    在运行时,如果类路径(库或直接类)中有两个具有相同完整限定名(包+类名)的类,则类加载器可以从一个或另一个jar中以特定于加载该类的当前类加载器的方式加载该类
    你不能在它的选择上下任何合理的赌注

    因此,在类路径中使用同一个库的两个版本显然是需要避免的:avro-1.8.2.jaravro-1.7.4.jar
    spark.driver.extraClassPath选项不会改变JVM的工作方式。它只是:

    Extra classpath entries to prepend to the classpath of the driver.

    长话短说:更改classpath值以仅指定所需的版本