Phoenix連接安全模式下的HBase集群

Phoenix連接安全模式下的HBase集群

HBase集群開啟安全模式(即啟用kerberos認證)之后,用戶無論是用HBase shell還是Phoenix去連接HBase都先需要通過kerberos認證。如果沒有通過kerberos認證,則hbase shell或phoenix都會報找不到kerberos tgt的錯誤而無法訪問HBase(以下以phoenix為例):

對于HBase shell來說,用戶可以在命令行先用kinit命令(kinit -kt <user keytab> <user principal>)進行認證獲取tgt,然后再進入hbase shell中去建表或者跑查詢。而Phoenix因為沒有像hbase shell這樣一開始就支持kerberos認證,所以Phoenix高低版本之間對HBase的kerberos認證的支持有所差別:

- 3.0及以上版本的Phoenix原生支持連接安全模式的hbase集群

- 3.0以下版本的Phoenix默認不支持連接安全模式的hbase集群

以下分別介紹不同Phoenix版本連接安全模式下HBase集群的方法。

Phoenix 3.0及以上版本連接安全模式下的HBase集群

Phoenix從3.0版本開始增加了連接安全模式下的HBase集群的支持,連接安全模式的HBase集群的JDBC URL格式如下:

jdbc:phoenix:<quorom>:<port>:[zk_rootNode]:<principal>:<keytab>

(參數里的quorom是zookeeper節點列表,port是zookeeper的端口,zk_rootNode是HBase的zookeeper目錄,principal為hbase用戶的principal,keytab為hbase用戶的keytab文件路徑)

用戶可以用上述JDBC連接串,通過sqlline命令,java代碼或sql連接器去訪問開啟了安全模式的HBase集群(通過上述JDBC連接串去訪問HBase之前,不需要手動去執行kinit命令來獲取tgt)。其使用示例如下:

(測試以HDP 2.6為準<HBase1.2.2,phoenix4.>,CDH或Apache社區版本的HBase的配置也類似)

另外,我們發現如果用kinit命令去手動獲取tgt之后,依然可以通過非kerberos模式下的JDBC連接串(即jdbc:phoenix:<quorom>:<port>:[zk_rootNode] 格式的連)訪問HBase集群,因為當前命令執行的上下文里以及有了kerberos tgt的緩存信息:

Phoenix 3.0以下版本連接安全模式下的HBase集群

對于3.0之前的版本,Phoenix默認是不支持連接安全模式下的HBase集群的。但是,我們可以通過修改phoenix的sqlline腳本并增加一些java參數來使phoenix能夠連接開啟kerberos的HBase集群(只需要增加一些參數,而不必修改phoenix代碼本身)。

需要在sqlline里增加的java參數如下:

- zookeeper的jaas文件路徑

- krb5.conf文件路徑

- 集群配置文件和jar包的路徑,包括:

? ? - hadoop的配置文件路徑

? ? - hbase的配置文件路徑

? ? - hbase jar包的路徑

? ? - zookeeper jar包的路徑

? ? - hadoop auth jar包的路徑

? ? - phoenix-x.x.x.jar的路徑

sqlline腳本最終執行的java命令類似下面:
java -Djava.security.auth.login.config=/etc/zookeeper/conf/zookeeper_client_jaas.conf -Djava.security.krb5.conf=/etc/krb5.conf -cp "/etc/hbase/conf:/usr/hdp/2.4.0.0-169/zookeeper/zookeeper-3.4.6.2.4.0.0-169.jar:/usr/hdp/2.4.0.0-169/hadoop/hadoop-auth-2.7.1.2.4.0.0-169.jar:/usr/hdp/2.4.0.0-169/phoenix/bin/../phoenix-4.4.0.2.4.0.0-169-client.jar:::/etc/hadoop/conf:/usr/hdp/2.4.0.0-169/hadoop/conf:/usr/hdp/2.4.0.0-169/hadoop/lib/*:/usr/hdp/2.4.0.0-169/hadoop/.//*:/usr/hdp/2.4.0.0-169/hadoop-hdfs/./:/usr/hdp/2.4.0.0-169/hadoop-hdfs/lib/*:/usr/hdp/2.4.0.0-169/hadoop-hdfs/.//*:/usr/hdp/2.4.0.0-169/hadoop-yarn/lib/*:/usr/hdp/2.4.0.0-169/hadoop-yarn/.//*:/usr/hdp/2.4.0.0-169/hadoop-mapreduce/lib/*:/usr/hdp/2.4.0.0-169/hadoop-mapreduce/.//*::mysql-connector-java-5.1.17.jar:mysql-connector-java.jar:postgresql-9.3-1101-jdbc4.jar:postgresql.jar:/usr/hdp/2.4.0.0-169/tez/*:/usr/hdp/2.4.0.0-169/tez/lib/*:/usr/hdp/2.4.0.0-169/tez/conf" -Dlog4j.configuration=file:/usr/hdp/2.4.0.0-169/phoenix/bin/log4j.propertiessqlline.SqlLine -d org.apache.phoenix.jdbc.PhoenixDriver -u jdbc:phoenix:ocdpbroker.jcloud.local:2181:/hbase-secure:hbase/ocdpbroker.jcloud.local@ASIAINFO.COM:/etc/security/keytabs/hbase.service.keytab?-n none -p none —color=true —fastConnect=false —verbose=true —isolation=TRANSACTION_READ_COMMITTED

總結一下,需要首先在命令行用kinit命令手動獲取tgt,然后再執行上述的java命令就可以訪問開啟kerberos認證的HBase集群了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容