Передача внешнего файла yml в моем искровом задании/коде не работает. Не удается создать объект Java для тега: yaml.org, 2002 г.

Я использую версию spark 2.4.1 и java8. Я пытаюсь загрузить внешний файл свойств при отправке задания spark с помощью spark-submit.

Поскольку я использую ниже TypeSafe для загрузки моего файла свойств.

<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.3.1</version>

В моем классе драйвера искры MyDriver.java я загружаю файл YML, как показано ниже.

String ymlFilename = args[1].toString();
Optional<QueryEntities>  entities =  InputYamlProcessor.process(ymlFilename);

У меня есть весь код, включая InputYamlProcessor.java

https://gist.github.com/BdLearnerr/e4c47c5f1dded951b18844b278ea3441

Это отлично работает на моем локальном компьютере, но когда я запускаю кластер, это дает ошибку

Ошибка :

Can't construct a java object for tag:yaml.org,2002:com.snp.yml.QueryEntities; exception=Class not found: com.snp.yml.QueryEntities
 in 'reader', line 1, column 1:
    entities:
    ^

        at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:345)
        at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:127)
        at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:450)
        at org.yaml.snakeyaml.Yaml.loadAs(Yaml.java:444)
        at com.snp.yml.InputYamlProcessor.process(InputYamlProcessor.java:62)
Caused by: org.yaml.snakeyaml.error.YAMLException: Class not found: com.snp.yml.QueryEntities
        at org.yaml.snakeyaml.constructor.Constructor.getClassForNode(Constructor.java:650)
        at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.getConstructor(Constructor.java:331)
        at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:341)
        ... 12 more

Мой скрипт работы искры

 $SPARK_HOME/bin/spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --name MyDriver  \
    --jars "/local/jars/*.jar" \
    --files hdfs://files/application-cloud-dev.properties,hdfs://files/column_family_condition.yml \
    --class com.sp.MyDriver \
    --executor-cores 3 \
    --executor-memory 9g \
    --num-executors 5 \
    --driver-cores 2 \
    --driver-memory 4g \
    --driver-java-options -Dconfig.file=./application-cloud-dev.properties \
    --conf spark.executor.extraJavaOptions=-Dconfig.file=./application-cloud-dev.properties \
    --conf spark.driver.extraClassPath=. \
    --driver-class-path . \
     ca-datamigration-0.0.1.jar application-cloud-dev.properties column_family_condition.yml

Что я здесь делаю неправильно? Как исправить эту проблему? Любое исправление очень благодарно.

Проверено:

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

public static void printTest() {
    QueryEntity e1 = new QueryEntity();
    e1.setTableName("tab1");
    List<QueryEntity> li = new ArrayList<QueryEntity>();
    li.add(e1);


    QueryEntities ll = new QueryEntities();
    ll.setEntitiesList(li);

    ll.getEntitiesList().stream().forEach(e -> logger.error("e1 Name :" + e.getTableName()));


    return;
}

Вывод:

19/09/18 04:40:33 ERROR yml.InputYamlProcessor: e1 Name :tab1
    Can't construct a java object for tag:yaml.org,2002:com.snp.helpers.QueryEntities; exception=Class not found: com.snp.helpers.QueryEntities
             in 'reader', line 1, column 1:
                entitiesList:
         at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:345)

Что здесь не так?


person BdEngineer    schedule 16.09.2019    source источник
comment
Class not found обычно является ошибкой, когда класс не может быть найден, когда ClassLoader запросил его для загрузки. Я не так хорошо знаком с spark, но вы уверены, что ca-datamigration-0.0.1.jar содержит этот класс внутри? Можешь разархивировать и проверить?   -  person Michał Krzywański    schedule 16.09.2019
comment
Вы можете сделать jar -tf ca-datamigration-0.0.1.jar | grep -i QueryEntities и посмотреть, включены ли файлы? Также проверьте банки в --jars "/local/jars/*.jar".   -  person Jacek Laskowski    schedule 16.09.2019
comment
Укажите свою систему сборки и включите полную конфигурацию сборки.   -  person Marcin    schedule 17.09.2019
comment
Сравните ошибку exception=Class not found: com.snp.yml.QueryEntities с [ ca-datamigration]$ jar -tf ca-datamigration-0.0.1.jar | grep -i QueryEntities com/yml/QueryEntities.class. Вы можете заметить разницу? Подсказка: пакеты не совпадают.   -  person Jacek Laskowski    schedule 17.09.2019
comment
Как вы переместили курс? Это должно быть частью процесса сборки, когда классы приложений объединяются вместе.   -  person Jacek Laskowski    schedule 17.09.2019


Ответы (1)


Это не имеет ничего общего с QueryEntities, т.е. YAMLException: Class not found: com.snp.yml.QueryEntities

проблема с конструктором YML

Изменился на

Yaml yaml = new Yaml(new  CustomClassLoaderConstructor(com.snp.helpers.QueryEntities.class.getClassLoader()));

От

/*Constructor constructor = new Constructor(com.snp.helpers.QueryEntities.class);
        Yaml yaml = new Yaml( constructor );*/
person BdEngineer    schedule 18.09.2019