gpt4 book ai didi

在spark集群上运行程序时出现java.lang.ClassNotFoundException

转载 作者:行者123 更新时间:2023-12-01 09:57:19 30 4
gpt4 key购买 nike

我有一个 Spark scala 程序,它加载我用 java 编写的 jar。从该 jar 中调用一个静态函数,该函数尝试从文件 (Pattern.class) 中读取序列化对象,但抛出 java.lang.ClassNotFoundException。在本地运行 Spark 程序可以工作,但在集群工作人员上则不行。这特别奇怪,因为在我尝试从文件中读取之前,我实例化了一个 Pattern 对象,并且没有任何问题。

我确信我在文件中写入的 Pattern 对象与我尝试读取的 Pattern 对象相同。

我检查了从机中的 jar,并且 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();

LE:我在运行时检查了类路径,但 jar 的路径不存在。我为执行者添加了它,但我仍然遇到同样的问题。我不认为是这样,因为我在 jar 中有调用 readObject 函数的 Pattern 类。

最佳答案

建议添加这种方法来在调用之前找出类路径资源,以确保从调用者的角度来看一切都很好

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/您的 jars 目录/*.jar | tr ' ' ',')

  • 如本文所述 Trouble shooting guide :找不到类:类路径问题另一个常见问题是在编译 Spark 程序时看到类未定义,这是一个有点令人困惑的主题,因为 Spark 在执行进程时实际上正在运行多个 JVM,并且每个 JVM 的路径都必须正确。通常这可以归结为将依赖项正确传递给执行器。确保运行时在用于创建 Spark 上下文的 SparkConf 对象中包含一个包含所有依赖项的 fat Jar(我建议使用 sbt 程序集)。您最终应该在 Spark 应用程序中编写如下一行:

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

这应该可以解决绝大多数类未找到的问题。另一种选择是将您的依赖项放置在集群中所有工作节点的默认类路径上。这样你就不必传递一个大 jar 。

类未找到问题的唯一其他主要问题源于所使用的库的不同版本。例如,如果您在应用程序和 Spark 服务器中不使用相同版本的公共(public)库,您最终将遇到类路径问题。当您针对一个版本的库(例如 Spark 1.1.0)进行编译,然后尝试针对具有不同或过时版本(例如 Spark 0.9.2)的集群运行时,可能会发生这种情况。确保您的库版本与加载到执行程序类路径上的任何版本相匹配。一个常见的示例是针对 Spark Cassandra 连接器的 alpha 版本进行编译,然后尝试使用旧版本的类路径引用来运行。

关于在spark集群上运行程序时出现java.lang.ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37092290/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com