java.lang.IllegalAccessError: class com.google.protobuf.HBaseZeroCopyByteString

本文详细介绍了Hadoop和Spark在操作HBase时遇到的Java.lang. IllegalAccessError问题的根本原因,并提供了在YARN和Spark环境下解决此问题的具体步骤和配置方法。

hadoop mr 或者 spark 操作 hbase时候就出现这个错误
这是hbase的bug,可在jira上看到该问题:https://issues.apache.org/jira/browse/HBASE-10304

报错信息:

15/08/17 19:28:33 ERROR yarn.ApplicationMaster: User class threw exception: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: class com.google.protobuf.HBaseZeroCopyByteString ca 
nnot access its superclass com.google.protobuf.LiteralByteString 
org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: class com.google.protobuf.HBaseZeroCopyByteString cannot access its superclass com.google.protobuf.LiteralByteString 
        at org.apache.hadoop.hbase.client.RpcRetryingCaller.translateException(RpcRetryingCaller.java:210) 
        at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:121) 
        at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:90) 
        at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:264) 
        at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:169) 
        at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:164) 
        at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:107) 
        at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:736) 
        at org.apache.hadoop.hbase.client.MetaScanner.metaScan(MetaScanner.java:178) 
        at org.apache.hadoop.hbase.client.MetaScanner.metaScan(MetaScanner.java:82) 
        at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.isTableAvailable(HConnectionManager.java:962) 
        at org.apache.hadoop.hbase.client.HBaseAdmin.isTableAvailable(HBaseAdmin.java:1081) 
        at org.apache.hadoop.hbase.client.HBaseAdmin.isTableAvailable(HBaseAdmin.java:1089) 
        at com.umeng.dp.yuliang.play.HBaseToES$.main(HBaseToES.scala:28) 
        at com.umeng.dp.yuliang.play.HBaseToES.main(HBaseToES.scala) 
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
        at java.lang.reflect.Method.invoke(Method.java:606) 
        at org.apache.spark.deploy.yarn.ApplicationMaster$$anon$2.run(ApplicationMaster.scala:483) 
Caused by: java.lang.IllegalAccessError: class com.google.protobuf.HBaseZeroCopyByteString cannot access its superclass com.google.protobuf.LiteralByteString 
        at java.lang.ClassLoader.defineClass1(Native Method) 
        at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
        at java.security.AccessController.doPrivileged(Native Method) 
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
        at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
        at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
        at org.apache.hadoop.hbase.protobuf.RequestConverter.buildRegionSpecifier(RequestConverter.java:930) 
        at org.apache.hadoop.hbase.protobuf.RequestConverter.buildScanRequest(RequestConverter.java:434) 
        at org.apache.hadoop.hbase.client.ScannerCallable.openScanner(ScannerCallable.java:297) 
        at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:157) 
        at org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:57) 
        at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:114) 
        ... 18 more 

hadoop yarn 解决方案:

  1. 提交作业方式

    $ export HADOOP_CLASSPATH="/home/cluster/apps/hbase/lib/hbase-protocol-0.98.1-cdh5.1.0.jar"
    $ ./hadoop-2.2.0/bin/hadoop --config /home/stack/conf_hadoop/ jar ./hbase/hbase-assembly/target/hbase-0.99.0-SNAPSHOT-job.jar  org.apache.hadoop.hbase.mapreduce.RowCounter usertable
  2. 增加HADOOP_CLASSPATH到linux环境变量中
    增加如下内容到bashrc 或者 bash_profile 或者 profile ,这样是linux环境变量中就行
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/home/cluster/apps/hbase/lib/hbase-protocol-0.98.1-cdh5.1.0.jar

spark 解决方案:

  1. 提交作业方式
    -conf 增加spark.driver.extraClassPath & spark.executor.extraClassPath

    spark-submit --class com.umeng.dp.yuliang.play.HBaseToES --master yarn-cluster --conf "spark.driver.extraClassPath=/home/cluster/apps/hbase/lib/hbase-protocol-0.98.1-cdh5.1.0.jar" --conf "spark.executor.extraClassPath=/home/cluster/apps/hbase/lib/hbase-protocol-0.98.1-cdh5.1.0.jar"   --jars /home/cluster/apps/hbase/lib/hbase-protocol-0.98.1-cdh5.1.0.jar ScalaMR-0.0.1-jar-with-dependencies.jar 
  2. 增加如下配置到$SPARK_HOME/conf/spark-defaults.conf文件

    spark.driver.extraClassPath /home/cluster/apps/hbase/lib/hbase-protocol-0.98.1-cdh5.1.0.jar
    spark.executor.extraClassPath /home/cluster/apps/hbase/lib/hbase-protocol-0.98.1-cdh5.1.0.jar
    

spark maillist:
http://apache-spark-user-list.1001560.n3.nabble.com/java-lang-IllegalAccessError-class-com-google-protobuf-HBaseZeroCopyByteString-cannot-access-its-supg-tc24303.html
尊重原创,未经允许不得转载:
http://blog.csdn.net/stark_summer/article/details/47750017

6月 25, 2025 9:26:40 下午 com.google.testing.platform.main.MainKt$main$2 uncaughtException 严重: Fatal error while executing main with args: --proto_config=C:\Users\bowen.xiao\.android\utp\runnerConfig12320517331293124685.pb --proto_server_config=C:\Users\bowen.xiao\.android\utp\serverConfig104787935992664716.pb java.lang.IllegalAccessError: class com.google.protobuf.GeneratedMessageV3 tried to access method 'boolean com.google.protobuf.CodedInputStream.shouldDiscardUnknownFields()' (com.google.protobuf.GeneratedMessageV3 is in unnamed module of loader java.net.URLClassLoader @2102a4d5; com.google.protobuf.CodedInputStream is in unnamed module of loader 'app') at com.google.protobuf.GeneratedMessageV3.parseUnknownField(GeneratedMessageV3.java:325) at com.android.server.adb.protos.AppProcessesProto$ProcessEntry.<init>(AppProcessesProto.java:119) at com.android.server.adb.protos.AppProcessesProto$ProcessEntry.<init>(AppProcessesProto.java:54) at com.android.server.adb.protos.AppProcessesProto$ProcessEntry$1.parsePartialFrom(AppProcessesProto.java:770) at com.android.server.adb.protos.AppProcessesProto$ProcessEntry$1.parsePartialFrom(AppProcessesProto.java:764) at com.google.protobuf.CodedInputStream$ArrayDecoder.readMessage(CodedInputStream.java:980) at com.android.server.adb.protos.AppProcessesProto$AppProcesses.<init>(AppProcessesProto.java:871) at com.android.server.adb.protos.AppProcessesProto$AppProcesses.<init>(AppProcessesProto.java:821) at com.android.server.adb.protos.AppProcessesProto$AppProcesses$1.parsePartialFrom(AppProcessesProto.java:1558) at com.android.server.adb.protos.AppProcessesProto$AppProcesses$1.parsePartialFrom(AppProcessesProto.java:1552) at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:111) at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:126) at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:20) at com.android.server.adb.protos.AppProcessesProto$AppProcesses.parseFrom(AppProcessesProto.java:1014) at com.android.ddmlib.internal.DeviceClientMonitorTask$TrackAppProcessor.processIncomingData(DeviceClientMonitorTask.java:498) at com.android.ddmlib.internal.DeviceClientMonitorTask.run(DeviceClientMonitorTask.java:245) at java.base/java.lang.Thread.run(Thread.java:842) 6月 25, 2025 9:26:40 下午 com.google.testing.platform.RunnerImpl stop 严重: Termination signal received. Stopping test execution. 6月 25, 2025 9:26:40 下午 com.google.testing.platform.runtime.android.driver.AndroidInstrumentationDriver cancel 警告: Cancellation triggered in Android Instrumentation Driver. 6月 25, 2025 9:26:40 下午 com.google.testing.platform.RunnerImpl stop 警告: Waiting for UTP runner to exit... 6月 25, 2025 9:26:40 下午 com.google.testing.platform.RunnerImpl stop 严重: Aborted execution. Interim results: test_status: ABORTED
06-26
### Java 中 `BootstrapMethodError` 和 `IllegalAccessError` 错误分析 #### 关于 `BootstrapMethodError` `BootstrapMethodError` 是一种在运行时发生的错误,通常发生在使用了新的字节码指令(如 invokedynamic),而 JVM 或类库未能正确解析这些新特性的情况。此错误可能由多种因素引起: - **JVM 版本不兼容**:如果应用程序使用了较新的 Java 字节码功能(例如 Lambda 表达式或方法句柄),但在较低版本的 JVM 上执行,则可能会遇到此类异常[^2]。 对于该问题的一个常见场景是在 Spark 应用程序中提交作业时报错——由于 Maven 构建工具配置不当导致项目依赖项中的 Scala 版本与集群环境所使用的 Scala 版本存在差异。这会使得某些特定操作无法正常工作,进而触发 `BootstrapMethodError` 异常。解决办法是调整 POM 文件内的依赖声明来匹配目标平台上的 Scala 发行版,并重新构建应用包后再部署至生产环境中。 ```xml <properties> <scala.version>2.12.10</scala.version> </properties> <dependencies> <!-- Ensure all scala dependencies match the specified version --> ... </dependencies> ``` #### 针对 `IllegalAccessError` 另一方面,`IllegalAccessError` 属于链接阶段产生的严重错误之一,表明尝试访问某个非法成员(字段、构造器或方法)。这类情况往往源于模块化系统的引入以及反射机制的应用不当所致;亦或是不同框架间相互作用引发冲突的结果。具体来说,在 Spring Boot 项目里启动过程中抛出 `java.lang.IllegalAccessError: javax/el/Util` 的情形下,可能是 Hibernate Validator 组件与其内部 EL 实现之间的协作出现了障碍。鉴于此,可以通过显式排除过高版本的验证器组件并替换为更稳定的替代品来进行修复[^4]。 ```xml <!-- Exclude problematic hibernate-validator from spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </exclusion> </exclusions> </dependency> <!-- Optionally add a compatible validator dependency --> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>${validation.api.version}</version> </dependency> ``` 上述措施有助于缓解因第三方库之间潜在的二进制接口变化所带来的影响,从而保障整个 Web 应用能够顺利初始化完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值