Protobuf错误:Hbase createTable并放入Java代码(protobuf-LiteralByteString)

Chr*_*Joo 5 hadoop hbase protocol-buffers

我正在用kafka,spark stream和hbase开发Java应用程序。通过maven全新安装编译代码后,在运行应用程序时遇到以下错误:

  • hadoop ver:2.7.3
  • HBase版本:hbase-0.98.24-hadoop2
  • 火花:2.1.0

尽管我已经在此站点上检查并应用了先前的答案,但我仍然遇到了问题。

谢谢 ...

`Exception in thread "main" org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.NoClassDefFoundError: com/google/protobuf/LiteralByteString
at org.apache.hadoop.hbase.client.RpcRetryingCaller.translateException(RpcRetryingCaller.java:225)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:133)
at org.apache.hadoop.hbase.client.RpcRetryingCaller.callWithRetries(RpcRetryingCaller.java:101)
at org.apache.hadoop.hbase.client.ClientScanner.nextScanner(ClientScanner.java:289)
at org.apache.hadoop.hbase.client.ClientScanner.initializeScannerInConstruction(ClientScanner.java:190)
at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:185)
at org.apache.hadoop.hbase.client.ClientScanner.<init>(ClientScanner.java:111)
at org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:789)
at org.apache.hadoop.hbase.catalog.MetaReader.fullScan(MetaReader.java:542)
at org.apache.hadoop.hbase.catalog.MetaReader.tableExists(MetaReader.java:310)
at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:317)
at org.apache.hadoop.hbase.client.HBaseAdmin.tableExists(HBaseAdmin.java:331)
Run Code Online (Sandbox Code Playgroud)

`

Caused by: java.lang.NoClassDefFoundError: com/google/protobuf/LiteralByteString
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
Run Code Online (Sandbox Code Playgroud)

Chr*_*oth 5

Apache Hadoop 2.7.3 依赖于 Protobuf 2.5.0。查看 Protobuf 2.5.0 的源代码,该类com.google.protobuf.LiteralByteString在此处可见:

https://github.com/google/protobuf/blob/v2.5.0/java/src/main/java/com/google/protobuf/LiteralByteString.java

但是,该类在 Protobuf 的更高版本中不存在。例如,以下是最近的 3.1.0 版本中的 com/google/protobuf 目录:

https://github.com/google/protobuf/tree/v3.1.0/java/core/src/main/java/com/google/protobuf

基于此,您的应用程序很可能选择了 2.5.0 以外的 Protobuf 版本并将其放在类路径中。我建议在您的应用程序上运行,mvn dependency:tree看看它是否获取了不兼容的 Protobuf 依赖项(可能是传递性的)。如果应用程序的 Maven 依赖项看起来正常,那么当您启动应用程序并选择错误版本的 Protobuf 时,可能有东西在运行时覆盖了类路径。