一、hiveserver2 身份认证

hiveserver2的身份认证采用LDAP,使用LDAP的工具采用开源的apacheDS。

1、apacheDS下载

 

(1)ApacheDS服务:

      下载地址:Downloads — Apache Directory

       最新版本:apacheds-2.0.0.AM26.tar.gz

(2)ApacheDirectoryStudio客户端

     下载地址: Index of /dist/directory/studio 

      由于新版本要求JDK11以上, 使用的是老版本ApacheDirectoryStudio-2.0.0.v20200411-M15-macosx.cocoa.x86_64.dmg

2、apacheDS安装

     在linux服务器安装:

  (1)解压到安装目录


tar zxf apacheds-2.0.0.AM26.tar.gz -C /home/mydev/app/


  (2)启动

        /home/mydev/app/apacheds-2.0.0.AM26/bin/apacheds.sh start

   (3)停用

       /home/mydev/app/apacheds-2.0.0.AM26/bin/apacheds.sh stop

3、ApacheDirectoryStudio安装 

         在PC端点击安装。

         (1) LDAP的概念

               LDAP:Light Directory Access Protocol 轻量级目录访问协议,ldap是一种目录数据库存储方式

               DN:是LDAP数据ID。

                          DN:dc=某公司,dc=com 是一个根节点

                          DN:ou=研发部,dn=某公司,dn=com,表示研发部属于这个DN。

                          DN:uid=某个人,ou=研发部,dn=某公司,dn=com  表示研发部下的某个人。

       (2)配置新的partition,需要重启apacheDS才生效。

       (3)配置用户的密码,一定要点击bind.否则不生效。               

4、hive的配置文件

       (1)hive-site.xml

        cd /opt/module/hive/conf/

<property> <!-- hiveserver2的认证方式 --> <name>hive.server2.authentication</name> <value>LDAP</value> </property> <property> <!-- hiveserver2的认证ldap的地址--> <name>hive.server2.authentication.ldap.url</name> <value>ldap://172.16.0.10:10389</value> </property> <property> <!-- hiveserver2的认证根节点--> <name>hive.server2.authentication.ldap.baseDN</name> <value>ou=test,dc=pingpukj,dc=com</value> </property>

       (2)重启hiveserver2生效

             nohup hive --service hiveserver2

            查看端口验证重启是否成功:netstat -ntulp | grep 10008

5、验证hiveserver2连接

     beeline -u jdbc:hive2://172.16.0.10:10008/default -n agc -p *****

     其中 agc ******就是在apacheds配置的用户名和密码。

    (1)apacheDS、oranger、hadoop用户。

         名称一样的用户,权限都是一一对应的。

          apacheDS里有的用户,在hadoop没有的,可以提交查询任务,但是hdfs权限没有。

二、Jdbc连接 hiveserver2 

    1、jdbc的连接超时

        在jdbc的url里设置

           connectTimeout/loginTimeout:连接超时

           socketTimeout:网络超时

     2、hive的session超时                   

        (1)hive-site.xml

        cd /opt/module/hive/conf/

<property>     <name>hive.server2.session.check.interval</name>     <value>60000</value>   </property>   <property>     <name>hive.server2.idle.operation.timeout</name>     <value>1440000</value>   </property>   <property>     <name>hive.server2.idle.session.timeout</name>     <value>4320000</value>   </property>

     3、hive的参数设置  jdbc:hive2://103.89.185.148:10008/rsr;loginTimeout=300000;connectTimeout=300000;socketTimeout=300000?spark.executor.instances=2;spark.app.name=zyh

    4、java代码示例

package com.pingpukj;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;public class HiveJdbc {    Logger logger = LoggerFactory.getLogger("HiveJdbc");    private  static  String driverName="org.apache.hive.jdbc.HiveDriver";    private  static  String url="jdbc:hive2://*.*.*.*:10008/rsr;loginTimeout=300000;connectTimeout=300000;socketTimeout=300000?spark.executor.instances=2;spark.app.name=zyh;";    private  static  String user="agc";    private  static  String password="***";    public static void main(String[] args) throws Exception {        try {            Class.forName(driverName);        Connection con = DriverManager.getConnection(url, user, password);            String sql = " select count(1) as cnt from rsr.dwd_farmer_info_df";            String sql1 = "desc rsr.dwd_farmer_info_df";        /*String sql2 ="\n" +                "create  external table rsr.tmp_zyh_0509_3\n" +                "(\n" +                "    test_name string\n" +                ")\n" +                "partitioned by (dt string)\n" +                "row format delimited null defined as ''\n" +                "stored as orc\n" +                "location'/user/agc/data/rsr/tmp_zyh_0509_3/'\n" +                "TBLPROPERTIES (\"orc.compress\"=\"SNAPPY\")"; */            PreparedStatement preparedStatement = con.prepareStatement(sql);            //Boolean resultSet1 = preparedStatement.execute(sql2)            // System.out.println(resultSet1.toString());            ResultSet resultSet = preparedStatement.executeQuery();            while (resultSet.next()) {                System.out.println(resultSet.getInt("cnt"));            }            con.close();        }catch(ClassNotFoundException e)        {            e.printStackTrace();            System.exit(1);        }    }}