Sqoop导入失败抛出main线程异常:NoSuchMethodError问题
解决Sqoop导入时抛出
java.lang.NoSuchMethodError: org.apache.hadoop.util.StringUtils.toLowerCase(Ljava/lang/String;)Ljava/lang/String;异常 这个错误我在帮同事排查生产问题时遇到过好几次,本质是Hadoop与Sqoop版本不兼容或者类路径冲突导致的方法缺失,下面给你详细的排查和解决思路:
错误原因分析
从调用栈能看出来,Sqoop在提交MapReduce作业时,调用Hadoop的MRApps.addToClasspathIfNotJar方法时找不到目标方法。核心原因无非两种:
- 版本不匹配:不同Hadoop版本中
StringUtils类的方法签名发生了变化——比如Hadoop 3.x版本里,toLowerCase方法新增了Locale参数,而你的Sqoop版本依赖的是旧版Hadoop(比如2.x)的单参数版本,导致方法找不到。 - 类路径冲突:运行环境中同时存在多个版本的Hadoop
commonjar包,Sqoop加载了错误版本的类,引发方法缺失。
具体解决办法
1. 验证版本兼容性
先确认你的Hadoop和Sqoop版本是否匹配:
# 查看Hadoop版本 hadoop version # 查看Sqoop版本 sqoop version
对照Sqoop官方的版本兼容规则(比如Sqoop 1.4.7适配Hadoop 2.6/2.7,Sqoop 1.4.9+开始支持Hadoop 3.x),如果版本不匹配,更换为兼容的Sqoop版本即可。
2. 清理类路径冲突
- 检查Sqoop的lib目录:进入Sqoop安装目录下的
lib文件夹,查看hadoop-common-*.jar的版本是否和集群Hadoop版本一致,若不一致,删除旧版本jar,替换为集群对应的版本。 - 检查环境变量:执行
echo $HADOOP_CLASSPATH查看是否混入了其他版本的Hadoop jar,若有冲突路径,从环境变量中移除。 - 手动指定类路径:如果暂时无法修改环境,可在运行Sqoop命令时用
--libjars参数指定正确的Hadoop common jar,示例:sqoop import --libjars /path/to/hadoop-common-3.2.1.jar [你的其他导入参数]
3. 验证修复效果
重新运行Sqoop导入命令,观察是否还抛出该异常。如果问题依然存在,可以尝试清理Hadoop临时目录(比如/tmp/hadoop-*)后重新提交作业。
附用户提供的完整错误栈:
主线程异常:java.lang.NoSuchMethodError: org.apache.hadoop.util.StringUtils.toLowerCase(Ljava/lang/String;)Ljava/lang/String; 调用栈如下: at org.apache.hadoop.mapreduce.v2.util.MRApps.addToClasspathIfNotJar(MRApps.java:306) at org.apache.hadoop.mapreduce.v2.util.MRApps.setClasspath(MRApps.java:271) at org.apache.hadoop.mapred.YARNRunner.createApplicationSubmissionContext(YARNRunner.java:454) at org.apache.hadoop.mapred.YARNRunner.submitJob(YARNRunner.java:285) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:240) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1642) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308) at org.apache.sqoop.mapreduce.ImportJobBase.doSubmitJob(ImportJobBase.java:203) at org.apache.sqoop.mapreduce.ImportJobBase.runJob(ImportJobBase.java:176) at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:273) at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:692) at org.apache.sqoop.manager.MySQLManager.importTable(MySQLManager.java:127) at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:512) at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:620) at org.apache.sqoop.Sqoop.run(Sqoop.java:147) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243) at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
内容的提问来源于stack exchange,提问作者KARTHIK RAJ
相关产品推荐
相关产品推荐

