Исключение Spark submit ClassNotFoundException - PullRequest
0 голосов
/ 05 августа 2020

Эта проблема стара как Apache Spark, но все равно ни одно из решений мне не помогло. У меня есть следующее объявление класса:

object Main {
  def main(args: Array[String]): Unit = {
  ...
}

Ссылка на класс - org.griat.rcse.Main (ctrl + shift + alt + c в IntelliJ), то же самое остается в pom.xml:

<groupId>org.griat.rcse</groupId>

Как я пытаюсь его запустить:

spark-submit --master yarn --deploy-mode client --class org.griat.rcse.Main Glonass112-1.0-SNAPSHOT.jar

И однажды он сработал, но обнаружил исключение в коде. После того, как я исправил это, я clean ed и package d. Хотя pom.xml не изменился (а также пути и имена классов), он перестал отправляться в Spark, показывая ClassNotFoundException:

java.lang.ClassNotFoundException: org.griat.rcse.Main
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:348)
        at org.apache.spark.util.Utils$.classForName(Utils.scala:238)
        at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:810)
        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)

Я также добавил maven-jar-plugin, но это не поможет :

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>org.griat.rcse.Main</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

Что является источником этого черного мага c и как мне с этим справиться?

1 Ответ

1 голос
/ 05 августа 2020

Похоже, вы не создали «толстую банку», банку со всеми необходимыми зависимостями. Если вы этого не сделаете или если некоторые зависимости «предусмотрены», в противном случае эти зависимости должны быть в общем пути класса (проверьте переменные среды, заканчивающиеся на CLASSPATH.

Чтобы создать толстую банку, вам необходимо использовать подключаемый модуль сборки, как указано. См. вопрос:

В чем разница между подключаемым модулем Maven Jar и подключаемым модулем сборки Maven?

Вот пример pom-файла с добавленным плагином сборки.

Соответствующие строки:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.3</version>
</plugin>

Вот общие инструкции для плагина сборки - - обратите внимание, что вы можете использовать файл дескриптора XML, объяснение которого приведено в нижней части страницы.

Вы также можете легко проверить, содержит ли ваш jar-файл класс: класс должен отображаться при запуске jar tf path/to/assembled.jar, , как указано в документации . Для упрощения можно использовать grep: jar tf path/to/assembled.jar|grep org.griat.rcse

...