java - Hadoop 作业返回异常 "classNotFound"

标签 java hadoop

我正在尝试在 hadoop 上启动一个字数统计图 reduce。当我要求 hadoop 完成这项工作时,它返回以下内容:

Exception in thread "main" java.lang.ClassNotFoundException: sdz.hadoop.wordcount.WordCountDriver
    at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:398)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:232)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:153)

这是输出:

 hadoop jar wordcount.jar sdz.hadoop.wordcount.WordCountDriver ../source.txt ../results

jar 文件如下所示:

$jar tf wordcount.jar 
META-INF/
META-INF/MANIFEST.MF
WordCountReducer.class
WordCountMapper.class
WordCountDriver.class

已使用以下命令/输出生成 jar 文件:

$jar -cvf wordcount.jar .
added manifest
adding: WordCountReducer.class(in = 1720) (out= 723)(deflated 57%)
adding: WordCountMapper.class(in = 2347) (out= 936)(deflated 60%)
adding: WordCountDriver.class(in = 2278) (out= 1118)(deflated 50%)

这些类是从以下命令生成的:

javac -classpath $HADOOP_CLASSPATH WordCount*.java

Java 文件包含(我知道无用的导入):


关于这个的其他问题说要添加“job.setJarByClass(WordCountDriver.class);”。但我已经有了。那么我的错误是什么?

最佳答案

作业将失败,因为它会尝试(但失败)在 jar 中的以下位置找到您的类:

sdz/hadoop/wordcount/WordCountDriver.class

最快的解决方案是简单地从运行命令中删除包名称(以及类本身中的任何包声明):

hadoop jar wordcount.jar WordCountDriver ../source.txt ../results

一个更稳定的解决方案是使用 Maven 或 Gradle 等构建工具正确构建您的 jar。

关于java - Hadoop 作业返回异常 "classNotFound",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59140064/

相关文章:

java - 在 IDEA 12.1.6 中禁用 scala 模板的导入折叠

java - 为什么我不能在参数中使用通配符类型来计算

hadoop - 如何增加 HBase 表中的区域数

java - 如何在新的mapreduce API中设置JobEndNotificationURI?

java - 为什么java中默认不启用assert

Java:如何更改文本区域中特定行或字符串行的颜色?

java - 如何使用 JSOUP 从 div 样式获取文本

networking - Cloudera Hadoop 在 EC2 上使用 Vagrant - 如何设置主机、IP 和网络?

hadoop - 从 Hive 中的选择查询中排除分区字段

java - 在UNO安装中的Accumulo 2.0上运行Hello World示例InsertWithBatchWriter的问题