Java 使用JDBC连接 Hive(HiveClient On JDBC)

来源:互联网 发布:浙江卫视网络在线直播 编辑:程序博客网 时间:2024/05/22 19:09

一、前言

  Hive中有HiveServer和HiveServer2两种服务,这两种服务都是基于Thrift的,但由于HiveServer不能处理多于一个客户端的并发请求(由于HiveServer使用的Thrift接口所导致的限制),且不能通过修改HiveServer的代码进行更正,因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供更好的支持。本文使用HiveServer2为例, 介绍和编写远程操作Hive的Java API。

二、连接Hive

  1. 启动hiveserver2服务

    Hive的安装及配置就不再赘述,连接Hive首先需要启动HiveServer2的服务,执行以下两个命令启动:

    启动metastore

hive --service metastore &

    启动hiveServer2

## 或直接执行hiveserver2hive --service hiveserver2 & 

    启动完成后,可执行netstat -nl |grep 10000 查看hiveserver2是否已经开启

$ netstat -nl |grep 10000tcp        0      0 (你的IP):10000        0.0.0.0:*                   LISTEN

    这证明hiveserver2已经开启。

  2.Java API

    接下来 编写Java API

    首先列出本程序依赖的Jar包:

hadoop-common-2.6.0.jarhive-jdbc-1.0.0.jar 

    注意使用的jar包最好与hadoop和hive的版本相对应,否则可能会报错

    以下是Java代码:

import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException; public class JDBCToHiveUtils {    private static String driverName ="org.apache.hive.jdbc.HiveDriver";   // 此Class 位于 hive-jdbc的jar包下    private static String Url="jdbc:hive2://**.**.**.**:10000/default";    //填写hive的IP,之前在配置文件中配置的IP    private static Connection conn;    public static Connection getConnnection()    {        try               {                  Class.forName(driverName);                  conn = DriverManager.getConnection(Url,"","");        //只是连接hive, 用户名可不传               }        catch(ClassNotFoundException e)  {                   e.printStackTrace();                   System.exit(1);                }         catch (SQLException e) {            e.printStackTrace();        }        return conn;    }    public static PreparedStatement prepare(Connection conn, String sql) {        PreparedStatement ps = null;        try {            ps = conn.prepareStatement(sql);        } catch (SQLException e) {            e.printStackTrace();        }        return ps;    }}


import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; public class QueryHiveUtils {    private static Connection conn=JDBCToHiveUtils.getConnnection();    private static PreparedStatement ps;    private static ResultSet rs;    public static void getAll(String tablename)    {        String sql="select * from "+tablename;        System.out.println(sql);        try {            ps=JDBCToHiveUtils.prepare(conn, sql);            rs=ps.executeQuery();            int columns=rs.getMetaData().getColumnCount();            while(rs.next())            {                for(int i=1;i<=columns;i++)                {                    System.out.print(rs.getString(i));                      System.out.print("\t\t");                }                System.out.println();            }        } catch (SQLException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }     } public static void main(String[] args) {        String tablename="test1";        QueryHiveUtils.getAll(tablename);    } }

  以上就是使用JDBC方式连接Hive 。

三、 使用中遇到的错误

  1. 报错 : user: ** is not allowed to impersonate **

       本地开发时连接Hive时报了这个错误,参考 https://stackoverflow.com/questions/36909002/authorizationexception-user-not-allowed-to-impersonate-user

       可在hive-site.xml中添加

<property> <name>hive.server2.enable.doAs</name> <value>true</value></property>     

    在hadoop的 core-site.xml 中添加

<property>  <name>hadoop.proxyuser.yourusename.groups</name><value>*</value></property><property> <name>hadoop.proxyuser.yourusename.hosts</name> <value>*</value></property>

2. 执行无返回语句

     执行没有返回的语句例如"use test"时, 可使用:

    Connection con = DriverManager.getConnection("jdbc:hive://localhost:10000/default", "", "");    Statement stmt = con.createStatement();## Hive 官方文档上使用 stmt.executeQuery("use test"), 我使用这个会报错 The query did not generate a result set!    stmt.execute("use test");

3. 报错: java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration

    这是因为没有hadoop-common的jar包,引入即可

4. TezTask错误,返回码1

Exception in thread "main" java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask    at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:296)    at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:392)    at HiveJdbcClient.main(HiveJdbcClient.java:40)

  错误号1代表用户认证失败,在连接时必须指定用户名密码,有可能通过服务器设置可以不需要用户认证就可以执行,hadoop默认安装配置用户名密码是hive,hive

5. 使用SpringBoot连接Hive

报错: java.lang.NoSuchMethodError: org.eclipse.jetty.servlet.ServletMapping.setDefault(Z)V

在引入hive-jdbc 的jar包时增加:

<!-- hive jdbc--><dependency>    <groupId>org.apache.hive</groupId>    <artifactId>hive-jdbc</artifactId>    <version>1.0.0</version>    <exclusions>        <exclusion>            <groupId>org.eclipse.jetty.aggregate</groupId>            <artifactId>*</artifactId>        </exclusion>    </exclusions></dependency>

四、参考

  文章参考了:  http://www.cnblogs.com/superAng/p/5939642.html,

  以及Hive 官方wiki

  https://cwiki.apache.org/confluence/display/Hive/HiveClient

  https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC


原创粉丝点击