Apache spark 类com.google.protobuf.HBaseZeroCopyByteString无法访问其超类com.google.protobuf.LiteralByteString

Apache spark 类com.google.protobuf.HBaseZeroCopyByteString无法访问其超类com.google.protobuf.LiteralByteString,apache-spark,hbase,Apache Spark,Hbase,运行spark应用程序时,我遇到以下错误: 16/01/08 15:25:48 INFO SchemaMetadata: Entering synchronized block to initiate 16/01/08 15:25:48 INFO SchemaMetadata: Initializing SchemaMetadata 16/01/08 15:25:48 INFO SchemaMetadata: Schema initialized from database 16/01/08 1

运行spark应用程序时,我遇到以下错误:

16/01/08 15:25:48 INFO SchemaMetadata: Entering synchronized block to initiate
16/01/08 15:25:48 INFO SchemaMetadata: Initializing SchemaMetadata
16/01/08 15:25:48 INFO SchemaMetadata: Schema initialized from database
16/01/08 15:25:48 INFO SchemaMetadata: Registering for notifications
16/01/08 15:25:49 WARN HConnectionManager$HConnectionImplementation: Encountered problems when prefetch hbase:meta table:
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.HTable.getRowOrBefore(HTable.java:714)
at org.apache.hadoop.hbase.client.MetaScanner.metaScan(MetaScanner.java:144)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.prefetchRegionCache(HConnectionManager.java:1159)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:1223)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1111)
at org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:1068)
at org.apache.hadoop.hbase.client.AsyncProcess.findDestLocation(AsyncProcess.java:361)
at org.apache.hadoop.hbase.client.AsyncProcess.submit(AsyncProcess.java:306)
at org.apache.hadoop.hbase.client.HTable.backgroundFlushCommits(HTable.java:964)
at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:1252)
at org.apache.hadoop.hbase.client.HTable.put(HTable.java:924)

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.buildGetRowOrBeforeRequest(RequestConverter.java:133)
at org.apache.hadoop.hbase.protobuf.ProtobufUtil.getRowOrBefore(ProtobufUtil.java:1497)
at org.apache.hadoop.hbase.client.HTable$2.call(HTable.java:710)
at org.apache.hadoop.hbase.client.HTable$2.call(HTable.java:708)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:114)
... 31 more
这里我发现的问题是,类加载器在JVM的前面从Spark assembly jar加载LiteralByteString类,然后从用户jar加载HBaseZeroCopyByteString类。这就是它造成问题的原因

Spark提供了一个属性来在JVM中首先加载用户jar,即
Spark.executor.userClassPathFirst
,但不幸的是,在这方面也没有获得成功


如果有人遇到并解决了此问题,请建议解决方案。

看起来,在运行spark作业时,他们在类路径中没有找到hbase协议jar

请尝试以下选项以解决给定问题

  • 导出HADOOP_CLASSPATH=/usr/hdp/2.5.4.0-121/hbase/lib/hbase-protocol-1.1.2.2.5.4.0-121.jar
  • 在spark submit中添加以下属性

    • --驱动程序类路径/usr/hdp/2.5.4.0-121/hbase/lib/hbase-protocol-1.1.2.2.5.4.0-121.jar\
    • --驱动程序java选项“-Dspark.driver.extraClassPath=/usr/hdp/2.5.4.0-121/hbase/lib/hbase-protocol-1.1.2.2.5.4.0-121.jar”\

    • --conf“spark.executor.extraClassPath=/usr/hdp/2.5.4.0-121/hbase/lib/hbase-protocol-1.1.2.2.5.4.0-121.jar”\


  • 希望你的问题能得到解决。如果有任何疑问,请回复我。

    在运行spark作业时,他们在类路径中没有找到hbase协议jar

    请尝试以下选项以解决给定问题

  • 导出HADOOP_CLASSPATH=/usr/hdp/2.5.4.0-121/hbase/lib/hbase-protocol-1.1.2.2.5.4.0-121.jar
  • 在spark submit中添加以下属性

    • --驱动程序类路径/usr/hdp/2.5.4.0-121/hbase/lib/hbase-protocol-1.1.2.2.5.4.0-121.jar\
    • --驱动程序java选项“-Dspark.driver.extraClassPath=/usr/hdp/2.5.4.0-121/hbase/lib/hbase-protocol-1.1.2.2.5.4.0-121.jar”\

    • --conf“spark.executor.extraClassPath=/usr/hdp/2.5.4.0-121/hbase/lib/hbase-protocol-1.1.2.2.5.4.0-121.jar”\


  • 希望你的问题能得到解决。如果有任何疑问,请回复我。

    Hi,你找到这个问题的解决方案了吗?是的,我使用maven着色和重新定位处理protobuf依赖项,效果很好。Hi,你找到这个问题的解决方案了吗?是的,我使用maven着色和重新定位处理protobuf依赖项,效果很好。