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

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

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


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

hive --service hiveserver2

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


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


下面是在本地代码编译器中编写的代码,其中包括一个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(这里改为你的用户名)  来进行测试,以下是测试成功的界面


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

然后再次执行程序


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


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

猜你喜欢

转载自blog.csdn.net/a6822342/article/details/80697919