解决:com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat

本文详细描述了一个Spark在读取文件时遇到的IllegalAccessError错误,该问题源于特定版本的Hadoop与Spark不兼容。通过将Hadoop版本从2.6.4更改为2.2.0或2.7.2,成功解决了此问题。

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

spark读取文件的时候报的一个错误:

Exception in thread "main" java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.<init>()V from class org.apache.hadoop.mapred.FileInputFormat
	at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:312)
	at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:199)
	at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)
	at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)
	at scala.Option.getOrElse(Option.scala:120)
	at org.apache.spark.rdd.RDD.partitions(RDD.scala:237)
	at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
	at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)
	at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)
	at scala.Option.getOrElse(Option.scala:120)
	at org.apache.spark.rdd.RDD.partitions(RDD.scala:237)
	at org.apache.spark.SparkContext.runJob(SparkContext.scala:1929)
	at org.apache.spark.rdd.RDD$$anonfun$foreach$1.apply(RDD.scala:912)
	at org.apache.spark.rdd.RDD$$anonfun$foreach$1.apply(RDD.scala:910)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150)
	at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:111)
	at org.apache.spark.rdd.RDD.withScope(RDD.scala:316)
	at org.apache.spark.rdd.RDD.foreach(RDD.scala:910)
	at game.Game01$.main(Game01.scala:17)
	at game.Game01.main(Game01.scala)

pom文件版本

<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
UTF-8
<scala.version>2.10.6</scala.version>
<spark.version>1.6.1</spark.version>
<hadoop.version>2.6.4</hadoop.version>

解决办法:
把hadoop version改成2.2.0就可以了,测了一下2.7.2也可以,所以估计是hadoop的一个坑,2.7.2就修复了。其他版本没试

<think>嗯,用户遇到了Hive Metastore启动时因JvmPauseMonitor导致的IllegalAccessError问题,需要解决方案。首先,我得理解这个问题的根本原因。根据错误信息,可能与Guava库的版本冲突有关,特别是Hadoop和Hive依赖的Guava版本不一致。比如,Hadoop 3.x需要Guava 27+,而Hive可能还在用Guava 19或更旧版本,这样在初始化JvmPauseMonitor时就会因为方法访问权限变化而报错。 接下来,我要回忆一下常见的依赖冲突解决方法。用户可能需要在Hive的lib目录下替换Guava的jar包,或者排除冲突的依赖,然后引入正确的版本。另外,Hadoop和Hive的版本兼容性也是一个关键点,需要确认他们使用的版本是否匹配。例如,CDH和HDP可能有特定的版本组合,用户需要参考官方文档。 此外,日志分析也很重要,用户需要检查Hive Metastore的日志文件,通常在/var/log/hive/目录下,查看具体的错误堆栈,确认是否是Guava的问题。如果确实如此,替换Guava库可能有效。不过,替换后需要重启服务,并测试是否解决了问题。 可能还需要考虑类加载器的问题,比如使用Hadoop的隔离机制,或者调整类加载顺序。但这种方法可能比较复杂,需要谨慎操作。另外,用户可能没有提到他们使用的Hadoop和Hive的具体版本,这可能需要进一步询问,但根据提供的引用,CDH的环境日志位置被提到,可能是在CDH集群中,所以需要参考Cloudera的文档进行版本调整。 最后,生成的相关问题要覆盖依赖冲突解决、日志查看、版本兼容性以及高可用配置,这样用户如果有其他相关问题也能找到答案。</think>### Hive Metastore启动时IllegalAccessError问题分析与解决 #### 1. 问题定位 该错误通常由Guava库版本冲突引起。Hadoop和Hive组件对Guava库的版本要求不同,例如: - Hadoop 3.x需要Guava 27+ - Hive 3.x需要Guava 19.0~27.0 当Hive Metastore初始化JvmPauseMonitor时,会因Guava的`MethodHandles.Lookup.defineClass`方法访问权限变更导致冲突[^3]。 #### 2. 解决方案步骤 (1)**确认组件版本** ```bash # 检查Hadoop Guava版本 hadoop classpath | grep guava # 检查Hive Guava版本 ls $HIVE_HOME/lib/guava-* ``` (2)**统一Guava版本** ```bash # 删除Hive旧版本Guava rm $HIVE_HOME/lib/guava-19.0.jar # 复制Hadoop的Guava到Hive cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib/ ``` (3)**配置类加载隔离**(CDH环境) 在`hive-env.sh`添加: ```bash export HADOOP_USER_CLASSPATH_FIRST=true export HIVE_DEFAULT_HADOOP_OPTS="-Dmapreduce.job.classloader=true" ``` (4)**Metastore服务重启** ```bash # CDH环境使用CM重启 sudo service hive-metastore restart # 验证日志输出 tail -f /var/log/hive/hadoop-cmf-hive-HIVEMETASTORE-*.log.out ``` #### 3. 预防措施 - 使用Maven依赖树检查冲突:`mvn dependency:tree -Dincludes=com.google.guava` - 部署高可用Metastore时,确保所有节点依赖版本一致[^2] - 建议升级到Hive 4.x+(默认使用Guava 27+)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值