1

我正在嘗試使用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具有相同的值。

有人可以讓我知道這裏可能是什麼問題嗎?

+1

我已經看到,當有多個版本衝突bigtable- *文物在類路徑這種事情發生。這可能是你的情況下的問題? –

回答

1

對於它的價值,我的org.apache.hbase版本是1.2.4 另外我懷疑由於你的項目ID等於實例ID,所以你指的是ProjectID別名,而不是實際的底層名稱,因爲我認爲這是自動分配的?我在別處使用項目別名的問題,谷歌似乎期望底層的ID。但看看例外情況似乎問題不在於...

1

其實我認爲我發現背後的另一個原因,這可能更相關:我注意到,當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放在正確的道路上,問題就沒有了。

我想複雜功能是來自某處?
https://github.com/GoogleCloudPlatform/cloud-bigtable-client/blob/master/bigtable-hbase-parent/bigtable-hbase/src/main/java/com/google/cloud/bigtable/hbase/BigtableConfiguration.java#L43

CC:@所羅門duskis

+0

數據流生態系統中存在一個錯誤。只能指定bigtable-hbase-dataflow和bigtable-hbase- *中的一個。換句話說,如果你想要數據流,從你的路徑中刪除bigtable-hbase- * jar。 –