运行Mongo-Hadoop Connector的WordCount jar包出现NoClassDefFoundError错误
问题原因
出现NoClassDefFoundError: org/apache/commons/lang/StringUtils报错的核心原因是运行环境缺失Apache Commons Lang 2.x依赖:Mongo-Hadoop Connector的核心工具类依赖该包下的StringUtils工具,且注意不能用3.x版本的Commons Lang,3.x版本的包路径为org/apache/commons/lang3/StringUtils,和报错路径不匹配,无法兼容。
解决方案
- 方案1:打包全依赖fat jar(最稳定,推荐)
如果你使用Maven管理项目,首先在pom.xml中添加2.6版本的commons-lang依赖:
再配置<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>maven-shade-plugin或者maven-assembly-plugin插件,打包时把所有依赖打进jar包,后续直接运行该带依赖的jar包即可。 - 方案2:提交任务时动态加载依赖
不需要修改打包逻辑,提交Hadoop任务时通过-libjars参数指定commons-lang2的jar包路径:hadoop jar 你的WordCount.jar 主类全限定名 -libjars /本地路径/commons-lang-2.6.jar - 方案3:集群全局添加依赖
将commons-lang-2.6.jar上传到Hadoop集群所有节点的$HADOOP_HOME/share/hadoop/common/lib/目录,重启Hadoop服务后再运行任务,适合集群固定要跑Mongo-Hadoop相关任务的场景。
验证方式
可以执行jar tf 你的jar包.jar | grep "org/apache/commons/lang/StringUtils"检查jar包是否已经包含对应的类,确认依赖打包成功。
内容的提问来源于stack exchange,提问作者Long Cảnh
相关产品推荐
相关产品推荐

