欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hive的客户端操作(jdbc链接)

程序员文章站 2022-04-23 23:51:56
...

最近在学习hive,今天学到hive的远程连接,以下是我在学习过程中遇到的一些问题,和大家分享一下:

首先,你如果要使用hive的远程连接,你得先开启hive的远程服务:之前我看视频以及一些资料上写的是在命令行输入:hive --service hiveserver 这个命令是基于0.10的版本(好像是),然后我的hive版本是2.2.0的,所以在这里会报错,以下是报错内容:

hive的客户端操作(jdbc链接)

然后我网上查阅了一些资料,发现新版本的命令有变化:

hive --service hiveserver2

以下是执行这条命令的结果显示:

hive的客户端操作(jdbc链接)

至此,我们的远程服务算是开启了。


下面是在本地代码编译器中编写的代码,其中包括一个HiveJDBC的操作utils以及一个HiveJDBC的demo

下面是HIVE

import java.sql.*;

public class HiveJDBCUtils {
    private  static  String driver="org.apache.hadoop.hive.jdbc.HiveDriver";
    private  static String url="jdbc:hive2://hive所在的服务器的ip:10000/default";

    //注册驱动
    {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    //获取链接
    public static Connection getConnnection(){
        try {
            return DriverManager.getConnection(url);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    //释放资源
    public static  void release(Connection conn, Statement st, ResultSet rs){

        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                rs=null;
            }
        }

        if(st!=null){
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                st=null;
            }
        }

        if(conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally {
                conn=null;
            }
        }


    }
}


下面是demo代码:

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class HiveJDBCdemo {
    public static void main(String[] args) {
        Connection conn=null;
        Statement st=null;
        String sql="select * from testhive";
        ResultSet rs=null;


        try {
            conn=HiveJDBCUtils.getConnnection();
            st=conn.createStatement();
            rs=st.executeQuery(sql);
            //处理数据
            while(rs.next()){
                Integer id=rs.getInt(1);
                String name=rs.getString(2);
                System.out.println(id + "           "+name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            HiveJDBCUtils.release(conn,st,rs);
        }

    }
}


当然,如果你没有配置hadoop的core-site.xml文件的话,会报这个错误

User: hadoop is not allowed to impersonate anonymous(hadoop是我的主机名)

所以我们要在hadoop的core-site.xml文件中配置以下内容:

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

将hadoop.proxyuser,hadoop.groups以及hadoop.proxyuser.hadoop.hosts中hadoop字段改为上面报错内容的User:后的用户名,例如我这里是hadoop。

修改完毕之后重启hadoop集群。

然后可以在hive的bin目录下用:./beeline -u 'jdbc:hive2://localhost:10000/userdb' -n hadoop(这里改为你的用户名)  来进行测试,以下是测试成功的界面

hive的客户端操作(jdbc链接)

我这里不知道怎么退出,最后ctrl + c了。

然后再次执行程序

hive的客户端操作(jdbc链接)

得到了正确的结果,和hive中直接select 表返回的结果一样的

hive的客户端操作(jdbc链接)

至此,远程连接hive并执行操作结束,希望能给大家带来帮助。