總結/朱季謙
一、出現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.
我們可以通過maven的maven-help插件來檢查com.google.guava包衝突問題,maven-help插件的引入與使用,我在另一篇博客裏有介紹過——Maven Helper插件——實現一鍵Maven依賴衝突問題
在maven裏切換至【Dependency Analyzer】欄,在搜索框輸入衝突包guava,即會出現,guava都被哪些包依賴了,當多個組件包都依賴了同一個包但又不同版本時,很容易久出現各種衝突。紅色部分就是表示有衝突的依賴包版本——
選中對應想去除的包,右擊點擊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'
執行成功後,如下圖所示:
這時,再重新運行下代碼,這時就沒有報錯了,然後通過hbase shell的list查看指令,發現已經正常創建帶有命名空間的表了SYSTEM:SYSTEM_LOG 。