Удалить JAR из стандартного пути Spark в EMR - PullRequest
0 голосов
/ 22 мая 2019

Я выполняю сценарий 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

1 Ответ

1 голос
/ 22 мая 2019

один из способов - указать lib, где находится старая версия jar, а затем исключить ее.

пример сценария оболочки для spark-submit:

export latestguicejar='your path to latest guice jar'

   #!/bin/sh
    # build all other dependent jars in OTHER_JARS

JARS=`find /usr/lib/spark/jars/ -name '*.jar'`
OTHER_JARS=""
   for eachjarinlib in $JARS ; do    
if [ "$eachjarinlib" != "guice-3.0.jar" ]; then
       OTHER_JARS=$eachjarinlib,$OTHER_JARS
fi
done
echo ---final list of jars are : $OTHER_JARS
echo $CLASSPATH

spark-submit --verbose --class <yourclass>
... OTHER OPTIONS
--jars $OTHER_JARS,$latestguicejar,APPLICATIONJARTOBEADDEDSEPERATELY.JAR

также см. Holdens ответ .проверьте с вашей версией искры, что доступно.

Согласно документам среда выполнения userClassPathFirst присутствует в последней версии спарка на сегодняшний день.

spark.executor.userClassPathFirst
spark.driver.userClassPathFirst

, для этого вы можете сделать Uber JAR со всеми зависимостями уровня приложения.

...