java - Hadoop 作业返回异常“classNotFound”
问题描述
我正在尝试在 hadoop 上启动字数地图减少。当我要求 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
一个更稳定的解决方案是让您的 jar 由 Maven 或 Gradle 等构建工具正确构建。
推荐阅读
- python - 使用 Regex Python 在特殊字符之间提取字符
- airflow - 如何删除所有匹配的记录?
- php - 找到可以在同一可用时间互相访问的用户(时间重叠)
- c# - RabbitMq Consumer.Received 有时会启动,有时则不会
- .net - Visual Studio - 如何在 .NET 源代码中设置断点(核心库,不是我的代码)
- visual-studio-code - blazor wasm 项目错误仅在 Visual Studio 代码上
- r - 在时间序列中更改 ggplot 线的大小
- python - 训练具有 2D 输出的 ANN
- android - Xamarin 的 View.GestureRecognizers 属性的 Android 等效项是什么?
- angular - 如何在 ng2-pdfjs-viewer 中实现 PDFViewerApplication 和 PDFViewerApplicationOptions