我的Spark应用程序无法在AWS EMR群集上运行。我注意到这是因为某些类从EMR设置的路径加载而不是从我的应用程序jar加载。文件:例如为什么AWS上的Spark EMR不会从应用程序的胖jar加载类?
java.lang.NoSuchMethodError: org.apache.avro.Schema$Field.<init>(Ljava/lang/String;Lorg/apache/avro/Schema;Ljava/lang/String;Ljava/lang/Object;)V
at com.sksamuel.avro4s.SchemaFor$.fieldBuilder(SchemaFor.scala:424)
at com.sksamuel.avro4s.SchemaFor$.fieldBuilder(SchemaFor.scala:406)
这里org.apache.avro.Schema从“罐子装!/usr/lib/spark/jars/avro-1.7.7.jar /组织/apache/avro/Schema.class“
而com.sksamuel.avro4s
取决于avro 1.8.1。我的应用程序被构建为一个胖罐子,并具有avro 1.8.1。为什么没有加载?而不是从EMR设置类路径中选择1.7.7。
这只是一个例子。我看到与我的应用程序中包含的其他库相同。可能是Spark,取决于1.7.7,当包含其他依赖关系时,我必须加以遮蔽。但为什么包含在我的应用程序jar中的类未被首先加载?