Я использую версию 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)
Что здесь не так?
ca-datamigration-0.0.1.jar
содержит этот класс внутри? Можешь разархивировать и проверить? - person Michał Krzywański   schedule 16.09.2019jar -tf ca-datamigration-0.0.1.jar | grep -i QueryEntities
и посмотреть, включены ли файлы? Также проверьте банки в--jars "/local/jars/*.jar"
. - person Jacek Laskowski   schedule 16.09.2019[ ca-datamigration]$ jar -tf ca-datamigration-0.0.1.jar | grep -i QueryEntities com/yml/QueryEntities.class
. Вы можете заметить разницу? Подсказка: пакеты не совпадают. - person Jacek Laskowski   schedule 17.09.2019