有没有办法了解spark如何加载类路径以及以什么顺序加载?

时间:2018-12-12 17:35:58

标签: java apache-spark hadoop2 amazon-emr

我正在尝试在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

但是以某种方式,它仍然会加载我通过类路径详细选项找到的默认avro jar(旧1.7.4)

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

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

是否可以查看为spark提交运行而加载的确切类路径顺序,任何jvm选项等都将有所帮助。

简单地说一下类路径的顺序(顺序,首先是我的客户罐vs火花罐vs hadoop罐)

1 个答案:

答案 0 :(得分:1)

在运行时,如果具有相同全限定名(包+类名)的两个类驻留在类路径(库或直接类)中,则类加载器可以以特定于该类的方式从一个或另一个jar中加载该类。当前的类加载器,用于加载类。
您不能对其选择做出任何合理的押注。

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

  

额外的类路径条目,以附加到驱动程序的类路径。

长话短说:更改类路径值以仅指定所需的版本。