Как переопределить искровые банки при выполнении команды spark-submit в режиме кластера? (Okhttp3) - PullRequest
0 голосов
/ 10 апреля 2020

В моем проекте конфликт jar и jar в папке spark-2.4.0 jars. Мой Retrofit приносит okhttp-3.13.1.jar (проверено в зависимости mvn: tree), но у сервера спарк есть okhttp-3.8.1.jar, и я получаю NoSuchMethodException. Итак, я пытаюсь дать банку, чтобы переопределить ее. Когда я пытаюсь запустить команду spark submit в режиме client, он выбирает явный файл JAR, который я предоставил, но когда я пытаюсь запустить его в режиме cluster, он не может переопределить файл JAR на рабочих узлах, и исполнители используют та же самая старая банка Искры, которая приводит к NoSuchMethodError. Моя банка - толстая, но искровая банка почему-то превалирует над той же. Если бы я мог удалить банки, предоставленные Spark, это, вероятно, сработало бы, но я не смогу, так как другие службы могут использовать его.

Ниже приведена моя команда:

./spark-submit --class com.myJob --conf spark.yarn.appMasterEnv.ENV=uat --conf spark.driver.memory=12g  --conf spark.executor.memory=40g --conf spark.sql.warehouse.dir=/user/myuser/spark-warehouse --conf "spark.driver.extraClassPath=/home/test/okhttp-3.13.1.jar" --conf "spark.executor.extraClassPath=/home/test/okhttp-3.13.1.jar" --jars /home/test/okhttp-3.13.1.jar  --conf spark.submit.deployMode=cluster --conf spark.yarn.archive=hdfs://namenode/frameworks/spark/spark-2.4.0-archives/spark-2.4.0-archive.zip --conf spark.master=yarn --conf spark.executor.cores=4 --queue public file:///home/mytest/myjar-SNAPSHOT.jar


final Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(configuration.ApiUrl()) //this throws nosuchmethodexception
                    .addConverterFactory(JacksonConverterFactory.create(new ObjectMapper()))
                    .build();

Моя зависимость от mvn: дерево не указывает какие-либо другие переходные банки в моем банке. И он прекрасно работает как в IntelliJ, так и с mvn clean install.

. Я даже безуспешно пытался указать путь jar (hdfs://users/myuser/myjars/okhttp-3.13.1.jar) в формате hdfs. Может ли кто-нибудь пролить немного света?

Я получу следующее исключение, если попробую оба варианта: --conf "spark.driver.userClassPathFirst=true" --conf "spark.executor.userClassPathFirst=true"

Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.apache.spark.deploy.yarn.YarnSparkHadoopUtil$.<init>(YarnSparkHadoopUtil.scala:48)
    at org.apache.spark.deploy.yarn.YarnSparkHadoopUtil$.<clinit>(YarnSparkHadoopUtil.scala)
    at org.apache.spark.deploy.yarn.Client$$anonfun$1.apply$mcJ$sp(Client.scala:81)
    at org.apache.spark.deploy.yarn.Client$$anonfun$1.apply(Client.scala:81)
    at org.apache.spark.deploy.yarn.Client$$anonfun$1.apply(Client.scala:81)
    at scala.Option.getOrElse(Option.scala:121)
    at org.apache.spark.deploy.yarn.Client.<init>(Client.scala:80)
    at org.apache.spark.deploy.yarn.YarnClusterApplication.start(Client.scala:1526)
    at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:849)
    at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
    at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
    at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
    at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: java.lang.ClassCastException: org.apache.hadoop.yarn.api.records.impl.pb.PriorityPBImpl cannot be cast to org.apache.hadoop.yarn.api.records.Priority
    at org.apache.hadoop.yarn.api.records.Priority.newInstance(Priority.java:39)
    at org.apache.hadoop.yarn.api.records.Priority.<clinit>(Priority.java:34)
    ... 15 more

Но если у меня только --conf "spark.executor.userClassPathFirst=true", то он зависнет

1 Ответ

1 голос
/ 12 апреля 2020

Я решил проблему с помощью плагина Maven Shade.

Игнорировать собственные банки с искровым кластером

Ссылочное видео:

https://youtu.be/WyfHUNnMutg?t=23m1s

Я следовал за ответом здесь дано и добавлено следующее. Даже в исходном коде SparkSubmit вы увидите добавление jar к общему списку jar, если мы дадим --jar, поэтому он никогда не заменит эти параметры, но добавит jar

https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala#L644

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <relocations>
                                <relocation>
                                    <pattern>okio</pattern>
                                    <shadedPattern>com.shaded.okio</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>okhttp3</pattern>
                                    <shadedPattern>com.shaded.okhttp3</shadedPattern>
                                </relocation>
                            </relocations>
                            <filters>
                                <filter>
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                        <exclude>log4j.properties</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
...