Java通过kerberos权限认证集成hive

这篇具有很好参考价值的文章主要介绍了Java通过kerberos权限认证集成hive。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

java通过kerberos权限认证集成hive,并操作hive实现hive库和表、分区表的增删查等功能

1、pom文件中引入hive包

		<dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.7.3</version>
        </dependency>
		<dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-jdbc</artifactId>
            <version>2.1.0</version>
        </dependency>

2、从集群中下载认证过可以登录的keytab文件,以及krb5.conf文件还有core-site.xml、hdfs-site.xml、hive-site.xml、yarn-site.xml放到项目的resources目录下
(xml文件按照自己项目需要下载)
连接kerberos认证hive,java,hive,java,hadoop

3、代码实现文章来源地址https://www.toymoban.com/news/detail-744965.html

package com.example.demo.hive;

import com.beust.jcommander.internal.Lists;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.io.IOException;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

public class HiveUtil {
    private final static Logger logger = LogManager.getLogger(HiveUtil.class);

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
    private static Connection connection = null;

    public static void main(String[] args) {

        connection = getConnection();
        //createDatabase();//创建数据库
        //dropDatabase();//删除数据库
        //createTable();//创建表
        //dropTable();//删除表
        //insertTableData();//插入数据
        descTable();//查看表结构
        //getTableData();//查询表数据
        //loadData();//导入数据

/*        List<LinkedHashMap<String, Object>> tables = querySql("show databases");
        for (LinkedHashMap<String, Object> table : tables) {
            String s = JSONObject.toJSONString(table);
            System.out.println(s);
        }*/

    }

    public static Connection getConnection() {
        System.setProperty("java.security.krb5.conf", "src/main/resources/krb5.conf");
        Configuration config = new Configuration();
        UserGroupInformation.setConfiguration(config);
        try {
            UserGroupInformation.loginUserFromKeytab("hive", "src/main/resources/hive.keytab");
            String driver = "org.apache.hive.jdbc.HiveDriver";
            String jdbc = "jdbc:hive2://192.168.1.110:10000/default;principal=hive/hive@HADOOP.COM";
            String user = "hive";
            String pass = "123456";
            try {
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            try {
                connection = DriverManager.getConnection(jdbc, user, pass);
                System.out.println("连接成功");
            } catch (SQLException e) {
                e.printStackTrace();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return connection;
    }

    public static List<LinkedHashMap<String, Object>> querySql(String sql) {
        // 执行sql
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            return buildListMap(resultSet);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭
            close(resultSet, statement);
        }
        return null;
    }

    /**
     * @Description 功能描述:将resultSet构造为List<Map>
     **/
    public static List<LinkedHashMap<String, Object>> buildListMap(ResultSet resultSet) throws SQLException {
        if (resultSet == null) {
            return Lists.newArrayList();
        }
        List<LinkedHashMap<String, Object>> resultList = new ArrayList<>();
        // 获取元数据
        ResultSetMetaData metaData = resultSet.getMetaData();
        while (resultSet.next()) {
            // 获取列数
            int columnCount = metaData.getColumnCount();
            LinkedHashMap<String, Object> map = new LinkedHashMap<>();
            for (int i = 0; i < columnCount; i++) {
                String columnName = metaData.getColumnName(i + 1);
                // 过滤掉查询的结果包含序号的
                if ("mm.row_num_01".equalsIgnoreCase(columnName)
                        || "row_num_01".equalsIgnoreCase(columnName)) {
                    continue;
                }
                // 去除hive查询结果的mm.别名前缀
                if (columnName.startsWith("mm.")) {
                    columnName = columnName.substring(columnName.indexOf(".") + 1);
                }
                Object object = resultSet.getObject(columnName);
                map.put(columnName, object);
            }
            resultList.add(map);
        }
        return resultList;
    }


    /**
     * 创建hive数据库
     */
    public static void createDatabase() {
        //创建hive库时指定location
       /* create database if not exists hive_user_location
        location "/user/hive/hive_location_db"
        with dbproperties ('createby'='linda');*/

        String sql = "create database if not exists test_db";
        System.out.println("创建数据库,脚本:"+sql);
        try (Statement statement = connection.createStatement()) {
            statement.execute(sql);
            System.out.println("创建数据库成功");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建表
     */
    public static void createTable() {
        //创建分区表
        //String sql = "create table user_partition(deptno int, dname string) partitioned by (month string) row format delimited fields terminated by '\t'";
        String sql = "create table user_tb(id int, name string) row format delimited fields terminated by ','";
        logger.info("创建表,脚本:{}", sql);
        try (Statement statement = connection.createStatement()) {
            statement.execute(sql);
            logger.info("创建表成功");
        } catch (SQLException e) {
            logger.error("创建表出错", e);
        }
    }

    /**
     * 查看表结构
     */
    public static void descTable() {
        /***
         * 查看表已有分区信息
         *  show partitions 表名;
         */
        String sql = "desc  formatted  user_partition";// 查看分区表结构:desc  formatted  user_tb;
        System.out.println("查看表结构,脚本:"+sql);
        try {
            Statement statement = connection.createStatement();
            ResultSet rs = statement.executeQuery(sql);
            while (rs.next()) {
                logger.info("字段名:{},类型:{}",rs.getString(1),rs.getString(2));
            }
        } catch (SQLException e) {
            logger.error("查看表结构出错", e);
        }
    }

    /**
     * 查询表数据
     */
    public static void getTableData() {
        Date date = new Date();
        String month = sdf.format(date);
        //查看分区表数据
        //String sql = "select * from user_partition where month='"+month+"'";
        String sql = "select * from user_tb where id=1";
        System.out.println("查看表数据,脚本:"+sql);
        try {
            Statement statement = connection.createStatement();
            ResultSet rs = statement.executeQuery(sql);
            while (rs.next()) {
                logger.info("字段名:{},数据:{}",rs.getString(1),rs.getString(2));
            }
        } catch (SQLException e) {
            logger.error("查看表数据出错", e);
        }
    }

    /**
     * 删除表
     */
    public static void dropTable() {
        String sql = "drop table if exists user_tb";
        logger.info("删除表,脚本:{}", sql);
        try (Statement statement = connection.createStatement()) {
            statement.execute(sql);
            logger.info("删除表成功");
        } catch (SQLException e) {
            logger.error("删除表出错", e);
        }
    }

    /**
     * 删除数据库
     */
    public static void dropDatabase() {
        String sql = "drop database if exists test_db";
        logger.info("删除数据库,脚本:{}", sql);
        try (Statement statement = connection.createStatement()) {
            statement.execute(sql);
            logger.info("删除数据库成功");
        } catch (SQLException e) {
            logger.error("删除数据库出错", e);
        }
    }

    /**
     * 插入数据
     */
    public static void insertTableData() {
        Date date = new Date();
        String month = sdf.format(date);
        //插入分区表数据
        //String sql = "insert into table  user_partition partition(month='"+month+"') values (1,'分区数据')";
        String sql = "insert into table user_tb values (1,'张三')";
        logger.info("插入数据,脚本:{}", sql);
        try (Statement statement = connection.createStatement()) {
            statement.execute(sql);
            logger.info("插入数据成功");
        } catch (SQLException e) {
            logger.error("插入数据出错", e);
        }
    }
    /**
     * 导入数据,data.txt中的数据为格式为:<br>
     * 1,张三<br>
     * 2,李四
     */
    public static void loadData() {
        String sql = "load data local inpath '/home/data.txt' overwrite into table user_tb";
        logger.info("导入数据,脚本:{}", sql);
        try (Statement statement = connection.createStatement()) {
            statement.execute(sql);
            logger.info("导入数据成功");
        } catch (SQLException e) {
            logger.error("导入数据出错", e);
        }
    }

    /**
     * 关闭对象 传入多个时注意顺序, 需要先关闭哪个就传在参数前面
     * @param objs 对象动态数组
     */
    public static void close(Object... objs) {
        if (objs == null || objs.length == 0) {
            return;
        }
        for (Object obj : objs) {
            if (obj instanceof Statement) {
                try {
                    ((Statement) obj).close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (obj instanceof ResultSet) {
                try {
                    ((ResultSet) obj).close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (obj instanceof Connection) {
                try {
                    ((Connection) obj).close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

到了这里,关于Java通过kerberos权限认证集成hive的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kafka配置Kerberos安全认证及与Java程序集成

    本文主要介绍在 Kafka 中如何配置 Kerberos 认证,以及 java 使用 JAAS 来进行 Kerberos 认证连接。 本文演示为单机版。 查看 Kerberos 版本命令: klist -V 软件名称 版本 jdk 1.8.0_202 kafka 2.12-2.2.1 kerberos 1.15.1 Kerberos 是一种由 MIT(麻省理工大学)提出的网络身份验证协议,它旨在通过使用密

    2024年01月22日
    浏览(50)
  • dbever连接kerberos认证的hive

    下载地址:https://web.mit.edu/kerberos/dist/index.html 安装:下一步或者自定义安装即可 安装后会自动生成配置文件:C:ProgramDataMITKerberos5krb5.ini 向管理员要krb5.conf配置文件,将krb5.conf配置文件的内容覆盖到C:ProgramDataMITKerberos5krb5.ini里 创建路径:C:temp 配置环境变量: ps:C:te

    2023年04月12日
    浏览(68)
  • 关于Java连接Hive,Spark等服务的Kerberos工具类封装

    idea 本地配置,连接服务器;进行kerberos认证,连接hive、HDFS、Spark等服务注意事项: 本地idea连接Hadoop,需要在本地安装Hadoop的window工具 hadoop-3.1.1-winutils-master ,配置环境变量 配置hosts主机名映射 kerberos认证需要在idea工作目录所在的磁盘的根目录下创建对应的文件夹把keytab放

    2024年02月13日
    浏览(50)
  • 用户认证-Kerberos的介绍和使用(Hadoop、Hive、数仓流程、Presto、Kylin集成配置)

    概述 Kerberos是一种计算机网络认证协议,用来在非安全网络中,对个人通信以安全的手段进行 身份认证 , 它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份 。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用

    2024年02月02日
    浏览(42)
  • 【dbeaver】win环境的kerberos认证和Clouders/cdh集群中Kerberos认证使用Dbeaver连接Hive、Impala和Phoenix

    1.1 下载安装MIT KERBEROS客户端 MIT KERBEROS 下载较新的版本即可。 下载之后一路默认安装即可。 注意:不要修改软件安装位置。 修改系统环境变量中的Path。将刚刚的安装路径置顶。(不置顶,也要比 %JAVA_HOME%bin 和 anaconda 相关的高) 使用CMD命令确认下: 1.2 修改 krb5.conf 文件并

    2024年02月02日
    浏览(42)
  • 企业级大数据安全架构(十)DBeaver连接Hive的Kerberos认证配置

    1.配置本地hosts 因为Kerberos认证过程及集群服务中,很多是以主机名的形式进行访问的,所以工作机要设置hosts. 域名映射,我们通过部署CDH的集群的每一台机器都已经配置了host(文件为/etc/hosts),工作机也需要配置window的host文件,如果提示无法修改,一般是需要管理员权限的原

    2024年02月21日
    浏览(35)
  • Java SpringBoot集成WebSocket根据登陆权限认证

    Java SpringBoot集成WebSocket

    2024年02月12日
    浏览(34)
  • Java(115)Java通过jdbc接口连接hive3.1.2

    hive版本:3.1.2 jdbc:hive-jdbc-uber-2.6.5.0-292.jar 下载驱动地址:https://github.com/timveil/hive-jdbc-uber-jar/releases/tag/v1.9-2.6.5 CREATE TABLE regre_one.hive2_varchar( ID int, aes varchar(1000), sm4 varchar(1000), sm4_a varchar(1000), email varchar(1000), phone varchar(1000), ssn varchar(1000), military varchar(1000), passport varchar(1000)

    2024年02月05日
    浏览(38)
  • Kerberos安全认证-连载10-Hive Kerberos 安全配置及访问

    目录 1.Hive 配置 Kerberos 2. Hive Cli使用Kerberos ​​​​​​​3. Hive beeline使用Kerberos ​​​​​​​​​​​​​​4. JDBC访问Kerberos认证Hive ​​​​​​​5. Spark访问Kerberos认证Hive ​​​​​​​​​​​​​​6. Flink访问Kerberos认证Hive 技术连载系列,前面内容请参考前面

    2024年02月13日
    浏览(36)
  • Kafka增加安全验证安全认证,SASL认证,并通过spring boot-Java客户端连接配置

    公司Kafka一直没做安全验证,由于是诱捕程序故需要面向外网连接,需要增加Kafka连接验证,保证Kafka不被非法连接,故开始研究Kafka安全验证 使用Kafka版本为2.4.0版本,主要参考官方文档 官网对2.4版本安全验证介绍以及使用方式地址: https://kafka.apache.org/24/documentation.html#secu

    2024年02月01日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包