0

我正在使用Scio/Bigtable/HBase与下面的这个示例项目验证错误。依赖关系树需要protobuf版本(2.5,2.6.1,3.0,3.1),并且似乎默认为3.2。我使用了sbt-assembly的阴影部分,不确定我是否正确。SBT验证由多个protobuf 2/3依赖关系造成的错误(尽管有阴影)

build.sbt

name := "scalalab" 

version := "1.0" 

scalaVersion := "2.11.8" 

libraryDependencies ++= Seq(
    "com.spotify" %% "scio-core" % "0.3.2", 
    "com.google.cloud.bigtable" % "bigtable-hbase-1.2" % "0.9.2", 
    "org.apache.hbase" % "hbase-client" % "1.2.5", 
    "org.apache.hbase" % "hbase-common" % "1.2.5", 
    "org.apache.hadoop" % "hadoop-common" % "2.7.3" 
) 

assemblyShadeRules in assembly := Seq(
    ShadeRule.rename("com.google.**" -> "[email protected]").inAll 
) 

assemblyMergeStrategy in assembly := { 
    case x => MergeStrategy.first 
} 

Main.scala

import com.google.cloud.bigtable.hbase.adapters.Adapters 
import com.google.cloud.bigtable.hbase.adapters.read.DefaultReadHooks 
import org.apache.hadoop.hbase.client.Scan 

object Main { 
    def main(args: Array[String]): Unit = { 
    val scan = new Scan 
    scan.setMaxVersions() 
    scan.addFamily("family".getBytes) 
    scan.setRowPrefixFilter("prefix".getBytes) 

    val builder = Adapters.SCAN_ADAPTER.adapt(scan, new DefaultReadHooks) 

    System.out.println(builder) 
    } 
} 

输出到:

scalalab git:(master) ? java -cp .:target/scala-2.11/scalalab-assembly-1.0.jar Main 
Exception in thread "main" java.lang.VerifyError: Bad return type 
Exception Details: 
    Location: 
    shadeio/cloud/bigtable/hbase/adapters/AppendAdapter.adapt(Lorg/apache/hadoop/hbase/client/Operation;)Lshadeio/bigtable/repackaged/com/google/protobuf/GeneratedMessageV3$Builder; @8: areturn 
    Reason: 
    Type 'shadeio/bigtable/v2/ReadModifyWriteRowRequest$Builder' (current frame, stack[0]) is not assignable to 'shadeio/bigtable/repackaged/com/google/protobuf/GeneratedMessageV3$Builder' (from method signature) 
    Current Frame: 
    bci: @8 
    flags: { } 
    locals: { 'shadeio/cloud/bigtable/hbase/adapters/AppendAdapter', 'org/apache/hadoop/hbase/client/Operation' } 
    stack: { 'shadeio/bigtable/v2/ReadModifyWriteRowRequest$Builder' } 
    Bytecode: 
    0x0000000: 2a2b c000 28b6 00a0 b0 

     at shadeio.cloud.bigtable.hbase.adapters.Adapters.<clinit>(Adapters.java:40) 
     at Main$.main(Main.scala:12) 
     at Main.main(Main.scala) 

我在做什么错?

感谢您的帮助

回答

0

新闻发布工作有了BigTable神器,它可以包括通过:

libraryDependencies ++= Seq(
    "com.spotify" %% "scio-core" % "0.3.2", 
    "com.spotify" %% "scio-bigtable" % "0.3.2" 
) 

通常情况下,没有必要对其他依赖使用Bigtable的,事实上,他们可能会引起的问题。

确保然后通过导入BigTable中包:

import com.spotify.scio.bigtable._ 

检查这个BigtableExample

请注意,您可能想尝试使用sbt-pack而不是sbt-assembly以充分利用工件缓存。有关sbt设置的示例,请检查模板here

+0

感谢您的回复。我的帖子不是很清楚,但在上面的代码中,我使用了scio之外的Bigtable客户端。通过Scio使用bigtable客户端可以处理您的依赖关系。 – ogen

1

依赖性问题对于Cloud Bigtable HBase客户端而言是一个痛苦。我们将在下一个版本中修复它。要解决你目前的问题,导入“bigtable-hbase”而不是“bigtable-hbase-1.2”

另外,我建议使用最新版本的客户端是可能的,这是0.9.7.1。

+0

感谢您的回复。随着您的依赖替换,适配器不再是可导入的... – ogen

+0

呃...适配器被移动到不同的包中,并且protobuf对象也是如此。对于那个很抱歉。你可以使用'bigtable-hbase'来代替。 –

+0

感谢您的回复,获取另一个错误'java.lang.NoSuchMethodError:shadeio.bigtable.v2.RowRange $ Builder.setStartKeyClosed(Lshadeio/bigtable/repackaged/com/google/protobuf/ByteString;)Lshadeio/bigtable/v2/RowRange $ Builder'。这可能与2版本protobuf中的conflit有关。 – ogen