HBase實操 | 如何使用Java連線Kerberos的HBase
一.文件編寫目的
出於CDH叢集安全考慮,在CDH叢集中增加了Kerberos認證機制。因為HBase的儲存系統是基於Hadoop的儲存,所以通過HBase客戶端訪問HBase資料庫時需要進行身份認證。在Linux下使用HBase客戶端訪問HBase資料時需要先kinit初始化Kerberos賬號,認證完成後我們就可以直接使用HBase shell操作HBase了。通過Linux的Kinit命令可以方便的完成Kerberos的認證,那麼在Java開發中如何完成Kerberos的登入認證呢?本篇文章主要講述如何使用Java連線Kerberos環境的HBase。
內容概述
1.環境準備
2.建立Java Maven工程
3.編寫HBase測試程式碼
4.測試
5.總結
測試環境
1.RedHat7.2
2.CM和CDH版本為5.11.2
前置條件
1.Intellij已安裝且正常執行
2.Maven環境正常
二.環境準備
1.從CDH叢集下載HBase客戶端配置

2.krb5.conf配置(直接使用CDH叢集的Kerberos配置)
#Configuration snippets may be placed in this directory as well includedir /etc/krb5.conf.d/ [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server=FILE:/var/log/kadmind.log [libdefaults] dns_lookup_realm = false ticket_lifetime= 24h renew_lifetime= 7d forwardable= true rdns = false default_realm=CLOUDERA.COM #default_ccache_name =KEYRING:persistent:%{uid} [realms] CLOUDERA.COM = { kdc =ip-172-31-22-86.ap-southeast-1.compute.internal admin_server=ip-172-31-22-86.ap-southeast-1.compute.internal } [domain_realm] ip-172-31-22-86.ap-southeast-1.compute.internal=CLOUDERA.COM ip-172-31-22-86.ap-southeast-1.compute.internal=CLOUDERA.COM /**
3.獲取Kerberos的keytab檔案
使用kadmin為Kerberos賬號生成keytab,fayson.keytab檔案生成在當前目錄下。
[ec2-user@ip-172-31-22-86 ~]$ sudo kadmin.local Authenticating as principal hdfs/[email protected] with password. kadmin.local:xst -norandkey -k fayson.keytab [email protected] ... kadmin.local:exit /**
4.在當前開發環境下配置叢集的主機資訊到hosts檔案
在命令列使用kinit初始化hbase的Kerberos賬號
[root@ip-172-31-26-80 process]# cd 1699-hbase-REGIONSERVER [root@ip-172-31-26-80 1699-hbase-REGIONSERVER]# pwd /var/run/cloudera-scm-agent/process/1699-hbase-REGIONSERVER [root@ip-172-31-26-80 1699-hbase-REGIONSERVER]# kinit -kt hbase.keytab hbase/[email protected] [root@ip-172-31-26-80 1699-hbase-REGIONSERVER]# klist Ticket cache:FILE:/tmp/krb5cc_0 Default principal:hbase/[email protected] Valid startingExpiresService principal 10/25/2017 11:13:2110/26/2017 11:13:21krbtgt/[email protected] renew until 10/30/2017 11:13:21 /**
使用hbase shell登入客戶端對fayson使用者賦權
[root@ip-172-31-26-80 1699-hbase-REGIONSERVER]# hbase shell 17/10/25 11:16:01 INFO Configuration.deprecation: hadoop.native.lib isdeprecated. Instead, use io.native.lib.available HBase Shell; enter'help<RETURN>'for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 1.2.0-cdh5.11.2, rUnknown, Fri Aug 18 14:09:37 PDT 2017 hbase(main):001:0>grant 'fayson', 'RWC' 0 row(s) in 0.4110 seconds /**
三.建立Java工程
1.使用Intellij建立Java Maven工程

2.在工程下建立kerberos-conf目錄,將下載的客戶端配置檔案拷貝至此目錄

點選右鍵將Kerberos-conf目錄標記為Sources Root

注意目錄顏色變化

3.在pom.xml配置檔案中增加HBase的Maven依賴
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.6.5</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.5</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.2.0</version> </dependency> /**
四、編寫HBase測試程式碼
1.HBaseSample.java類呼叫API介面訪問HBase示例程式碼
package com.cloudera; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.security.UserGroupInformation; import java.io.IOException; /** * Java訪問Kerberos環境的HBase資料庫 * @Date 2107-10-25 22:22:58 */ publicclass App { public static void main( String[] args ) { System.setProperty("java.security.krb5.conf", "c:\\keytab\krb5.conf"); Configuration configuration = HBaseConfiguration.create(); System.out.println(configuration.get("hbase.rootdir")); configuration.set("hadoop.security.authentication", "Kerberos" ); UserGroupInformation. setConfiguration(configuration); try { UserGroupInformation.loginUserFromKeytab("[email protected]", "c:\\keytab\fayson.keytab"); Connection connection = ConnectionFactory.createConnection(configuration); Table table = connection.getTable(TableName.valueOf("picHbase")); System.out.println(table.getName()); Scan scan = new Scan(); ResultScanner rs = table.getScanner(scan); for (Result r : rs) { System. out.println(r.toString()); } } catch (IOException e) { e.printStackTrace(); } /**
五、測試
1.執行程式碼測試

2.測試結果

六、總結
在開發環境下通過Java程式碼直接連線到Kerberos環境下的HBase時,則需要將krb5.conf配置載入到程式執行環境中。
在使用Kerberos賬號進登入行認證時,如果使用的是普通賬號(fayson),則需要為fayson賬號授權,否則fayson使用者無許可權訪問HBase庫的表。
參考文件:
ofollow,noindex" target="_blank">http://hbase.apache.org/book.html#hbase.secure.configuration
文章來源:HBase技術社群公眾號(微信號:hbasegroup),非常歡迎大家積極投稿。