該向?qū)п槍?duì) Windows 7 和 CentOS 7.2 兩種環(huán)境進(jìn)行編寫,不適用于其他情況崩掘。
Cloudera Manager 集群支持安全模式訪問(wèn)琴儿,集成了基于Kerberos 5的身份認(rèn)證和TLS(傳輸層加密)。Kerberos認(rèn)證需要向服務(wù)端提交有效的認(rèn)證信息纺酸,Windows用戶以密鑰文件+客戶端的形式進(jìn)行認(rèn)證提交嘲碱,CentOS用戶以客戶端的形式進(jìn)行認(rèn)證提交金砍。傳輸層加密,需要客戶端生成公鑰私鑰對(duì)進(jìn)行加解密麦锯,公鑰需要封裝成x509 v3自簽名證書捞魁。
環(huán)境說(shuō)明
- 軟件版本:
- Java SDK 1.8.0+;
- MIT Kerberos 5离咐;
- Eclipse;
- 核心訪問(wèn)方式:Cloudera Impala JDBC;
- Jar包依賴:
Jar包名稱 | 版本 |
---|---|
commons-codec | 1.3 |
commons-collections | 3.2.2 |
commons-configuration | 1.6 |
commons-logging | 1.1.1 |
guava | 11.0.2 |
hadoop-auth | 2.6.0-cdh5.8.2 |
hadoop-common | 2.6.0-cdh5.8.2 |
hive-metastore | 1.1.0-cdh5.8.2 |
hive-service | 1.1.0-cdh5.8.2 |
hive-common | 1.1.0-cdh5.8.2 |
hive-exec | 1.1.0-cdh5.8.2 |
httpclient | 4.2.5 |
httpcore | 4.2.5 |
ImpalaJDBC41 | 2.5.35 |
libfb303 | 0.9.0 |
libthrift | 0.9.0 |
log4j | 1.2.17 |
ql | N/A |
sl4j-api | 1.7.5 |
sl4j-log4j12 | 1.7.5 |
TCLIServiceClient | N/A |
zookeeper | 3.4.6 |
Windows 7 用戶訪問(wèn)
必須理解的術(shù)語(yǔ):
- Impala服務(wù)端:提供Impala查詢轉(zhuǎn)發(fā)的網(wǎng)關(guān)服務(wù)器宵蛀;
- 客戶端:業(yè)務(wù)代碼所運(yùn)行的服務(wù)器昆著,即Windos 7這臺(tái)機(jī)器;
以下信息是你訪問(wèn)集群需要的:
- Impala服務(wù)端IP地址
192.168.1.1
和內(nèi)網(wǎng)全域名v001001.dc1.domain.com
术陶; - 客戶端Kerberos配置文件
krb5.ini
凑懂,內(nèi)容和我們之前配置的krb5.conf
完全一致; - 客戶端Kerberos principal
${USERNAME}/impala_user@DOMAIN.COM
和密碼梧宫,其中${USERNAME}
為Kerberos管理員分配的用戶名接谨; - Impala服務(wù)端連接字符串
jdbc:impala://v001001.dc1.domain.com:21050/${DB_NAME}
,其中${DB_NAME}
是需要訪問(wèn)的數(shù)據(jù)庫(kù)名稱塘匣,示例代碼連接的是default
數(shù)據(jù)庫(kù)脓豪; -
環(huán)境說(shuō)明
中依賴基礎(chǔ)jar包;
Step1. 使用Hosts進(jìn)行域名解析
用管理員方式打開并編輯C:\Windows\System32\drivers\etc\hosts
忌卤,在最后一行添加指定的Impala服務(wù)器域名解析:
192.168.1.1 v001001.dc1.domain.com
點(diǎn)擊保存扫夜,在CMD中進(jìn)行測(cè)試以驗(yàn)證解析是否成功:
ping v001001.dc1.domain.com
如果失敗,請(qǐng)關(guān)閉DNS Client驰徊,并設(shè)置手動(dòng)啟動(dòng):
- 在
開始
->搜索程序和文件
中搜索管理工具
笤闯,并打開; - 雙擊
服務(wù)
并打開棍厂; - 在列表中選擇
DNS Client
右鍵點(diǎn)擊屬性
颗味; -
啟動(dòng)類型
選擇手動(dòng),服務(wù)狀態(tài)
點(diǎn)擊停止
牺弹,并點(diǎn)擊確定
保存浦马;
再在CMD中進(jìn)行ping測(cè)試,驗(yàn)證是否成功:
ping v001001.dc1.domain.com
Step2. 安裝 MIT Kerberos 客戶端
Kerberos客戶端是用于獲取ticket的例驹,只有具有有效的ticket捐韩,用戶才能通過(guò)認(rèn)證進(jìn)行數(shù)據(jù)訪問(wèn)。
-
在線環(huán)境鹃锈,請(qǐng)選擇合適的版本進(jìn)行下載安裝:
- 64位系統(tǒng):http://web.mit.edu/kerberos/dist/kfw/4.0/kfw-4.0.1-amd64.msi 荤胁;
- 32位系統(tǒng):http://web.mit.edu/kerberos/dist/kfw/4.0/kfw-4.0.1-i386.msi ;
64位版本的msi包涵蓋了32位和64位的庫(kù)屎债,但是32位版本的msi包只有32位的庫(kù)仅政。
離線環(huán)境,對(duì)應(yīng)的msi文件存放在用戶手冊(cè)的msis文件夾中盆驹。
雙擊msi包進(jìn)行安裝圆丹;
按照Instructions完成安裝;
安裝完成后點(diǎn)擊Finished躯喇;
在CMD中直接運(yùn)行
kinit
命令辫封,確認(rèn)安裝是否成功 :
kinit
Step3. 新建用于訪問(wèn)服務(wù)的 Kerberos Principal
cdh-master/admin 是我們?cè)谥?Step by Step 實(shí)現(xiàn)基于 Cloudera 5.8.2 的企業(yè)級(jí)安全大數(shù)據(jù)平臺(tái) - Kerberos的整合 中定義的 Kerberos 超級(jí)管理員:
ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user
Step4. 生成驗(yàn)證用的 Ticket
- 把Kerberos配置文件
krb5.ini
硝枉,保存至C:\Windows\krb5.ini
,注意保存格式必須為ANSI倦微,如何保證格式妻味?請(qǐng)使用記事本
軟件進(jìn)行另存,編碼選擇ANSI欣福; - 修改Windows環(huán)境變量:
開始
-計(jì)算機(jī)
- 右鍵選擇屬性
- 點(diǎn)擊高級(jí)系統(tǒng)設(shè)置
- 選擇高級(jí)
選項(xiàng)卡 - 點(diǎn)擊環(huán)境變量
- 在系統(tǒng)變量
中新建KRB5CCNAME
责球,賦值為:C:\Users\${WINDOWS_USER}\krbcc5_${WINDOWS_USER}
,這里的${WINDOWS_USER}
為當(dāng)前登錄Windows的用戶名拓劝; - 通過(guò)MIT Kerberos生成ticket:
- 在
程序
里打開MIT Kerberos Ticket Manager
雏逾; - 點(diǎn)擊
Get Ticket
; -
Principal
填寫test/impala_user@DOMAIN.COM
郑临,Password
填寫對(duì)應(yīng)的密碼栖博;
- 在
- 認(rèn)證是有有效周期的,周期為21小時(shí)牧抵,如果重啟應(yīng)用笛匙,請(qǐng)記得
Renew Ticket
;
Step5. 生成帶客戶端證書的keystore
在Windows客戶端的CMD中執(zhí)行如下命令犀变,生成帶有客戶端JKS證書的keystore文件:
${JAVA_HOME}\bin\keytool -genkeypair -keystore ${JAVA_HOME}\jre\lib\security\impala_jdbc.jks -keyalg RSA -alias impala_jdbc -dname "CN=${IMPALA_CLIENT_FQDN},OU=Bigdata,O=Domain,L=Hangzhou,ST=Zhejiang,C=CN" -storepass ${KEYSTORE_PASS} -keypass ${KEYSTORE_PASS}
JAVA_HOME # Java根目錄 IMPALA_CLIENT_FQDN # Windows客戶端全域名妹孙; KEYSTORE_PASS # Keystore文件的存儲(chǔ)密碼,牢記获枝;
Step6. 使用Java SDK進(jìn)行數(shù)據(jù)訪問(wèn)(以Eclipse為例)
創(chuàng)建工程蠢正,并引入上文環(huán)境說(shuō)明
中提到的jar包,jar包存放在用戶手冊(cè)的jars文件夾下省店;
示例代碼如下嚣崭,訪問(wèn) default 數(shù)據(jù)庫(kù)的hosts表,查詢前10行數(shù)據(jù)懦傍,這里的${KEYSTORE_PASS}
是生成keystore時(shí)指定的密碼雹舀,表 hosts
請(qǐng)讀者自己進(jìn)行創(chuàng)建和創(chuàng)建測(cè)試數(shù)據(jù):
package com.domain.bigdata.demo.impala.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.cloudera.impala.jdbc41.*;
public class impalaConnector {
public static void main(String[] args) throws Exception {
Connection conn = null;
ResultSet rs = null;
Statement stmt = null;
try {
Class.forName("com.cloudera.impala.jdbc41.Driver");
conn = DriverManager .getConnection("jdbc:impala://v001001.dc1.domain.com:21050/default;"
+ "AuthMech=1;"
+ "SSL=1;"
+ "AllowSelfSignedCert=1;"
+ "CAIssueCertNameMismatch=1;"
+ "KrbHostFQDN=v001001.dc1.domain.com;"
+ "KrbRealm=DOMAIN.COM;"
+ "KrbServiceName=impala;"
+ "SSLKeyStore=${JAVA_HOME}\jre\lib\security\impala_jdbc.jks;"
+ "SSLKeyStorePwd=${KEYSTORE_PASS};"
+ "LogLevel=5;LogPath=C:\temp\impala_jdbc_demo.log");
String sql = "SELECT * FROM hosts LIMIT 10";
System.out.println(conn.getAutoCommit());
stmt = conn.createStatement();
rs = stmt.excuteQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(2) + "|" + rs.getString(3)
+ "|" + rs.getString(4));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
CentOS 7.2 用戶訪問(wèn)
必須理解的術(shù)語(yǔ):
- Impala服務(wù)端:提供Impala查詢轉(zhuǎn)發(fā)的網(wǎng)關(guān)服務(wù)器;
- 客戶端:業(yè)務(wù)代碼所運(yùn)行的服務(wù)器粗俱,即CentOS 7.2這臺(tái)機(jī)器说榆;
以下信息是你訪問(wèn)集群需要的:
- Impala服務(wù)端IP地址
192.168.1.1
和內(nèi)網(wǎng)全域名v001001.dc1.domain.com
; - 客戶端Kerberos配置文件
krb5.conf
寸认,內(nèi)容和我們之前配置的krb5.conf
完全一致签财; - 客戶端Kerberos principal
${USERNAME}/impala_user@DOMAIN.COM
和密碼,其中${USERNAME}
為Kerberos管理員分配的用戶名偏塞; - Impala服務(wù)端連接字符串
jdbc:impala://v001001.dc1.domain.com:21050/${DB_NAME}
唱蒸,其中${DB_NAME}
是需要訪問(wèn)的數(shù)據(jù)庫(kù)名稱,示例代碼連接的是default
數(shù)據(jù)庫(kù)灸叼; -
環(huán)境說(shuō)明
中依賴基礎(chǔ)jar包神汹;
Step1. 使用Hosts進(jìn)行域名解析
用管理員方式(sudo)打開并編輯/etc/hosts sudo vim /etc/hosts
庆捺,在最后一行添加指定的Impala服務(wù)器域名解析:
192.168.1.1 v001001.dc1.domain.com
點(diǎn)擊保存,測(cè)試以驗(yàn)證解析是否成功:
ping v001001.dc1.domain.com
Step2. 安裝 MIT Kerberos 客戶端
Kerberos客戶端是用于獲取ticket的慎冤,只有具有有效的ticket疼燥,用戶才能通過(guò)認(rèn)證進(jìn)行數(shù)據(jù)訪問(wèn)。
在線環(huán)境請(qǐng)使用yum安裝:
sudo yum install krb5-devel krb5-workstation -y
離線環(huán)境請(qǐng)使用rpm安裝蚁堤,rpm包存放在用戶手冊(cè)的rpms文件夾下:
sudo rpm -ivh krb5-devel-1.13.2-10.el7.x86_64.rpm
sudo rpm -ivh krb5-workstation-1.13.2-10.el7.x86_64.rpm
安裝完成后使用kinit
命令驗(yàn)證是否成功。
Step3. 新建用于訪問(wèn)服務(wù)的 Kerberos Principal
cdh-master/admin 是我們?cè)谥?Step by Step 實(shí)現(xiàn)基于 Cloudera 5.8.2 的企業(yè)級(jí)安全大數(shù)據(jù)平臺(tái) - Kerberos的整合 中定義的 Kerberos 超級(jí)管理員:
ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user
Step4. 生成驗(yàn)證用的 Ticket
拷貝客戶端配置文件但狭,并覆蓋/etc/krb5.conf
披诗;
在本地通過(guò)kinit生成本地ticket cache:
kinit test/impala_user@DOMAIN.COM
認(rèn)證是有有效周期的,周期為21小時(shí)立磁,如果重啟應(yīng)用呈队,請(qǐng)記得重新kinit
一次;
Step5. 生成帶客戶端證書的keystore
在終端中執(zhí)行如下命令唱歧,生成帶有客戶端JKS證書的keystore文件:
${JAVA_HOME}/bin/keytool -genkeypair -keystore ${JAVA_HOME}/jre/lib/security/impala_jdbc.jks -keyalg RSA -alias impala_jdbc -dname "CN=${IMPALA_CLIENT_FQDN},OU=Bigdata,O=Domain,L=Hangzhou,ST=Zhejiang,C=CN" -storepass ${KEYSTORE_PASS} -keypass ${KEYSTORE_PASS}
JAVA_HOME # Java根目錄 IMPALA_CLIENT_FQDN # CentOS客戶端全域名宪摧; KEYSTORE_PASS # keystore文件的存儲(chǔ)密碼,牢記颅崩;
Step6. 使用Java SDK進(jìn)行數(shù)據(jù)訪問(wèn)
創(chuàng)建工程几于,并引入上文環(huán)境說(shuō)明
中提到的jar包(我們已經(jīng)和用戶手冊(cè)一起提供,存放在jars文件夾下)沿后。和Windows不同的是沿彭,工程的目錄結(jié)構(gòu)需要我們自己組織,結(jié)構(gòu)如下(假設(shè)/home/admin/project
為項(xiàng)目的根目錄尖滚,假設(shè)執(zhí)行代碼的用戶為admin):
- /home/admin/project
- src
- impalaConnector
- impalaConnector.java
- impalaConnector
- bin
- impalaConnector
- impalaConnector.class
- impalaConnector
- lib
-
環(huán)境說(shuō)明
中所有依賴的基礎(chǔ)jar包
-
- src
示例代碼如下喉刘,訪問(wèn) default 數(shù)據(jù)庫(kù)的hosts表,查詢前10行數(shù)據(jù)漆弄,這里的${KEYSTORE_PASS}
是生成keystore時(shí)指定的密碼:
package impalaConnector;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.cloudera.impala.jdbc41.*;
public class impalaConnector {
public static void main(String[] args) throws Exception {
Connection conn = null;
ResultSet rs = null;
Statement stmt = null;
try {
Class.forName("com.cloudera.impala.jdbc41.Driver");
conn = DriverManager
.getConnection("jdbc:impala://v001001.dc1.domain.com:21050/default;"
+ "AuthMech=1;"
+ "SSL=1;"
+ "AllowSelfSignedCert=1;"
+ "CAIssueCertNameMismatch=1;"
+ "KrbHostFQDN=v001001.dc1.domain.com;"
+ "KrbRealm=DOMAIN.COM;"
+ "KrbServiceName=impala;"
+ "SSLKeyStore=${JAVA_HOME}/jre/lib/security/impala_jdbc.jks;"
+ "SSLKeyStorePwd=${KEYSTORE_PASS};"
+ "LogLevel=5;LogPath=/tmp/impala_jdbc_demo.log");
String sql = "SELECT * FROM hosts LIMIT 10";
System.out.println(conn.getAutoCommit());
stmt = conn.createStatement();
rs = stmt.excuteQuery(sql);
while (rs.next()) {
System.out.println(rs.getString(2) + "|" + rs.getString(3)
+ "|" + rs.getString(4));
}
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
}
把示例代碼拷貝至/home/admin/project/impalaConnector/src/impalaConnector
睦裳,并進(jìn)行編譯:
cp impalaConnector.java /home/admin/project/impalaConnector/src/impalaConnector
cd /home/admin/project/impalaConnector/src/impalaConnector
${JAVA_HOME}/bin/javac impalaConnector.java
拷貝class文件到bin目錄下:
cp impalaConnector.class /home/admin/project/impalaConnector/bin/impalaConnector
執(zhí)行代碼:
cd /home/admin/project/impalaConnector/
${JAVA_HOME}/bin/java -cp lib/*:bin impalaConnector.impalaConnector