分享

求助!!IllegalAccessError: class com.google.protobuf.HBaseZeroCopyByteString...

高帝斯法则 发表于 2014-10-10 09:27:13 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 16 45064
在网上看到有以下两种方式来运行打包的程序:
注意需要将依赖的HBase jar包添加到Spark的CLASSPATH下,打开conf/spark-env.sh,添加如下内容
  1. SPARK_CLASSPATH=/home/hadoop/software/hbase-0.92.2/hbase-0.92.2.jar:/home/hadoop/software/hbase-0.92.2/lib  
复制代码




或者也可以在执行命令的时候加一个jars参数,如下

  1. bin/spark-submit --jars $(echo /home/hadoop/software/hbase-0.96.0/lib/*.jar | tr ' ' ',') --class org.platform.modules.hbase.SparkHBase --master spark://centos.host1:7077 /home/hadoop/temp/spark.jar  
复制代码




我采用第二种方式,结果报错,具体错误信息如下:
xception in thread "main" java.lang.IllegalAccessError: class com.google.protobuf.ZeroCopyLiteralByteString cannot access its superclass com.google.protobuf.LiteralByteString
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at org.apache.hadoop.hbase.protobuf.ProtobufUtil.toScan(ProtobufUtil.java:818)
        at com.qtong.SparkHBase.main(SparkHBase.java:36)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:303)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:55)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我已经添加了--jars的相关参数了,可是仍然报这个错误,求大神帮忙解答。





已有(14)人评论

跳转到指定楼层
NEOGX 发表于 2014-10-10 11:02:03
这是hbase的一个bug

  1. $ HADOOP_CLASSPATH=/path/to/hbase-protocol.jar:/path/to/hbase/conf hadoop jar MyJob.jar MyJobMainClass
  2. $ HADOOP_CLASSPATH=$(hbase mapredcp):/path/to/hbase/conf hadoop jar MyJob.jar MyJobMainClass
  3. $ HADOOP_CLASSPATH=$(hbase classpath) hadoop jar MyJob.jar MyJobMainClass
复制代码

如果所用的jar,不包含依赖,用下面命令方式

  1. $ HADOOP_CLASSPATH=$(hbase mapredcp):/etc/hbase/conf hadoop jar MyApp.jar MyJobMainClass -libjars $(hbase mapredcp | tr ':' ',') ...
复制代码



回复

使用道具 举报

高帝斯法则 发表于 2014-10-10 11:31:28
NEOGX 发表于 2014-10-10 11:02
这是hbase的一个bug

没看明白命令的意思,可以简单的说明一下吗
回复

使用道具 举报

muyannian 发表于 2014-10-10 11:44:29


这是官网和hortonworks都提出解决方案

issues.apache.org


Known Issues for HBase

回复

使用道具 举报

howtodown 发表于 2014-10-10 12:20:25
把这个包放到hbase lib中,并且在classpath中配置
hbase-protocol.jar
回复

使用道具 举报

howtodown 发表于 2014-10-10 12:21:29
可能跟你的版本也有关系,第二种是因为没有把hbase 的包没有加载进来,如果第一种可以,就用第一种。
回复

使用道具 举报

高帝斯法则 发表于 2014-10-10 13:44:17
howtodown 发表于 2014-10-10 12:21
可能跟你的版本也有关系,第二种是因为没有把hbase 的包没有加载进来,如果第一种可以,就用第一种。

--jars参数后面的内容不是将hbase lib下的包加载进去吗?
回复

使用道具 举报

howtodown 发表于 2014-10-10 13:51:17
高帝斯法则 发表于 2014-10-10 13:44
--jars参数后面的内容不是将hbase lib下的包加载进去吗?
你看看是否有这个包hbase-protocol.jar,有的话,你参考下官网解决方案
issues.apache.org


Known Issues for HBase
回复

使用道具 举报

高帝斯法则 发表于 2014-10-10 14:08:22
howtodown 发表于 2014-10-10 13:51
你看看是否有这个包hbase-protocol.jar,有的话,你参考下官网解决方案
issues.apache.org

在hbase lib下有hbase-protocol-0.96.0-hadoop2.jar
回复

使用道具 举报

高帝斯法则 发表于 2014-10-11 16:18:33
howtodown 发表于 2014-10-10 12:21
可能跟你的版本也有关系,第二种是因为没有把hbase 的包没有加载进来,如果第一种可以,就用第一种。

我使用的版本是hbase-0.96.1.1,看了issues.apache.org里面的解决方案,我觉得第一种相对来说比较好一些(第一种解决方案原文:Undo the ZCLSB hack. We'd lose a lot of nice perf improvement but I'd say this is preferable to crazy CLASSPATH hacks.),我理解的就是找到一种替代的解决方案,不使用ZCLSB方式就行。于是乎我想采用 上的示例另一种将scan编码的方式,如下:
  •         ByteArrayOutputStream out = new ByteArrayOutputStream();  
  •         DataOutputStream dos = new DataOutputStream(out);  
  •         scan.write(dos);  
  •         String scanStr = Base64.encodeBytes(out.toByteArray());  
  •         IOUtils.closeQuietly(dos);  
  •         IOUtils.closeQuietly(out);

可是编译报错,第三行我查了下HBase API,Scan 类及其继承的supperclass都没有write方法。请问还有没有其他的办法来对scan进行编码?麻烦您能给我一个示例吗?






















回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条