Я выполняю сценарий spark-submit в шаге EMR, в котором в качестве основного класса используется мой супер JAR, например
spark-submit \
....
--class ${MY_CLASS} "${SUPER_JAR_S3_PATH}"
... и т. Д.
но Spark по умолчанию загружает файл jar: /usr/lib/spark/jars/guice-3.0.jar, который содержит com.google.inject.internal.InjectorImpl, класс, также входящий в Guice-4.x банка, которая находится в моем супер банке. Это приводит к java.lang.IllegalAccessError
, когда моя служба загружается.
Я попытался установить некоторые настройки Spark в spark-submit
, чтобы поместить мой супер-jar в classpath в надежде, что он загрузится первым, до того, как Spark загрузит guice-3.0.jar. Похоже:
--jars "${ASSEMBLY_JAR_S3_PATH}" \
--driver-class-path "/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:${SUPER_JAR_S3_PATH}" \
--conf spark.executor.extraClassPath="/etc/hadoop/conf:/etc/hive/conf:/usr/lib/hadoop-lzo/lib/*:/usr/share/aws/aws-java-sdk/*:/usr/share/aws/emr/emrfs/conf:/usr/share/aws/emr/emrfs/lib/*:/usr/share/aws/emr/emrfs/auxlib/*:${SUPER_JAR_S3_PATH}" \
но это приводит к той же ошибке.
Есть ли способ удалить этот guice-3.0.jar
из стандартного пути искры по умолчанию, чтобы мой код мог использовать InjectorImpl
, который упакован в Guice-4.x
JAR? Я также запускаю Spark в режиме клиента, поэтому я не могу использовать spark.driver.userClassPathFirst
или spark.executor.userClassPathFirst