【问题标题】:create a big Table using HBASE client API使用 HBASE 客户端 API 创建一个大表
【发布时间】:2018-07-25 10:43:25
【问题描述】:

我正在使用 scala 中的客户端 API 处理谷歌云大表, 我正在尝试创建一个包含单个列族的表,但出现错误

下面是我写的代码:

`object TestBigtable {


  val columnFamilyName = Bytes.toBytes("cf1")

  def createConnection(ProjectId: String, InstanceID: String): Connection = {
    BigtableConfiguration.connect(ProjectId, InstanceID)
  }

  def createTableIfNotExists(connection: Connection, name: String) = {
    val tableName = TableName.valueOf(name)
    val admin = connection.getAdmin()
      if (!admin.tableExists(tableName)) {
        val tableDescriptor = new HTableDescriptor(tableName)
        tableDescriptor.addFamily(
          new HColumnDescriptor(columnFamilyName))
        admin.createTable(tableDescriptor)
      }
    }




  def runner(projectId: String,
             instanceId: String,
             tableName: String) = {
    val createTableConnection = createConnection(projectId, instanceId)
    try {
      createTableIfNotExists(createTableConnection, tableName)
    } finally {
      createTableConnection.close()
    }


  }`

一旦我执行了我的 jar,我就会收到以下一组错误:

    18/07/25 10:36:20 INFO com.google.cloud.bigtable.grpc.BigtableSession: Bigtable options: BigtableOptions{dataHost=bigtable.googleapis.com, adminHost=bigtableadmin.googleapis.com, port=443, projectId=renault-ftt, instanceId=testfordeletion, appProfileId=, userAgent=hbase-1.4.3, credentialType=DefaultCredentials, dataChannelCount=4, retryOptions=RetryOptions{retriesEnabled=true, allowRetriesWithoutTimestamp=false, statusToRetryOn=[UNAUTHENTICATED, ABORTED, DEADLINE_EXCEEDED, UNAVAILABLE], initialBackoffMillis=5, maxElapsedBackoffMillis=60000, backoffMultiplier=2.0, streamingBufferSize=60, readPartialRowTimeoutMillis=60000, maxScanTimeoutRetries=3}, bulkOptions=BulkOptions{asyncMutatorCount=2, useBulkApi=true, bulkMaxKeyCount=125, bulkMaxRequestSize=1048576, autoflushMs=0, maxInflightRpcs=40, maxMemory=97307852, enableBulkMutationThrottling=false, bulkMutationRpcTargetMs=100}, callOptionsConfig=CallOptionsConfig{useTimeout=false, shortRpcTimeoutMs=60000, longRpcTimeoutMs=600000}, usePlaintextNegotiation=false, useCachedDataPool=false}.
18/07/25 10:36:20 INFO com.google.cloud.bigtable.grpc.io.OAuthCredentialsCache: Refreshing the OAuth token
Exception in thread "grpc-default-executor-0" java.lang.IllegalAccessError: tried to access field com.google.protobuf.AbstractMessage.memoizedSize from class com.google.bigtable.admin.v2.ListTablesRequest
    at com.google.bigtable.admin.v2.ListTablesRequest.getSerializedSize(ListTablesRequest.java:236)
    at io.grpc.protobuf.lite.ProtoInputStream.available(ProtoInputStream.java:108)
    at io.grpc.internal.MessageFramer.getKnownLength(MessageFramer.java:204)
    at io.grpc.internal.MessageFramer.writePayload(MessageFramer.java:136)
    at io.grpc.internal.AbstractStream.writeMessage(AbstractStream.java:52)
    at io.grpc.internal.DelayedStream$5.run(DelayedStream.java:218)
    at io.grpc.internal.DelayedStream.drainPendingCalls(DelayedStream.java:132)
    at io.grpc.internal.DelayedStream.setStream(DelayedStream.java:101)
    at io.grpc.internal.DelayedClientTransport$PendingStream.createRealStream(DelayedClientTransport.java:361)
    at io.grpc.internal.DelayedClientTransport$PendingStream.access$300(DelayedClientTransport.java:344)
    at io.grpc.internal.DelayedClientTransport$5.run(DelayedClientTransport.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 嗨,你能列出你的依赖关系吗?我猜你有一些不匹配的库版本。如果可能,请同时提供:构建文件中列出的依赖项和解析的依赖关系图。
  • 您似乎在使用 protobuf light:io.grpc.protobuf.lite 在堆栈中。 Cloud Bigtable 客户端从未使用 protobuf lite 进行过测试。正如 Igor 所说,依赖图会有所帮助。作为快速修复,您还可以尝试使用 bigtable-hbase-1.x-shaded 工件而不是 bigtable-hbase-1.x 工件。

标签: scala hbase bigtable


【解决方案1】:

转发所罗门的评论作为答案:

io.grpc.protobuf.lite 在堆栈中。 Cloud Bigtable 客户端是 从未用 protobuf lite 测试过。依赖图会有所帮助。作为一个 快速修复,你也可以试试 bigtable-hbase-1.x-shaded 神器 而不是 bigtable-hbase-1.x 工件。

您对io.grpc.protobuf.lite 的使用可能会导致问题。据我了解,io.grpc.protobuf.lite 主要用于 Android 客户端。

使用阴影工件应该以更大的 JAR 大小和潜在的内存占用为代价来防止依赖冲突。您可能还想查看这些类似的问题报告以及它们是如何解决的:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多