Хобрук: Ваш путь к мастерству в программировании

java.lang.ClassNotFoundException при запуске программы в искровом кластере

У меня есть программа spark scala, которая загружает банку, которую я написал на java. Из этого jar вызывается статическая функция, которая пытается прочитать сериализованный объект из файла (Pattern.class), но выдает ошибку java.lang.ClassNotFoundException. Локальный запуск программы spark работает, а на рабочих кластерах — нет. Это особенно странно, потому что, прежде чем я попытаюсь прочитать из файла, я создаю экземпляр объекта Pattern, и проблем не возникает.

Я уверен, что объекты Pattern, которые я записал в файл, совпадают с объектами Pattern, которые я пытаюсь прочитать.

Я проверил банку на подчиненной машине, и там есть класс Pattern.

Кто-нибудь знает, в чем может быть проблема? Я могу добавить больше деталей, если это необходимо.

Это класс Pattern

public class Pattern implements Serializable {
private static final long serialVersionUID = 588249593084959064L;

public static enum RelationPatternType {NONE, LEFT, RIGHT, BOTH};
RelationPatternType type;
String entity;
String pattern;
List<Token> tokens;
Relation relation = null;

public Pattern(RelationPatternType type, String entity, List<Token> tokens, Relation relation) {
    this.type = type;
    this.entity = entity;
    this.tokens = tokens;
    this.relation = relation;
    if (this.tokens != null)
        this.pattern = StringUtils.join(" ", this.tokens.toString());
}

}

Я читаю файл с S3 следующим образом:

AmazonS3 s3Client = new AmazonS3Client(credentials);
S3Object confidentPatternsObject = s3Client.getObject(new GetObjectRequest("xxx","confidentPatterns"));
objectData = confidentPatternsObject.getObjectContent();
ois = new ObjectInputStream(objectData);
confidentPatterns = (Map<Pattern, Tuple2<Integer, Integer>>) ois.readObject();

ЛЭ: Я проверил путь к классам во время выполнения, и пути к банке там не было. Я добавил его для исполнителей, но у меня все еще та же проблема. Я не думаю, что это было так, поскольку у меня есть класс Pattern внутри jar, который вызывает функцию readObject.


  • У вас есть свой класс в пути к классам в случае кластера? 07.05.2016
  • Шаблон — это ваш собственный класс, верно? это не тот из JDK? 07.05.2016
  • Он находится в jar-файле, который запускается в кластере, поэтому я предполагаю, что он должен иметь к нему доступ. 07.05.2016
  • И да, Pattern — это мой собственный класс. 07.05.2016
  • возможно, вы могли бы показать нам больше, например, ваш класс Pattern и как вы его сериализуете и десериализуете 07.05.2016
  • быстрый вопрос, вы используете киросериализацию? 07.05.2016
  • Неа. Поможет ли это? 08.05.2016

Ответы:


1

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

public static void printClassPathResources() {
        final ClassLoader cl = ClassLoader.getSystemClassLoader();
        final URL[] urls = ((URLClassLoader) cl).getURLs();
        LOG.info("Print All Class path resources under currently running class");
        for (final URL url : urls) {
            LOG.info(url.getFile());
        }

    }
  • Это пример конфигурации Spark 1.5.

--conf "spark.driver.extraLibrayPath=$HADOOP_HOME/*:$HBASE_HOME/*:$HADOOP_HOME/lib/*:$HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar:$HDFS_PATH/*:$SOLR_HOME/*:$SOLR_HOME/lib/*" \ --conf "spark.executor.extraLibraryPath=$HADOOP_HOME/*" \ --conf "spark.executor.extraClassPath=$(echo /your directory of jars/*.jar | tr ' ' ',')

  • Как описано в этом руководстве по устранению неполадок :Класс не найден: проблемы с путем к классам Еще одна распространенная проблема заключается в том, что класс не определен при компиляции программ Spark. Это немного запутанная тема, потому что Spark на самом деле запускает несколько JVM, когда выполняет ваш процесс, и путь должен быть правильным. для каждого из них. Обычно это сводится к правильной передаче зависимостей исполнителям. Убедитесь, что при запуске вы включаете толстый Jar, содержащий все ваши зависимости (я рекомендую использовать сборку sbt) в объект SparkConf, используемый для создания контекста Spark. Вы должны в конечном итоге написать такую ​​​​строку в своем приложении spark:

val conf = new SparkConf().setAppName(appName).setJars(Seq(System.getProperty("user.dir") + "/target/scala-2.10/sparktest.jar"))

Это должно исправить подавляющее большинство проблем класса, которые не найдены. Другой вариант — поместить ваши зависимости в путь к классам по умолчанию на всех рабочих узлах в кластере. Таким образом, вам не придется передавать большую банку.

Единственная другая серьезная проблема с классом, не найденным, связана с разными версиями используемых библиотек. Например, если вы не используете идентичные версии общих библиотек в своем приложении и на сервере spark, у вас могут возникнуть проблемы с путями к классам. Это может произойти, когда вы компилируете одну версию библиотеки (например, Spark 1.1.0), а затем пытаетесь запустить кластер с другой или устаревшей версией (например, Spark 0.9.2). Убедитесь, что вы сопоставляете версии своей библиотеки с тем, что загружается в пути к классам исполнителя. Типичным примером этого может быть компиляция альфа-сборки Spark Cassandra Connector, а затем попытка запуска с использованием ссылок на пути к классам на более старую версию.

07.05.2016
  • Я вывел путь к классам, используя это. Пути к кувшину там не было. Я добавил его, и у меня все еще та же проблема. 08.05.2016
  • Можете ли вы вставить сюда свою команду spark-submit? какие параметры пути к классам вы используете, например driverClassPath , executorClassPath и т. д. 08.05.2016
  • ~/spark/bin/spark-submit --jars /root/work/project-1.0-SNAPSHOT.jar --class peoplegraph.Main --driver-memory 50g pipe-1.0.jar, и я установил путь к классам следующим образом: conf .set(spark.executor.extraClassPath, ./) 08.05.2016
  • см. руководство по устранению неполадок, добавленное в ответ, которое может вам помочь 08.05.2016
  • @Tomy: Любой прогресс в этом. было полезно? 09.05.2016
  • Нет :( В конце концов я сдался и собираюсь читать из текстового файла. 09.05.2016
  • Я не могу угадать, что вы собираетесь читать из текстового файла? Если проблема решена... продолжайте публиковать сообщения... Мне интересно узнать, что вы сделали, чтобы решить эту проблему. Спасибо. 09.05.2016
  • Это не решено, но я постараюсь пока обойтись без этого. Я имел в виду, что собираюсь читать текстовый файл и читать сериализованный объект. 09.05.2016
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..