Scala連接Hbase集羣出現異常彙總

總結/朱季謙

一、出現java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator

在新項目上創建以下Scala代碼去連接Hbase集羣,用來判斷Hbase是否存在某張表。

//離線Hbase
val conf: Configuration = HBaseConfiguration.create()
conf.set("hbase.zookeeper.quorum","192.168.1.200")
conf.set("hbase.zookeeper.property.clientPort","2181")
// 創建HBase連接
val connection = ConnectionFactory.createConnection(conf)
val hbaseAdmin = connection.getAdmin
val tables = Set("SYSTEM_LOG")
val synTable = TableName.valueOf(tableName)
val tableExist = hbaseAdmin.tableExists(synTable)

在測試運行時,出現了以下異常:

Exception in thread "main" org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.IllegalAccessError: tried to access method com.google.common.base.Stopwatch.()V from class org.apache.hadoop.hbase.zookeeper.MetaTableLocator

檢查發現是因爲maven裏引入的hbase-client、spark-core等衆多依賴包裏都含有com.google.guava包,這就會出現各個guava包衝突問題,進而導致出現 tried to access method com.google.common.base.Stopwatch.異常問題。

我們可以通過maven的maven-help插件來檢查com.google.guava包衝突問題,maven-help插件的引入與使用,我在另一篇博客裏有介紹過——Maven Helper插件——實現一鍵Maven依賴衝突問題

在maven裏切換至【Dependency Analyzer】欄,在搜索框輸入衝突包guava,即會出現,guava都被哪些包依賴了,當多個組件包都依賴了同一個包但又不同版本時,很容易久出現各種衝突。紅色部分就是表示有衝突的依賴包版本——

image

選中對應想去除的包,右擊點擊Exclude即可一鍵exclusion。

最後,單獨引入一個com.google.guava包,我的hbase是1.x版本的,引入guava-15版本的可以解決。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>15.0</version>
</dependency>

二、出現org.apache.hadoop.hbase.NamespaceNotFoundException: SYSTEM

在創建帶有命名空間的表時,例如創建表名爲SYSTEM:SYSTEM_LOG時出現以下異常——
Caused by: org.apache.hadoop.hbase.ipc.RemoteWithExtrasException(org.apache.hadoop.hbase.NamespaceNotFoundException): org.apache.hadoop.hbase.NamespaceNotFoundException: SYSTEM
at org.apache.hadoop.hbase.master.HMaster.ensureNamespaceExists(HMaster.java:2090)
at org.apache.hadoop.hbase.master.HMaster.createTable(HMaster.java:1270)
at org.apache.hadoop.hbase.master.MasterRpcServices.createTable(MasterRpcServices.java:399)
at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java:42436)
at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2033)
at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:107)
at org.apache.hadoop.hbase.ipc.RpcExecutor.consumerLoop(RpcExecutor.java:130)
at org.apache.hadoop.hbase.ipc.RpcExecutor$1.run(RpcExecutor.java:107)
at java.lang.Thread.run(Thread.java:748)

此時Hbase裏並沒有事先創建該SYSTEM命名空間,因此需要先創建一個,直接登陸Hbase服務器,通過hbase shell執行以下指令:

create_namespace   'SYSTEM'

執行成功後,如下圖所示:
image

這時,再重新運行下代碼,這時就沒有報錯了,然後通過hbase shell的list查看指令,發現已經正常創建帶有命名空間的表了SYSTEM:SYSTEM_LOG 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章