【问题标题】:NoSuchMethodError when trying to query data on HBase from Spark尝试从 Spark 查询 HBase 上的数据时出现 NoSuchMethodError
【发布时间】:2020-03-02 20:53:45
【问题描述】:

我正在尝试使用 SparkSQL/DataFrames 查询加载到 HBase 表中的数据。我的集群基于 Cloudera CDH 6.2.0(Spark 版本 2.4.0 和 HBase 版本 2.1.0)。

按照this 指南,我在我的 Spark 服务的 HBase 服务属性中选择了我的 HBase 服务。此操作将以下 jars 添加到我的 Spark 类路径中:

/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/bin/../lib/client-facing-thirdparty/audience-annotations-0.5.0.jar
/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/bin/../lib/client-facing-thirdparty/commons-logging-1.2.jar
/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/bin/../lib/client-facing-thirdparty/findbugs-annotations-1.3.9-1.jar
/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/bin/../lib/client-facing-thirdparty/htrace-core4-4.2.0-incubating.jar
/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/bin/../lib/shaded-clients/hbase-shaded-mapreduce-2.1.0-cdh6.2.0.jar
/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/hbase-spark.jar

然后我开始使用 spark-shell。在使用this Spark-HBase Connectorthis 示例之后,我设法从HBase 加载和检索数据并将它们放入DataFrame。当我尝试使用 SparkSQL 或 DataFrame API 查询此 DataFrame 时,出现以下异常:

java.lang.NoSuchMethodError: org.apache.hadoop.hbase.util.ByteStringer.wrap([B)Lcom/google/protobuf/ByteString;
  at org.apache.hadoop.hbase.spark.SparkSQLPushDownFilter.toByteArray(SparkSQLPushDownFilter.java:256)
  at org.apache.hadoop.hbase.spark.datasources.SerializedFilter$$anonfun$toSerializedTypedFilter$1.apply(HBaseTableScanRDD.scala:267)
  at org.apache.hadoop.hbase.spark.datasources.SerializedFilter$$anonfun$toSerializedTypedFilter$1.apply(HBaseTableScanRDD.scala:267)
  at scala.Option.map(Option.scala:146)
  at org.apache.hadoop.hbase.spark.datasources.SerializedFilter$.toSerializedTypedFilter(HBaseTableScanRDD.scala:267)
  at org.apache.hadoop.hbase.spark.datasources.HBaseTableScanRDD$$anonfun$1.apply(HBaseTableScanRDD.scala:88)
  at org.apache.hadoop.hbase.spark.datasources.HBaseTableScanRDD$$anonfun$1.apply(HBaseTableScanRDD.scala:80)
  at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
  at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241)
  at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
  at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35)
  at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241)
  at scala.collection.AbstractTraversable.flatMap(Traversable.scala:104)
  ...

我尝试在不通过上述连接器的情况下“按原样”启动 spark-shell,结果是一样的。我读到这个问题可能是由不同版本的协议缓冲区引起的,但我不知道如何解决。

【问题讨论】:

  • 如果确实是这个问题,那么解决方案就像使用一致的协议缓冲区一样简单。但是,我对 HBase 了解不多,所以我可能错了。如果我是你,我会研究协议缓冲区版本并寻找差异。

标签: apache-spark hadoop hbase cloudera


【解决方案1】:

我们在使用 CDH 6.3.3 时遇到了同样的问题,最终从源代码编译了 Hortonworks shc-core,到目前为止,它似乎在使用 CDH 6.3.3 时没有任何问题。

【讨论】:

  • 感谢您的反馈。我有一些问题:1)你编译哪个版本的 shc-core?主分支上的那个?您使用的命令是自述文件中的命令(mvn package -DskipTests)? 2)你在 pom.xml 中改变了什么?
猜你喜欢
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多