私のsparkアプリケーションはAWS EMRクラスタ上で動作しません。私は、これは、いくつかのクラスが私のアプリケーションjarではなく、EMRによって設定されたパスからロードされていることに気づきました。ファイル::!/usr/lib/spark/jars/avro-1.7.7.jar/orgの例ここでAWS上でスパークする理由EMRはアプリケーションのfat 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は」jarファイルからロードされます/apache/avro/Schema.class "
一方、com.sksamuel.avro4s
はavro 1.8.1に依存します。私のアプリケーションはfat jarとして構築され、avro 1.8.1を持っています。それはなぜロードされていないのですか? EMRから1.7.7を選択する代わりにクラスパスを設定します。
これは単なる例です。私は私のアプリケーションに含まれている他のライブラリと同じことが分かります。 Sparkは1.7.7に依存しているので、他の依存関係を含めるときには陰にする必要があります。しかし、なぜ私のアプリjarに含まれるクラスが最初に読み込まれないのですか?