无法连接到Google Cloud Bigtable实例
我正在尝试使用HBase API连接到Google Cloud Bigtable实例。我正在使用Java 1.8。我跟着下面的教程:无法连接到Google Cloud Bigtable实例
https://cloud.google.com/bigtable/docs/samples-java-hello https://cloud.google.com/bigtable/docs/using-maven
但由于某些原因,我无法连接到该Bigtable的实例。我正在使用有效的ProjectID和InstanceID,但仍然无法连接。请看以下异常:
java.lang.IllegalStateException: Could not find an appropriate constructor for com.google.cloud.bigtable.hbase1_2.BigtableConnection
at com.google.cloud.bigtable.hbase.BigtableConfiguration.connect(BigtableConfiguration.java:88)
at com.google.cloud.bigtable.hbase.BigtableConfiguration.connect(BigtableConfiguration.java:72)
at com.kp.sensor.iot.IOTSensorPull.makeConnection(IOTSensorPull.java:149)
at com.kp.sensor.iot.IOTSensorPull.populateTemperature(IOTSensorPull.java:159)
at com.kp.sensor.iot.IOTSensorPull.readMessagesFromRFIDSub(IOTSensorPull.java:126)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.google.cloud.bigtable.hbase.BigtableConfiguration.connect(BigtableConfiguration.java:85)
... 18 more
Caused by: java.lang.NoSuchMethodError: com.google.cloud.bigtable.config.BigtableOptions$Builder.setInstanceId(Ljava/lang/String;)Lcom/google/cloud/bigtable/config/BigtableOptions$Builder;
at com.google.cloud.bigtable.hbase.BigtableOptionsFactory.fromConfiguration(BigtableOptionsFactory.java:244)
at org.apache.hadoop.hbase.client.AbstractBigtableConnection.<init>(AbstractBigtableConnection.java:129)
at org.apache.hadoop.hbase.client.AbstractBigtableConnection.<init>(AbstractBigtableConnection.java:104)
at com.google.cloud.bigtable.hbase1_2.BigtableConnection.<init>(BigtableConnection.java:50)
下面是我Maven依赖:
<dependency>
<groupId>com.google.cloud.bigtable</groupId>
<artifactId>bigtable-hbase-1.2</artifactId>
<version>0.9.4</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-boringssl-static</artifactId>
<version>1.1.33.Fork19</version>
</dependency>
还有其他的依赖关系,以及因为这是一个春天,启动应用程序。
另外,在这种情况下,ProjectID和InstanceID具有相同的值。
有人可以让我知道这里可能是什么问题吗?
对于它的价值,我的org.apache.hbase版本是1.2.4 另外我怀疑由于你的项目ID等于实例ID,所以你指的是ProjectID别名,而不是实际的底层名称,因为我认为这是自动分配的?我在别处使用项目别名的问题,谷歌似乎期望底层的ID。但看看例外情况似乎问题不在于...
其实我认为我发现背后的另一个原因,这可能更相关:我注意到,当bigtable-hbase-1.2-0.9.4.jar没有精确地位于'/com/google/cloud/bigtable/bigtable-hbase-1.2/0.9.4/bigtable-hbase-1.2-0.9.4.jar'的原始路径中,因为代码似乎会出现此问题检查版本号1.2(基于父文件夹?)
在我的情况下,这似乎是特别与API的Bigtable-Dataflow部分,而不是一般的Bigtable API(即bigtable-hbase -pata.xml在POM.xml中)。 Bigtable API的通用部分似乎并不关心JAR的位置。
我在Google的VM上进行测试时遇到了这个问题,为了简单起见,我将所有JAR转储到一个目录中。它对于通用的Bigtable功能非常有效,但对于Bigtable-Dataflow功能不起作用,尽管它在我的本地机器上工作,其中Eclipse在启动代码之前正确构建了所有依赖路径。只要我把这个.JAR放在正确的道路上,问题就没有了。
CC:@所罗门duskis
数据流生态系统中存在一个错误。只能指定bigtable-hbase-dataflow和bigtable-hbase- *中的一个。换句话说,如果你想要数据流,从你的路径中删除bigtable-hbase- * jar。 –
我已经看到,当有多个版本冲突bigtable- *文物在类路径这种事情发生。这可能是你的情况下的问题? –