美文网首页大数据运维及安全@IT·互联网
Step by Step 实现基于 Cloudera 5.8.2

Step by Step 实现基于 Cloudera 5.8.2

作者: 大数据之心 | 来源:发表于2017-02-20 01:07 被阅读390次

    该向导针对 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,并设置手动启动:

    1. 开始-> 搜索程序和文件中搜索管理工具,并打开;
    2. 双击服务并打开;
    3. 在列表中选择DNS Client右键点击属性
    4. 启动类型选择手动,服务状态点击停止,并点击确定保存;

    再在CMD中进行ping测试,验证是否成功:

    ping v001001.dc1.domain.com
    

    Step2. 安装 MIT Kerberos 客户端

    Kerberos客户端是用于获取ticket的,只有具有有效的ticket,用户才能通过认证进行数据访问。

    1. 在线环境,请选择合适的版本进行下载安装:

      64位版本的msi包涵盖了32位和64位的库,但是32位版本的msi包只有32位的库。

      离线环境,对应的msi文件存放在用户手册的msis文件夹中。

    2. 双击msi包进行安装;

    3. 按照Instructions完成安装;

    4. 安装完成后点击Finished;

    5. 在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

    1. 把Kerberos配置文件krb5.ini,保存至C:\Windows\krb5.ini,注意保存格式必须为ANSI,如何保证格式?请使用记事本软件进行另存,编码选择ANSI;
    2. 修改Windows环境变量:开始- 计算机- 右键选择属性- 点击高级系统设置- 选择高级选项卡 - 点击环境变量- 在系统变量中新建KRB5CCNAME,赋值为:C:\Users\${WINDOWS_USER}\krbcc5_${WINDOWS_USER},这里的${WINDOWS_USER}为当前登录Windows的用户名;
    3. 通过MIT Kerberos生成ticket:
      • 程序里打开MIT Kerberos Ticket Manager
      • 点击Get Ticket
      • Principal填写test/impala_user@DOMAIN.COMPassword填写对应的密码;
    4. 认证是有有效周期的,周期为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
      • bin
        • impalaConnector
          • impalaConnector.class
      • lib
        • 环境说明中所有依赖的基础jar包

    示例代码如下,访问 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
    

    相关文章

      网友评论

        本文标题:Step by Step 实现基于 Cloudera 5.8.2

        本文链接:https://www.haomeiwen.com/subject/pudswttx.html