动态加载hive-jdbc

**

动态加载hive-jdbc

**

应用场景:
由于hive-jdbc的版本一般不具有向下兼容性,所以当我们需要从不同hadoop集群取hive数据的时候,考虑动态去加载不同版本的hive-jdbc驱动。

亲测版本:hive-jdbc-1.1.0
集群版本:CDH5.13.2 (hadoop-2.6.0)
相关jar包:
在这里插入图片描述

package com.zcah.healthScan.common;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.*;
import java.util.*;

        public class SwitchJDBCUtil {
                /**
            * 方法名称 :getCon
            * 创  建  人 :lsy
            * 创建日期 :2018-11-8 17:39:00
            * 功能说明 :获取jdbc的连接对象
            * @return jdbc的连接对象
            */
                public Connection getCon(String url,String driverName,String userName,String password,String dictory) throws Exception{
                //动态加载jar包
                //File file = new File(dictory);
                File file = new File("/usr/local"+dictory);
                System.out.println("hive-jdbc的jar文件在服务器的存储路径:"+file.getPath());
                //得到该目录下的所有的jar文件
                File[] listFiles = file.listFiles();
                //创建一个set集合用于存储驱动文件的url,使得url不能重复
                Set<URL> set = new HashSet<URL>();
                //遍历所有的文件
                for (File file2 : listFiles) {
                File fileTemp=new File(file,file2.getName());
                System.out.println("文件名:"+file2.getName());
                set.add(fileTemp.toURI().toURL());
                System.out.println(fileTemp.toURI().toURL());
        }
        //将集合给转换为数组
        URL[] urls = set.toArray(new URL[20]);
        //单个jar文件加载
        //URLClassLoader loader = new URLClassLoader(new URL[] { file.toURI().toURL() });

        //多个jar文件加载 本地IDEA环境可用 部署到服务器上不可用
        //URLClassLoader loader = new URLClassLoader(urls);

        //服务器上 获取当前线程 调用 上下文类加载器 亲测 可行
        URLClassLoader loader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());

        System.out.println(loader);
        System.out.println(file.toURI().toURL());

        Class cls = loader.loadClass(driverName);
         //实例化driver对象
        Driver driver = (Driver) cls.newInstance();
        Properties info = new Properties();
        info.setProperty("user", userName);
        info.setProperty("password",password);

        //获取连接对象
        Connection connect = null;
                try {
                        connect = driver.connect(url, info);
                } catch (SQLException e) {
                        e.printStackTrace();
                        System.out.println("连接hive失败:"+e.getMessage());
                }
                System.out.println("连接hive成功!");
                return connect;
        }

          /**
     * 方法名称 :通过main方法测试
     * 创  建  人:lsy
     * 创建日期 :2018-11-8 18:00:00
     * 功能说明 :测试连接是否成功
     * @return
     */
        public static void main(String[] args) throws Exception {
        SwitchJDBCUtil jdbc = new SwitchJDBCUtil();
               // HiveQueryResultSet res;
                ResultSet res;
                Connection conn = null;
                Statement stmt = null;
                String sql = "show databases";
                //mysql测试
                //Connection con = jdlc.getCon("jdbc:mysql://192.168.101.194:3306/test", 		  "com.mysql.jdbc.Driver", "root", "root","D:/mysqljar");
                conn  = jdbc.getCon("jdbc:hive2://192.168.101.8:10000/", "org.apache.hive.jdbc.HiveDriver","hive","hive","C:\\Users\\Administrator\\Desktop\\test-hive1.1.0");
                stmt = conn.createStatement();
               //res = (HiveQueryResultSet) stmt.executeQuery(sql);
                res = stmt.executeQuery(sql);
                List<List> list = new ArrayList<>();
                while (res.next()) {
                        System.out.println(res.getString(1));
                }
        }

总结:
个人感觉有三点需要注意:
1.使用动态加载hive-jdbc时,本地porm.xml中需要将hive-jdbc的依赖注释掉!!!否则如果porm中的hive-jdbc版本与集群上的hive版本不匹配的报错信息。
2.测试过程中hive-jdbc所需要的jar包是通过查看hive的maven依赖后手动去本地maven库中取出的,但是maven依赖中并没有看出需要hadoop-client-xxx.jar 和 hadoop-common-xxx.jar (hadoop-client-2.5.2.jar 、hadoop-common-2.6.5.jar)。
3.ClassLoader类加载器的问题:
*多个jar文件加载 本地IDEA环境可用 部署到服务器上不可用
URLClassLoader loader = new URLClassLoader(urls);//服务器上不可用
*服务器上 要获取当前线程 调用 上下文类加载器 亲测 可行
URLClassLoader loader = new URLClassLoader(urls,Thread.currentThread().getContextClassLoader());

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/LSY929981117/article/details/107714001

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hive是一个基于Hadoop的数据仓库工具,它允许用户使用SQL-like语言来进行大数据处理。Hive-2.3.3是Hive的一个版本,它提供了一种新的JDBC驱动程序,这个驱动程序支持新的JDBC4.2 API,提供更完整的JDBC支持。与之前的版本不同,这个新的JDBC驱动程序提供了更好的性能和更高的可伸缩性。它还支持Kerberos身份验证和SSL密,可以更安全地访问Hadoop数据仓库。 使用Hive-2.3.3的JDBC驱动程序,用户可以使用Java编程语言来连接和操作Hive数据仓库。它可以帮助用户编写更灵活、可靠的Hive应用程序,实现更高效的数据分析和处理。此外,这个驱动程序还可以作为其他应用程序的数据源,如BI应用程序和ETL工具。 对于企业级应用程序,这个JDBC驱动程序提供了更好的弹性和可伸缩性,以应对大量数据的处理需求。用户可以使用它进行数据抽取、转换和,从而更好地实现数据集成。 总的来说,Hive-2.3.3的JDBC驱动程序是一个非常有用的工具,它提供了更好的性能、更高的可靠性和更大的可伸缩性,使用户可以更好地处理和分析大数据。 ### 回答2: Hive是一款基于Hadoop的数据仓库系统,可以用于大规模数据存储和分析。而Hive-2.3.3版本的JDBC驱动程序则是提供给Java程序访问和操作Hive数据库的一种工具。 JDBC是Java数据库连接的缩写,是Java语言访问关系型数据库的标准接口。Hive JDBC驱动程序是基于这个接口实现的,通过JDBC接口实现了Hive数据仓库的连接与操作,使得开发者可以使用Java程序对Hive表进行查询、插入、更新、删除等操作。 Hive-2.3.3版本的JDBC驱动程序具有一些新的特性,比如支持Kerberos安全认证、支持HiveServer2协议、支持连接池等。这些新增特性使得Hive-2.3.3 JDBC驱动程序更易用、安全可靠,并能更好地满足各种应用场景的需求。 总之,Hive-2.3.3 JDBC驱动程序是连接Java程序与Hive数据库的一条桥梁,具有重要的作用。通过这个驱动程序,用户可以在Java应用程序中访问和操作Hive数据库,便于数据分析和挖掘,是大数据应用中必不可少的工具。 ### 回答3: Hive-2.3.3 JDBC驱动程序是一个用于连接Apache Hive数据库的Java编程语言接口,它使得程序员能够在Java应用程序中访问Hive数据库。JDBC驱动程序是一种遵循Java Database Connectivity(JDBC)标准的软件组件,它提供了一个标准接口来访问关系型数据库。 Hive是一个基于Hadoop的数据仓库,它允许用户使用类SQL的语言查询和分析存储在Hadoop文件系统中的大规模数据集。Hive可以将结构化数据映射到Hadoop的分布式文件系统中,并提供了类SQL的查询语言HiveQL,允许用户使用HiveQL查询大型数据集。 使用Hive-2.3.3 JDBC驱动程序,程序员能够在Java应用程序中轻松地访问Hive数据库。它提供了一个稳定、高性能的连接对象来管理与Hive的通信,该对象对数据库的基本操作(例如查询和更新)提供支持。此外,JDBC驱动程序还提供了一组API,使得程序员可以自由地构建和执行查询语句,从而进行数据查询和分析。 总之,Hive-2.3.3 JDBC驱动程序是一个重要的工具,它使得Java程序员能够轻松地访问和查询Hive数据库。它提供了一组标准接口,使得程序员可以更轻松地进行数据分析和处理,为企业和组织提供了更快、更有效的数据处理解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值