hadoop运行报错: java.lang.ClassNotFoundException解决方法

针对Hadoop中自定义Mapper在集群上执行失败的问题,本文详细分析了错误原因,并提供了具体的解决方案,即通过设置setJarByClass方法来确保用户类能够被正确加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:JesseZhang (CNZQS|JesseZhang

博客地址:http://www.cnzqs.com


在创建自定义的Mapper时候,编译正确,但上传到集群执行时出现错误:
11/12/11 22:53:16 INFO mapred.JobClient: Task Id : attempt_201111301626_0015_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: actiondemo.MyJob$MapClass
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:866)
        at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:199)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:719)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
        at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
        at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.ClassNotFoundException: actiondemo.MyJob$MapClass
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:819)
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:864)
        ... 8 more

经过验证,发现问题原因及解决办法如下:

因为使用的是0.20以上的Hadoop版本,在调用jar中的自定义mapper时,需要设置setJarByClass方法,设置方法如下:
job.setJarByClass(MyJob.class);
其实,在输出日志中也有提示信息:
11/12/11 22:53:03 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
job.setJarByClass(MyJob.class);

-----------------------------------------

本文链接地址: http://www.cnzqs.com/?p=118

### Java 中使用 7z 压缩时出现 `ClassNotFoundException` 的解决方案 当在 Java 应用程序中尝试使用 7z 压缩功能并遇到 `java.lang.ClassNotFoundException: org.tukaani.xz.LZMA2Options` 错误时,这通常表明缺少必要的依赖库来支持 LZMA 或 XZ 压缩算法。以下是详细的分析和解决方法: #### 问题原因 该错误表示 JVM(Java Virtual Machine)无法找到类 `org.tukaani.xz.LZMA2Options`。此问题可能由以下原因之一引起: 1. 缺少 Tukaani XZ Library 的 JAR 文件。 2. 配置文件中的路径设置不正确或存在多余的空格、回车等问题[^2]。 #### 解决方案 为了成功处理 7z 压缩文件,需确保项目已正确引入所需的依赖项,并验证其版本兼容性。 ##### 方法一:通过 Maven 添加依赖 如果正在使用 Maven 构建工具,则可以在项目的 `pom.xml` 文件中添加如下依赖项: ```xml <dependency> <groupId>org.tukaani</groupId> <artifactId>xz</artifactId> <version>1.9</version> </dependency> ``` 上述代码片段会自动下载最新版的 Tukaani XZ Library 并将其集成到项目中[^4]。 ##### 方法二:手动导入 JAR 文件 对于未采用构建管理系统的环境,可以从官方仓库或其他可信源获取最新的 `xz-java.jar` 文件,并将其放置于应用的 CLASSPATH 下。例如,在 Eclipse IDE 中可通过右键单击项目 -> Build Path -> Configure Build Path 来完成操作。 注意:确认所选 jar 版本与运行平台匹配且无冲突情况发生。 ##### 方法三:检查配置文件格式 如同 Hadoop 场景下因不当编辑 hdfs-site.xml 导致服务异常一样[^3],任何 XML 类型的设定都应遵循严格的语法规则——避免非法字符干扰解析过程。因此建议再次审视相关参数定义部分是否存在多余空白符或者拼写失误现象。 最后重启应用程序以使更改生效。 ```python import org.tukaani.xz.LZMA2Options; public class TestLZMA { public static void main(String[] args){ try{ LZMA2Options options = new LZMA2Options(); System.out.println("Successfully created LZMA2Options instance."); }catch(Exception e){ e.printStackTrace(); } } } ``` 以上示例展示了如何创建一个简单的测试案例用于验证基础功能是否正常运作。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值