该向导针对 Windows 7 和 CentOS 7.2 两种环境进行编写,不适用于其他情况。
Cloudera Manager 集群支持安全模式访问,集成了基于Kerberos 5的身份认证和TLS(传输层加密)。Kerberos认证需要向服务端提交有效的认证信息,Windows用户以密钥文件+客户端的形式进行认证提交,CentOS用户以客户端的形式进行认证提交。传输层加密,需要客户端生成公钥私钥对进行加解密,公钥需要封装成x509 v3自签名证书。
环境说明
- 软件版本:
- Java SDK 1.8.0+;
- MIT Kerberos 5;
- Eclipse;
- 核心访问方式: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 用户访问
必须理解的术语:
- Impala服务端:提供Impala查询转发的网关服务器;
- 客户端:业务代码所运行的服务器,即Windos 7这台机器;
以下信息是你访问集群需要的:
- Impala服务端IP地址
192.168.1.1
和内网全域名v001001.dc1.domain.com
; - 客户端Kerberos配置文件
krb5.ini
,内容和我们之前配置的krb5.conf
完全一致; - 客户端Kerberos principal
${USERNAME}/impala_user@DOMAIN.COM
和密码,其中${USERNAME}
为Kerberos管理员分配的用户名; - Impala服务端连接字符串
jdbc:impala://v001001.dc1.domain.com:21050/${DB_NAME}
,其中${DB_NAME}
是需要访问的数据库名称,示例代码连接的是default
数据库; -
环境说明
中依赖基础jar包;
Step1. 使用Hosts进行域名解析
用管理员方式打开并编辑C:\Windows\System32\drivers\etc\hosts
,在最后一行添加指定的Impala服务器域名解析:
192.168.1.1 v001001.dc1.domain.com
点击保存,在CMD中进行测试以验证解析是否成功:
ping v001001.dc1.domain.com
如果失败,请关闭DNS Client,并设置手动启动:
- 在
开始
->搜索程序和文件
中搜索管理工具
,并打开; - 双击
服务
并打开; - 在列表中选择
DNS Client
右键点击属性
; -
启动类型
选择手动,服务状态
点击停止
,并点击确定
保存;
再在CMD中进行ping测试,验证是否成功:
ping v001001.dc1.domain.com
Step2. 安装 MIT Kerberos 客户端
Kerberos客户端是用于获取ticket的,只有具有有效的ticket,用户才能通过认证进行数据访问。
-
在线环境,请选择合适的版本进行下载安装:
- 64位系统:http://web.mit.edu/kerberos/dist/kfw/4.0/kfw-4.0.1-amd64.msi ;
- 32位系统:http://web.mit.edu/kerberos/dist/kfw/4.0/kfw-4.0.1-i386.msi ;
64位版本的msi包涵盖了32位和64位的库,但是32位版本的msi包只有32位的库。
离线环境,对应的msi文件存放在用户手册的msis文件夹中。
-
双击msi包进行安装;
-
按照Instructions完成安装;
-
安装完成后点击Finished;
-
在CMD中直接运行
kinit
命令,确认安装是否成功 :
kinit
Step3. 新建用于访问服务的 Kerberos Principal
cdh-master/admin 是我们在之前 Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 - Kerberos的整合 中定义的 Kerberos 超级管理员:
ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user
Step4. 生成验证用的 Ticket
- 把Kerberos配置文件
krb5.ini
,保存至C:\Windows\krb5.ini
,注意保存格式必须为ANSI,如何保证格式?请使用记事本
软件进行另存,编码选择ANSI; - 修改Windows环境变量:
开始
-计算机
- 右键选择属性
- 点击高级系统设置
- 选择高级
选项卡 - 点击环境变量
- 在系统变量
中新建KRB5CCNAME
,赋值为:C:\Users\${WINDOWS_USER}\krbcc5_${WINDOWS_USER}
,这里的${WINDOWS_USER}
为当前登录Windows的用户名; - 通过MIT Kerberos生成ticket:
- 在
程序
里打开MIT Kerberos Ticket Manager
; - 点击
Get Ticket
; -
Principal
填写test/impala_user@DOMAIN.COM
,Password
填写对应的密码;
- 在
- 认证是有有效周期的,周期为21小时,如果重启应用,请记得
Renew Ticket
;
Step5. 生成带客户端证书的keystore
在Windows客户端的CMD中执行如下命令,生成带有客户端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文件的存储密码,牢记;
Step6. 使用Java SDK进行数据访问(以Eclipse为例)
创建工程,并引入上文环境说明
中提到的jar包,jar包存放在用户手册的jars文件夹下;
示例代码如下,访问 default 数据库的hosts表,查询前10行数据,这里的${KEYSTORE_PASS}
是生成keystore时指定的密码,表 hosts
请读者自己进行创建和创建测试数据:
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 用户访问
必须理解的术语:
- Impala服务端:提供Impala查询转发的网关服务器;
- 客户端:业务代码所运行的服务器,即CentOS 7.2这台机器;
以下信息是你访问集群需要的:
- Impala服务端IP地址
192.168.1.1
和内网全域名v001001.dc1.domain.com
; - 客户端Kerberos配置文件
krb5.conf
,内容和我们之前配置的krb5.conf
完全一致; - 客户端Kerberos principal
${USERNAME}/impala_user@DOMAIN.COM
和密码,其中${USERNAME}
为Kerberos管理员分配的用户名; - Impala服务端连接字符串
jdbc:impala://v001001.dc1.domain.com:21050/${DB_NAME}
,其中${DB_NAME}
是需要访问的数据库名称,示例代码连接的是default
数据库; -
环境说明
中依赖基础jar包;
Step1. 使用Hosts进行域名解析
用管理员方式(sudo)打开并编辑/etc/hosts sudo vim /etc/hosts
,在最后一行添加指定的Impala服务器域名解析:
192.168.1.1 v001001.dc1.domain.com
点击保存,测试以验证解析是否成功:
ping v001001.dc1.domain.com
Step2. 安装 MIT Kerberos 客户端
Kerberos客户端是用于获取ticket的,只有具有有效的ticket,用户才能通过认证进行数据访问。
在线环境请使用yum安装:
sudo yum install krb5-devel krb5-workstation -y
离线环境请使用rpm安装,rpm包存放在用户手册的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
命令验证是否成功。
Step3. 新建用于访问服务的 Kerberos Principal
cdh-master/admin 是我们在之前 Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 - Kerberos的整合 中定义的 Kerberos 超级管理员:
ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user
Step4. 生成验证用的 Ticket
拷贝客户端配置文件,并覆盖/etc/krb5.conf
;
在本地通过kinit生成本地ticket cache:
kinit test/impala_user@DOMAIN.COM
认证是有有效周期的,周期为21小时,如果重启应用,请记得重新kinit
一次;
Step5. 生成带客户端证书的keystore
在终端中执行如下命令,生成带有客户端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文件的存储密码,牢记;
Step6. 使用Java SDK进行数据访问
创建工程,并引入上文环境说明
中提到的jar包(我们已经和用户手册一起提供,存放在jars文件夹下)。和Windows不同的是,工程的目录结构需要我们自己组织,结构如下(假设/home/admin/project
为项目的根目录,假设执行代码的用户为admin):
- /home/admin/project
- src
- impalaConnector
- impalaConnector.java
- impalaConnector
- bin
- impalaConnector
- impalaConnector.class
- impalaConnector
- lib
-
环境说明
中所有依赖的基础jar包
-
- src
示例代码如下,访问 default 数据库的hosts表,查询前10行数据,这里的${KEYSTORE_PASS}
是生成keystore时指定的密码:
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
,并进行编译:
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
执行代码:
cd /home/admin/project/impalaConnector/
${JAVA_HOME}/bin/java -cp lib/*:bin impalaConnector.impalaConnector
网友评论