【发布时间】:2020-01-17 12:15:10
【问题描述】:
我使用的是 spark 2.4.1 版本和 java8。我正在尝试在使用 spark-submit 提交我的 spark 作业时加载外部属性文件。
因为我使用下面的 TypeSafe 来加载我的属性文件。
<groupId>com.typesafe</groupId>
<artifactId>config</artifactId>
<version>1.3.1</version>
在我的 spark 驱动程序类 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 作业脚本是
$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
我在这里做错了什么?如何解决这个问题? 任何修复都非常感谢。
已测试:
我在 class 中打印了类似的内容,在上面的行之前...以检查问题是否真的是 class not found。
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)
这里有什么问题?
【问题讨论】:
-
Class not found 通常是ClassLoader请求加载类时找不到类的错误。我对spark不太熟悉,但是你确定
ca-datamigration-0.0.1.jar里面包含这个类吗?可以解压看看吗? -
你能不能
jar -tf ca-datamigration-0.0.1.jar | grep -i QueryEntities看看文件是否包含在内?还可以查看--jars "/local/jars/*.jar"中的罐子。 -
请确定您的构建系统并包含您的完整构建配置
-
比较错误 "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。您看得出来差别吗?提示:包不匹配。 -
你是如何“移动”班级的?它应该是应用程序类捆绑在一起的构建过程的一部分。
标签: yaml databricks snakeyaml typesafe typesafe-config